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

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

// 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,后面仔细想了一下,这样改确实更好一点。若是不改的话,就是维度越多,类似度越小,但这是明显不对的。
相关文章
相关标签/搜索