【译】mahout in action 3.1 Preference对象

一个推荐引擎的输入数据是评分数据:它喜欢什么以及多少。所以,Mahout recommenders的输入数据是一组简单的“userID”,“itemID”,和“评分数据”元组,当然,这是一个大的集合。评分数据有时候会被省略。

[size=large]3.1.1 Preference对象[/size]

Preference是一个最基础的概念,它表现一个单一的userID,itemID和一个评分数据。这个对象表现为一个用户对一个项目的打分。Preference是一个接口,通常使用的实现类为GenericPreference。例如:创建一条记录,user(123),对item(456)的打分是3.0: new GenericPreference(123, 456, 3.0f)。

一组Preferences如何表现?如果你给出了一个合理的答案,如Collection<Preference> 或者 Preference[],大部分情况下,在Mahout APIs中不是这样实现的。Collections和arrays对处理海量Preference对象是无效的。如果你在Java中从未研究过上面的对象,你可能会感到困惑!

单个的GenericPreference包含20个字节的有用数据:一个8字节的user ID(Java long),8字节的item ID(long),4字节的分值(float)。这个对象的存在使GenericPreference包含的字节有惊人的增长:28个字节!这个变化依赖的是JVM的实现;这个数字是从苹果Mac OS X 10.6的64位Java 6 VM 得到的。由于上面的对象和其他线性问题,对这个对象来说,28个字节中包括8字节的参考值,另外20个字节的空格,在对象自身的表现内。由于上面的现象,因此一个GenericPreference对象已经比它需要多消耗了140%的存储。

为什么这么做?在recommender算法中,都需要所有评分数据的集合,这些评分数据是与一个用户或一个项目联系在一起的。在这样一个集合里,user ID或者item ID与所有好像多余的Preference对象将会是配套的。

[size=large]3.1.2 PreferenceArray和实现[/size]

进入PreferenceArray,这个接口的实现表现为一个具有类似与数组的API的分值的集合。例如,GenericUserPreferenceArray表现为一个用户的所有打分.它在内部包括一个单一的user ID,一系列的item IDs,一系列的评分值。在一个用户的所有打分中,需要占用12个字节的内存(一个8字节的item ID和一个4字节的评分值)。把它与需要一个完整的Preference项目的大约48个字节相比较。这个4字节内存,包括对齐这个特殊的实现,
但它也提供了小的性能提升,更小的对象必须被垃圾回收器分配和检查。比较图3.1 and 3.2去理解这些保存是如何完成的。
[img]http://dl.iteye.com/upload/attachment/434749/16daea89-f263-31ec-8cd9-34d4c18aa246.bmp[/img]
图3.1效率较低的评分值的表现,利用一系列的Preference对象。灰色的区域代表上面的对象。白色的区域是数据,它包括引用对象。
[img]http://dl.iteye.com/upload/attachment/434759/02f77a02-9c5d-3d6b-9788-653ca43c54a3.bmp[/img]
图3.2利用GenericUserPreferenceArray更有效的表现

下面的代码表现一个PreferenceArray的典型的构造和使用
列表3.1在一个PreferenceArray中设置评分值
PreferenceArray user1Prefs = new GenericUserPreferenceArray(2); 
user1Prefs.setUserID(0, 1L); //A
user1Prefs.setItemID(0, 101L);
user1Prefs.setValue(0, 2.0f); //B
user1Prefs.setItemID(1, 102L);
user1Prefs.setValue(1, 3.0f); //C
Preference pref = user1Prefs.get(1); //D

A 为所有打分设置user ID
B User 1当前为item 101的打分2.0
C User 1为item 102的打分3.0
D Item 102的一个Preference实现

同样这里存在一个称为GenericItemPreferenceArray的实现,它内部的所有分值,与item关联而不是与user关联。它的目的和用法都是完全类似的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值