协同过滤是用来做推荐的算法
1. 基于用户的协同过滤(UserCF)
(1) 收集用户资料
(2) 最近邻搜索找到相似用户
(3) 计算产生推荐结果
2. 基于物品的协同过滤(ItemCF)
(1) 收集用户资料
(2) 针对物品的最近邻搜索找到相似物品
(3) 计算产生推荐结果
3. 四种求相似度的方法
不管是那种协同过滤,都需要找到相似的物品或用户,有以下4种求相似度的方法
(1) 基于距离计算相似度(欧几里德距离)
通过求高维空间中的点的距离来计算相似度
(2) 基于相关系数计算相似度(皮尔逊相关系数)
皮尔逊相关系数一般用于计算两个变量间联系的紧密程度,它的取值在[-1,+1]之间
(3) 基于夹角余弦计算相似度(Cosine Similarity)
一般用于计算文本之间的相似度
(4) 基于Tanimoto谷本系数计算相似度,也成Jaccard系数,是Cosine相似度的扩展,也用于计算文档数据的相似度
4. 基于物品的协同过滤的计算步骤
(1) 建立物品的同现矩阵
同现矩阵是体现商品相似度的一种方式
(2) 建立用户对物品的评分矩阵
这个评分矩阵中大部分数据为0,因为用户购买的物品是远远小于物品所有的种类的,这样的矩阵称为稀疏矩阵
做推荐的本质就是:把用户的评分从稀疏矩阵变成稠密矩阵,也就是预测用户对没买过的物品的评分,然后取TopN后
(3) 物品的同现矩阵与用户评分矩阵相乘
比如,给用户3推荐物品:
协同过滤的mahout命令格式如下:
MAHOUT_HOME/bin/mahout recommenditembased
# 输入文件的位置
--input <input>
# 输出文件的位置
--output <output>
# 给每个用户推荐物品的数量,如果可推荐的数量小于指定的数量,取可推荐的数量的最大值
--numRecommendations <numRecommendations>
# 设置误差的阈值
--threshold <threshold>
# 选择计算相似度的方法:常用的有以下5种,协同过滤我们选择同现矩阵,可以缩写为-s
--similarityClassname
SIMILARITY_COOCCURRENCE # 同现矩阵
SIMILARITY_TANIMOTO_COEFFICIEN # 谷本系数
SIMILARITY_COSINE # cos余弦夹角
SIMILARITY_PEARSON_CORRELATION # 皮尔逊相关系数
使用mahout提交机器学习相关的内容,需有以下条件:
(1) Hadoop集群(HDFS和YARN)正常启动
(2) Mahout安装在Hadoop集群中的机器上
提交命令:
/opt/mahout-0.10.2/bin/mahout recommenditembased
-s SIMILARITY_COOCCURRENCE
--input /mahout/input/user.txt
--output /mahout/output/
--numRecommendations 5
注意:
(1) 在Linux中,一条命令必须是一行,屏幕中显示不了会自动换行,我们这里为了方便阅读,进行了人为换行
(2) - -input 和 - - output后接的路径都是HDFS的路径
(3) user.txt的内容如下
1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.5
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0
(5) 如果报错内容中出现HDFS路径,比如
Output directory temp/preparePreferenceMatrix/itemIDIndex already exists
那么路径前没有加”/”的都是相对路径,temp/preparePreferenceMatrix/itemIDIndex 其实是 HDFS中的/user/当前登陆的用户名/temp/preparePreferenceMatrix/itemIDIndex,如果报以上错误,删除这个临时文件就可以,也有另外一种办法:提交命令时指定新的临时文件目录(仅适用于本次提交):/opt/mahout-0.10.2/bin/mahout recommenditembased - -tempDir
执行结果:
1 [105:3.875,104:3.7222223,106:3.6]
2 [106:2.9285715,105:2.5833333,107:2.0]
3 [106:3.5,102:3.3333333,103:3.3125]
4 [107:4.75,105:4.3333335,102:4.111111]
5 [107:3.8333333]