关于推荐引擎以及协同推荐的介绍,推荐使用IBM文档库的文章,这篇文章深入地解释推荐引擎的发展历史以及目前的应用场景,还深入介绍了协同算法的数学原理以及Mahout实现,本文只是在这篇文章的基础上记录自己学习学协同推荐算法的笔记。
一、测试数据
测试数据使用用户的购买行为记录表,具体数据如下:
用户ID | 商品ID | 评分 |
1 | 101 | 5 |
1 | 102 | 3 |
1 | 103 | 2.5 |
2 | 101 | 2 |
2 | 102 | 2.5 |
2 | 103 | 5 |
2 | 104 | 2 |
3 | 101 | 2.5 |
3 | 104 | 4 |
3 | 105 | 4.5 |
3 | 107 | 5 |
4 | 101 | 5 |
4 | 103 | 3 |
4 | 104 | 4.5 |
4 | 106 | 4 |
5 | 101 | 4 |
5 | 102 | 3 |
5 | 103 | 2 |
5 | 104 | 4 |
5 | 105 | 3.5 |
5 | 106 | 4 |
二、使用Excel的数据透视表工具,将行列值三列对应的数据转换成为矩阵的形式
101 | 102 | 103 | 104 | 105 | 106 | 107 | |
1 | 5 | 3 | 2.5 | 0 | 0 | 0 | 0 |
2 | 2 | 2.5 | 5 | 2 | 0 | 0 | 0 |
3 | 2.5 | 0 | 0 | 4 | 4.5 | 0 | 5 |
4 | 5 | 0 | 3 | 4.5 | 0 | 4 | 0 |
5 | 4 | 3 | 2 | 4 | 3.5 | 4 | 0 |
三、使用R统计工具,计算出每个用户之间的相似度
编辑函数,根据欧氏距离的公式:
计算用户之间的相似度矩阵。
EuclideanDistanceSimilarity <- function(M) {
row <- nrow(M)
s <- matrix(0, row, row)
for (z1 in 1:row) {
for (z2 in 1:row) {
if (z1 < z2) {
num <- intersect(which(M[z1, ] != 0), which(M[z2, ] != 0)) #可计算的列
sum <- 0
for (z3 in num) sum <- sum + (M[z1, ][z3] - M[z2, ][z3])^2
s[z2, z1] <- length(num)/(1 + sqrt(sum))
if (s[z2, z1] > 1) s[z2, z1] <- 1 #标准化
if (s[z2, z1] < -1) s[z2, z1] <- -1 #标准化
}
}
}
# 补全三角矩阵
ts <- t(s)
w <- which(upper.tri(ts))
s[w] <- ts[w]
s
}
四、使用到的R代码:
data<-read.csv("D:\\学习数据\\协同推荐\\CF_M.csv",header = F);
EuclideanDistanceSimilarity(data);
[,1] [,2] [,3] [,4] [,5]
[1,] 0.0000000 0.6076560 0.2857143 1.0000000 1.0000000
[2,] 0.6076560 0.0000000 0.6532633 0.5568464 0.7761999
[3,] 0.2857143 0.6532633 0.0000000 0.5634581 1.0000000
[4,] 1.0000000 0.5568464 0.5634581 0.0000000 1.0000000
[5,] 1.0000000 0.7761999 1.0000000 1.0000000 0.0000000
五、使用结果,最近临矩阵
top1 top2
[1,] 4 5
[2,] 5 3
[3,] 5 2
[4,] 1 5
[5,] 1 3
六、推荐矩阵(以用户ID为1的用户推荐):
101 102 103 104 105 106 107
4 0 0 0 4.5 0.0 4 0
5 0 0 0 4.0 3.5 4 0
因此,知道了算法的具体显示,即可使用各种程序对协同过滤的数据进行计算了。