使用eclipse+maven构建简单的mahout项目

原创
2016/10/17 16:44
阅读数 971

搭建mahout的eclipse环境不难,新建一个maven的quick-start java项目,在pom导入一些mahout的依赖即可,具体过程参考:用Maven构建Mahout项目
想要好好理解清楚,需要好好的研究代码。例子中关键几项内容解释

// DataModel,输入数据模型,会自动把数据格式化成mahout需要的数据,更复杂格式的数据应该需要处理。
//类里含有获取所有user id,item id等等方法
DataModel model = new FileDataModel(new File(file));
// 一个用户相似度的模型,类似二维数组,这里使用欧氏距离来计算用户的相似度。类里含有查询某两个user的相似度。
UserSimilarity user = new EuclideanDistanceSimilarity(model);
// 知道用户相似度,即可以知道所有用户的最近邻居,这里求前几个最近邻居。类里含有求某个user id的最近邻居的方法
NearestNUserNeighborhood neighbor = new NearestNUserNeighborhood(NEIGHBORHOOD_NUM, user, model);
// 根据最近邻居看过哪些电影,而当前user没看过,则可以推荐给当前用户某些电影。类里含有求某用户推荐几个电影等等方法。
Recommender r = new GenericUserBasedRecommender(model, neighbor, user);

在使用欧氏距离计算相似度时,有一点点不同。
输入图片说明
开始理解欧氏距离公式是1 / ( 1 + d ),于是我通过手动计算2个用户的欧式距离相似度,和程序里面算得2个用户的相似度不一样(通过user.userSimilarity(1, 2)获得1和2的相似度),于是通过跟踪代码开始找原因:

  • 欧氏距离,只算两个用户都有的维度,比如对比用户1和用户2,维度101,102,103他们都有值,但是1用户104是没有值,所以计算用户1和用户2的欧氏距离,是不算104这一项的,即(33+0.5.05+2.5*2.5)再开根。
  • 欧式距离在mahout实现中EuclideanDistanceSimilarity,公式有所修改,不再是理论上的那个公式了,变成了1.0 / (1.0 + Math.sqrt(sumXYdiff2) / Math.sqrt(n)),Math.sqrt(sumXYdiff2)就是(33+0.5.05+2.5*2.5)再开根,这个时候还需要除以维度的开根,这里维度n=3,后面仔细想了一下,这样改确实更好一点。如果不改的话,就是维度越多,相似度越小,但这是明显不对的。
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部