您的位置:首页 > 理论基础 > 数据结构算法

[mahout in action]mahout中用于推荐引擎的数据结构(二)

2015-08-15 19:17 483 查看
DataModel是在Mahout中封装推荐引擎输入数据的抽象接口。实现类包括GenericDataModel,FileDataModel

mahout中读取数据的方式有很多种,可以分为 手动录入,从file读取,从数据库读取
这里参考 《mahout in action》简单说一下手动录入方式,以及从file读取的方式。从数据库读取可参考API文档

手动
FastByIDMap<PreferenceArray> preferences = new FastByIDMap<PreferenceArray>();
PreferenceArray = prefsForUser1 = new GenericUserPreferenceArray(10);

prefsForUser1 . setUserID(0, 1L);
prefsForUser1 . setItemID(0, 101L);
prefsForUser1 . setValue(0, 3.0f):
prefsForUser1 . setItemID(1, 102L);
prefsForUser1 . setValue(1, 4.5f);
… … ( 8 more )

preferences.put(1L, prefsForUser1);

DataModel model = new GenericDataModel( preferences );


从file读取,这是个经常使用的方法
DataModel model = new FileDataModel(new File(“ratings.csv"));


文件的每一行包括 User ID, item ID, preference value, 用Tab来分割也可以。
压缩格式的文件例如 .zip 或者 .gz 都可以,如果数据特别大的话,用压缩格式是个很好的选择

那么当数据有更新的时候,可以调用 Refreshable 接口的方法, reload data。同时,实践中我们希望更新所有跟这些数据相关的objects,所以一般这样写:

DataModel dataModel = new FileDataModel( new file(“input.csv”);
Recommender recommender = new SlopeOneRecommender(dataModel);
...
recommender.refresh(null);   // refresh datamodel, then itself


refresh的方法是reload,但是如果只有一小部分data需要更改,用refresh显然是效率很低的,所以 FileDataModel支持
update files

update的文件中,可以新增,修改,和删除。例如:
1, 108, 3.0
1, 103,
更新user 1对item 108 的评分为3.0, 删除user 1对item 103的评分

需要update的file要跟原来的data file在同一个文件夹下,命名需要有相同的prefix。
例如原data file 为 foo.txt.gz, 则更新的data file可以是 foo.1.txt.gz, foo.2.txt.gz。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: