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。