做医疗的网站,网页与网站的区别,金环建设集团有限公司官方网站,平面设计线下培训班多少钱原创博客#xff0c;欢迎转载#xff0c;转载请注明#xff1a;http://my.oschina.net/BreathL/blog/62519 最近研究Mahout比较多#xff0c;特别是里面协同过滤算法#xff1b;于是把协同过滤算法的这个实现思路与数据流程#xff0c;总结了一下#xff0c;以便以后对系… 原创博客欢迎转载转载请注明http://my.oschina.net/BreathL/blog/62519 最近研究Mahout比较多特别是里面协同过滤算法于是把协同过滤算法的这个实现思路与数据流程总结了一下以便以后对系统做优化时有个清晰的思路这样才能知道该如何优化且优化后数据亦能正确。 推荐中的协同过滤算法简单说明下 首先通过分析用户的偏好行为来挖掘出里面物品与物品、或人与人之间的关联。 其次通过对这些关联的关系做一定的运算得出人与物品间喜欢程度的猜测即推荐值。 最后将推荐值高的物品推送给特定的人以完成一次推荐。 这里只是笼统的介绍下方便下边的理解IBM的一篇博客对其原理讲解得浅显易懂同时也很详细《深入推荐引擎相关算法 - 协同过滤》我这里就不细讲了。 协同过滤算法大致可分为两类基于物品的与基于用户的区分很简单根据上面的逻辑若你挖掘的关系是物品与物品间的就是基于物品的协同过滤算法若你挖掘的关系是用户与用户间的就是基于用户的协同过滤算法由于它们实现是有所不同所以我分开整理先来看看基于物品的协同过滤实现我自己画了一幅图 我通过数字的顺序来标示数据变化的方向由小到大下面分析下每一个步骤的功能以及实现。 首先说明下两个大的数据源用户偏好数据UserID、ItemID、Preference表示一个对一个物品的喜好程度关系数据ItemIDA(UserIDA)、ItemIDB(UserIDB)、Similarity表示两个人或物品间的相似程度接着一个用户来了我们需要为其推荐得拿到他的身份标示一般是UserID于是 ①. 查找这个用户喜欢过的物品即偏好的产品并查出偏好值后面会用以及还没有喜欢过的商品前者是推荐运算的根据后者作为一个产生推荐的一个集合如② 画的那样。 ②. 这里是一个可扩展的地方我自己理解因为这两部分的数据的作用非常明显修改这两个集合对后面产生的推荐结果可产生非常直观的影响比如清洗过滤或根据用户属性缩小集合不仅使后面推荐效果更优运算性能也可以大幅度提高。 ③. 查找这两个集合之间的关系这是一对多的关系一个没有偏好过的物品与该用户所有偏好过的物品间的关系有一个值来衡量这个关系叫相似度Similarity这个关系怎么来的看蓝色箭头的指向。步骤⑥ ④. 得到这个一对多的关系后就可以计算这个物品对于这个用户的推荐值了图中similarity_i-x表示Item_i 与 Item_x 之间的相似度Item_x是该用户偏好过得该用户对其偏好值记为 value_x 相乘Item_i 与 该用户偏好过的所有物品以此做以上运算后得到的值取平均值 便是 Item_i的推荐值了。注有可能Item_i 不是与所有 该用户偏好过的物品都都存在相似性不存在的不计算即可另外这里方便理解介绍的都是最简单的实现你也可以考一些复杂的数学元素比如方差来判断离散性等。 ⑤. 这步就简单多了刚才对该用户没有偏好过的集合中的所有Item都计算了推荐值这里就会得到一个list按推荐值由大到小排序返回前面的一个子集即可。 ⑥。 前面已经提到关系数据时怎么来的也是根据用户的偏好数据你把其看成一个矩阵横着看过来参考两个Item间的共同用户以及共同用户的偏好的值的接近度这里的可选择的相似度算法很多不一一介绍了前面提到的IBM博客也详细讲解了。 基于物品的协同过滤算法分析完了下面是基于用户的协同过滤算法还是自己画了一幅图 ①. 同样也是查询只是查询的对象不一样了查询的是与该用户相似的用户所以一来直接查了关系数据源。以及相似用户与该用户的相似度。 ②. 与刚才类似也是对数据集的一个优化不过作用可能没那么大。个人感觉 ③. 查询关系数据源得到相似用户即邻居偏好过的物品如步骤④图中由于空间小没有把所有邻居的偏好关系都列出来用……表示。其次还要得到该用户偏好过的物品集合。 ④. 被推荐的Item集合是由该用户的所有邻居的偏好过的物品的并集同时再去掉该用户自己偏好过的物品。作用就是得到你的相似用户喜欢的物品而你还没喜欢过的。 ⑤. 集合优化同基于物品的协同过滤算法的步骤②。 ⑥. 也是对应类似的依次计算被推荐集合中Item_i 的推荐值计算的方式略有不同Value_1_i表示邻居1对Item_i的偏好值乘以该用户与邻居1的相似度 Similarity1若某个邻居对Item_i偏好过就重复上述运算然后取平均值得到Item_i的推荐值。 ⑦、⑧. 与上一个算法的最后两部完全类似只是步骤 ⑧你竖着看判断两个用户相似的法子和判断两个物品相似的法子一样。 详细的实现过程分析完了但Mahout里面的实现时似乎不太考虑查询的成本并非一次全部查出每计算个Item的推荐值查一次你计算5000个就查5000次若数据源都使用的是MySQL的话我有点根儿颤但一次全部查出再计算肯定是个慢查询且查询后的数据不是规则的需要整又添加了计算量若各位有好的优化思路望能分享下先谢过。