Mahout源代码学习(一)数据存储结构

本文介绍了Mahout中用户对商品评价的抽象表示Preference,包括GenericPreference和BooleanPreference。接着详细讲解了PreferenceArray的实现,如GenericUserPreferenceArray和GenericItemPreferenceArray,以及它们在数据模型中的作用。最后,阐述了Mahout的数据模型DataModel,特别是GenericDataModel的结构和成员变量,以及如何通过构造函数将数据组织起来以节省空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.      Preference

Mahout把用户对商品的评价抽象为Preference,Preference为一个接口,实现类有GenericPreference和BooleanPreference,架构图如下:


以GenericPreference为例:

把userID、itemID、和该用户对该商品的打分value封装成一个类。

而BooleanPreference类中没有value值,而getValue()方法直接返回1,说明只要new了这个类就默认表示该用户对该商品是喜爱的,故value返回1。

2.      PreferenceArray

按普通想法,有了Preference这个类封装用户对商品的打分信息后,应该用一个arraylist去记录所有用户对所有商品的打分信息。但其实在mahout的数据模型中是没有用到上面所说的Preference类的。

Mahout中其实是用PreferenceArray类直接记录某个用户对所有商品的打分信息。

PreferenceArray也是个接口,实现类有GenericItemPreferenceArray、GenericUserPreferenceArray、BooleanItemPreferenceArray、BooleanUserPreferenceArray,架构图如下:


还是以GenericUserPreferenceArray为例:

这里id是记录userID,ids[]记录itemIDs,values[]记录该用户对itemIDs的打分,结构如下:


而在GenericItemPreferenceArray中id就记录一个itemID,ids就记录userIDs(代表这个商品被哪些用户喜欢)。

BooleanItemPreferenceArray和BooleanUserPreferenceArray类似,只是没有values数组。

3.      DataModel

以上这些其实都是为最终的存储模型做准备的,mahout工程中对输入数据最终的存储结构式这样的:

Mahout还重新定义了map为FastByIDMap<V>,以FastByIDMap<GenericUserPreferenceArray>为例,从输入数据后形成了如下的存储结构:


其中key就是userID,value就是GenericUserPreferenceArray对象。

这样组织的目的是为了节约空间(有待进一步了解)。

这些数据机构的最终载体就是DataModel接口,具体实现比较复杂,详见下图:


常用的GenericDataModel类就封装了上述的数据结构,具体成员变量有如下几个(都很重要):

         preferenceFromUsers以userID为MAP的key,GenericUserPreferenceArray为value记录用户对商品的打分;

         preferenceFromItems以itemID为MAP的key,GenericItemPreferenceArray为value记录商品被用户打分的分值。

GenericDataModel的构造函数如下:


Timastamps不考虑,可见userData就是FastByIDMap<PreferenceArray> 类(一般传入的PreferenceArray就是以GenericUserPreferenceArray实现的),构造函数的工作主要有两个:1.把传入的userData封装到preferenceFromUsers中。2.把preferenceFromUsers转换到preferenceFromItems中。

另外在GenericDataModel中还定义了很多方法以实现快速获取用户喜好数据或者商品被喜好数据列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值