如何设计算法能用1-100的数值表示两个用户的相关度/相似度
假设场景是类似豆瓣的基于项目的推荐(Item-based collaborative filtering)。也就是基于用户对项目的打分,来找到两个用户的相关度。
那么怎么样基于这样一个系统,设计一个算法可以用1-100的数值表示两个用户的相关度/相似度呢?
比如用户A,喜欢a,b,c。 用户B喜欢a,d。用户C喜欢b,c
在所有项目权重都一样的前提下,那么直观的理解三个用户的相似度应该是 AC > AB > BC
但是往往在产品中需要一个具体的数值来体现这一关系。希望有经验的朋友谈谈自己的实现方法
Answers
问题理解
楼主的题设有点问题,Item Based 确实是根据用户的打分进行计算的,但计算的不是用户的相似度,而是求物品的相似度。
由于看到后面楼主要求的是类似 AC > AB > BC 这种人与人之间的相似度结果,我这里假设楼主实际想问的是 User Based 协同过滤方法,这种协同过滤才是计算用户相似度的。
关于两种方式哪个更好,可以参考网上诸多的介绍。
解答问题
1、计算两个用户的相似度,不管使用何种度量方式,第一步都是把数据 向量化 ,根据场景,我们可以把A用户向量化为以下格式:
A = (a:1,b:5,c:4,d:0)
B = (a:1,b:0,c:0,d:3)
其中a、b、c是三个维度,后面的数字表示这个维度上的评分,0表示这个维度上没有评分,A和B的总得维度数为他们都看过的电影的并集。
2、有了向量化的数据,计算相似度就很容易了,通常可以使用余弦相似度或欧氏距离来计算,我们这里假设使用余弦相似度:
cos(A,B) = (A与B的内积)/|A||B| (参考预先定理)
结果为:cos(A,B) = 0.0487 ,即预先返回的是一个0到1之间的浮点数,如果需要0到100,可以乘100就行了(虽然没有这个必要)。
题外话
上面的内容只是非常基本的方式,实践中还有非常多需要特殊注意的地方无法一一详述,所以我的回答建议只做实验参考,要实践的话可以先从《集体智慧编程》的第一章开始了解。