如何使用项目相似性预测用户的偏好?

时间:2015-09-09 08:37:48

标签: machine-learning similarity recommendation-engine collaborative-filtering

考虑到项目与用户对项目的评分之间的相似性,我想是否可以预测用户是否会喜欢某个项目。

我知道协同过滤项目推荐中的等式,预测评级由项目之间的整体评级和相似性决定。

等式是:

enter image description here

http://latex.codecogs.com/gif.latex?r_{u%2Ci}%20%3D%20\bar{r_{i}}%20+%20\frac{\sum%20S_{i%2Cj}%28r_{u%2Cj}-\bar{r_{j}}%29}{\sum%20S_{i%2Cj}}

我的问题是,

  • 如果我使用其他方法(例如基于内容的方法)获得相似性,我还能使用这个等式吗?
  • 此外,对于每个用户,我只有一个用户喜欢的项目列表,而不是评级的实际值。
  • 在这种情况下,用户 u 对项目 j 的评级和项目 j 的平均评分缺失。有没有更好的方法或方程式来解决这个问题?

另一个问题是,我写了一个python代码来测试上面的等式,代码是

mat = numpy.array([[0, 5, 5, 5, 0], [5, 0, 5, 0, 5], [5, 0, 5, 5, 0], [5, 5, 0, 5, 0]])
print mat

def prediction(u, i):
    target = mat[u,i]
    r = numpy.mean(mat[:,i])
    a = 0.0
    b = 0.0
    for j in range(5):
        if j != i:
            simi = 1 - spatial.distance.cosine(mat[:,i], mat[:,j])
            dert = mat[u,j] - numpy.mean(mat[:,j])
            a += simi * dert
            b += simi
    return r + a / b

for u in range(4):
    lst = []
    for i in range(5):
        lst.append(str(round(prediction(u, i), 2)))
    print " ".join(lst)

结果是:

[[0 5 5 5 0]
 [5 0 5 0 5]
 [5 0 5 5 0]
 [5 5 0 5 0]]

4.6 2.5 3.16 3.92 0.0
3.52 1.25 3.52 3.58 2.5
3.72 3.75 3.72 3.58 2.5
3.16 2.5 4.6 3.92 0.0

第一个矩阵是输入,第二个矩阵是预测值,它们看起来不接近,这里有什么不对吗?

2 个答案:

答案 0 :(得分:0)

是的,您可以使用不同的相似度函数。例如,与评级相比的余弦相似性是常见的,但不是唯一的选择。特别是,使用基于内容的过滤的相似性可以帮助使用稀疏评级数据集(如果项目具有相对密集的内容元数据),因为您将用户的偏好映射到较小的内容空间而不是较大的单个项目空间。

如果您只有用户已消费的项目列表(但不是每个项目的偏好幅度),则另一种算法可能更好。尝试市场购物篮分析,例如association rule mining

答案 1 :(得分:0)

您所指的是隐含评级的典型情况(即用户不会对项目给出明确的评级,假设您只是喜欢和不喜欢)。 对于approches,您可以使用邻域模型或潜在因子模型。 我建议你阅读这个paper,它提出了一个众所周知的基于机器学习的解决方案。