协同过滤算法

协同过滤

协同过滤算法核心在于: 1.物以类聚 2.人以群分
其分主要分为两种,1.基于用户 2.基于物品的协同,这也恰好印证物以类聚,人以群分。

人以群分:基于用户的协同推荐

基于用户的协同推荐,其主要工作在于找到人群,即找到相似的人。
那么我们如何判断人与人之间是否相似呢?什么样的人最相似?
以贴吧(之所以以此为例,因为我自己写的一个项目,里面有类似贴吧的这样的一个个论坛)为例,假设用户对论坛的一些操作行为被系统评估为分数,例如在关注+发帖+评论+浏览5分,关注+发帖4分,关注3分,只评论2分,只浏览过1分,那么我们就有了用户对每个贴吧(论坛)的操作分数呢?(当然,这个例子也许存在一些不恰当之处)
假设存在以下几种人和以下几种贴吧,以及他们对贴吧的操作分数。
image.png
回到问题 什么样的人最相似?
我们是不是可以认为对某个贴吧分数越高的人对该贴吧的喜爱程度越高呢?
例如用户A和C都关注了都很喜爱孙笑川吧,同时他俩同样的喜爱航空母舰吧、中国人口吧,同时他们对中国人口吧也很喜爱,那么我们是不是可以认为他们是相似的呢?我认为是可以的。
那么面对大量的用户、贴吧,我们是不可能使用肉眼去观察的!那么怎么判断两个人是否相似呢?
评估相似性有很多的方法。
1、余弦相似度
余弦相似度表明两个向量之间的夹角大小,公式如下

示例:
用户B与C之间余弦相似度度为
image.png
2、欧氏距离
image.png
上述表示n维向量x和向量y之间的距离。其在空间上表示两个向量顶点之间的直线距离。
3、皮尔逊相关系数
其在余弦距离的基础上,对平均做了处理,在该协同过滤中我们可以使用该距离,原因:不同的用户,可能存在不同的行为标准,比如一个用户没有发贴的习惯,但是每天浏览孙笑川吧的帖子,难道你能说他不喜欢孙笑川吧吗?他可能很喜欢,但是他并不喜欢发帖,这就导致我们对他的赋值分数是偏低的,使用该相关系数,我们可以在比较用户相似度时候,引入均值,消除这种差异。
image.png
4、杰卡德距离
该距离由杰卡德相关系数得出,其表示两个集合一样的元素在总元素集合中的占比,更适用于集合相关问题上,不太使用在向量上,杰卡德相关系数公式如下:
image.png
杰卡德距离如下,:
image.png

我们使用皮尔逊相关系数来度量用户之间的相似度,可能你也看见了,在表中,用户A对民科吧分数未知,那么这正是我们要来评估的东西,根据评估结果分数,来判断是否应该推荐。
我们采用前四个吧的分数,让用户A依次与其他用户计算相似度,假设得出B、C与A相似度很高,分别为0.9和0.95,我们可以使用加权平均的方式计算出用户A对民科吧的分数即
$$\frac{(30.9)+(50.95)}{0.9+0.95}$$
当然,以上的相似度都是假设值,与上述表中真实计算出来的并不一致,当我们计算出A对民科吧的分数之后,就可以根据分数来知道是否需要将民科吧推荐给用户A了!

物以类聚:基于物品相似度的协同推荐

未完待续.....