mahout协同过滤算法
一直使用mahout的RowSimilarity来计算物品间的相似度,今晚仔细看了其实现,终于搞明白了他的计算逻辑。
上篇中介绍了整个itemBaseCF的mapreducer过程,主要有三个大的步骤吧,我把他称为prepare阶段,计算相似阶段和利用相似性计算推荐阶段。
prepare阶段主要完成的是矩阵转换变换以及统计一些相似及推荐时用到的一些属性。
第二阶段是计算相似性:有几个数据较为重要,如下所示。
- norms.bin:是用来存放所有用户对一个商品的平方和,数据存储为itemA:double
- numNonZeroEntries.bin:存放itemID对应的不为零的用户评分个数
- maxValues.bin:最大的那个用户评分
之后经过一次矩阵的转置以userID为行itemID为列,计算一个用户评分过的所有商品的乘积,(一个自循环计算其与其他商品评分的乘积)
接下来就是计算相似度了,以欧氏距离为例:d = sqrt( (x1-x2)x1+(y1-y2)^2+(z1-z2)^2 )...三维空间中的算法
他是和x12+x22+y12+y22+z12+z22-2(x1*x2+y1*y2+z1*z2)...同理扩展到多维空间中,而mahout中的相似度算法就是这么搞的,先统计所有用户对此商品(A)的评分的平方和,然后在计算所有用户对此商品(A)与要计算相似的商品(B)的所有乘积之和,这样计算相似时直接获取以上结果,也就是平方和减去2倍的乘积之和,再开方。最后转化成相似的表示形式【1/(1+d)】。完成相似度的计算。
太晚了明天继续预测评分。
====================================================================================================================
接着昨天的,下面是预测评分。
经过前面两步的工作已经将以user为key的矩阵写入userVectors目录下,而相似矩阵也已经有了,下面应该是将用户A已经评过分的商品的相似商品找出来,这些就应该是要推荐的备选商品了。现在要根据相似度预测备选商品的评分了。
- 利用相似矩阵和用户的评分数据,得到以下形式的数据结构:
user1 | pref1 | similarityColumn1 |
user1 | pref2 | similarityColumn2 |
user2 | ... | ... |
在程序里也就是以userID为key,value为PrefAndSimilarityColumnWritable的Vector,这样就得到,某个用户评过分的商品评分和与其相似的商品的矩阵,这些就是为此用户做推荐的备选商品。下一步就是预测这些商品的评分,有个细节就是在此就已经过滤掉此用户已经评过分的商品,也就是预测评分时评过分的商品不会出现在推荐列表中,以上图第一行为例,mahout是采用将similarityColumn1中pref1评分的商品的相似度设置为Double.NAN,这很巧妙,NAN的话以后进行任何计算得出的结果都是NAN,也就不会出现在最后的推荐列表中了。预测评分采用的也是简单(相似向量*评分再做加权)/(相似向量加权),mahout为了减少预测次数,他是只预测某个商品在这些similarityColumn的中出现两次以上的。
最后的推荐列表是推预测的商品做个倒排序,推荐列表就生成了。
mahout协同过滤算法的更多相关文章
- mahout协同过滤算法各接口
Mahout协同过滤算法 Mahout使用了Taste来提高协同过滤算法的实现,它是一个基于Java实现的可扩展的,高效的推荐引擎.Taste既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供 ...
- 012_流式计算系统(Mahout协同过滤)
课程介绍 课程内容 1.Mahout是什么 l Mahout是一个算法库,集成了很多算法. l Apache Mahout 是 Apache Software Foundation(ASF)旗下的 ...
- Mahout实现基于用户的协同过滤算法
Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法. 基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐. 图片来源 程序 ...
- win7下使用Taste实现协同过滤算法
如果要实现Taste算法,必备的条件是: 1) JDK,使用1.6版本.需要说明一下,因为要基于Eclipse构建,所以在设置path的值之前要先定义JAVA_HOME变量. 2) Maven,使用2 ...
- SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高
1.背景知识 在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法.这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐.其公式为:
- GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法
GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理 ...
- Spark机器学习之协同过滤算法
Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...
- Collaborative Filtering(协同过滤)算法详解
基本思想 基于用户的协同过滤算法是通过用户的历史行为数据发现用户对商品或内容的喜欢(如商品购买,收藏,内容评论或分享),并对这些喜好进行度量和打分.根据不同用户对相同商品或内容的态度和偏好程度计算用户 ...
- 【机器学习笔记一】协同过滤算法 - ALS
参考资料 [1]<Spark MLlib 机器学习实践> [2]http://blog.csdn.net/u011239443/article/details/51752904 [3]线性 ...
随机推荐
- Android:修改版本
修改AndroidManifest.xml下的Version即可 <uses-sdk android:minSdkVersion="14" android:targetSdk ...
- 转:Android 获取Root权限
来自:http://blog.csdn.net/twoicewoo/article/details/7228940 import java.io.DataOutputStream; import an ...
- 通过AOP 实现异常统一管理
package com.zhang.shine.cache; import java.lang.reflect.Method; import org.aspectj.lang.ProceedingJo ...
- OpenCV码源笔记——Decision Tree决策树
来自OpenCV2.3.1 sample/c/mushroom.cpp 1.首先读入agaricus-lepiota.data的训练样本. 样本中第一项是e或p代表有毒或无毒的标志位:其他是特征,可以 ...
- bootstrap 3.x笔记
布局容器 Bootstrap 需要为页面内容和栅格系统包裹一个 .container 容器.我们提供了两个作此用处的类.注意,由于 padding等属性的原因,这两种 容器类不能互相嵌套. .cont ...
- 内存泄露了么: Handlers & Inner Classes
看到一篇关于handler和匿名类关于内存泄露的文章,觉得不错,充分发挥拿来主义,先放这儿看着! From:http://www.androiddesignpatterns.com/2013/01/i ...
- Drawable(4)LevelListDrawable
Levellist 显示时不像scale list 或 layout list那样要用代码设置一下,可以直接显示.改变level时才用代码. res:level_list.xml <?xml v ...
- const和readonly的区别
http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html http://www.codeproject.com/Tips/803 ...
- Ubuntu下MySQL数据库安装与配置与卸载
安装: sudo apt-get install mysql-server mysql-client 一旦安装完成,MySQL 服务器应该自动启动.您可以在终端提示符后运行以下命令来检查 MySQL ...
- fzu Problem 2148 Moon Game(几何 凸四多边形 叉积)
题目:http://acm.fzu.edu.cn/problem.php?pid=2148 题意:给出n个点,判断可以组成多少个凸四边形. 思路: 因为n很小,所以直接暴力,判断是否为凸四边形的方法是 ...