三分钟了解协同过滤算法
推荐算法最早在1992年就提出来了,因互联网的爆发,越来越多的数据可用,推荐算法就这么火起来了。协同过滤(Collaboration Filtering)算法就是最常用的一种推荐算法。协同过滤算法有两种,分别是基于用户的协同过滤算法(user-based collaboratIve filtering),和基于物品的协同过滤算法(item-based collaborative filtering)。简单的说就是:人以类聚,物以群分。
相似度计算
不论是基于用户还是基于物品,要进行协同过滤,最重要的就是相似度(similarity)的计算。常用的相似度计算有四种,即闵可夫斯基距离、Jaccard系数、余弦相似度和皮尔逊相关系数。问题定义:有两个对象X,Y,都包含n维特征,x=(x1,x2,x3,……..,xn),y=(y1,y2,y3,……..,yn),计算X和Y的相似性。
闵可夫斯基距离
其中r是参数,从公式我们可以看出,
当p==1,“闵可夫斯基距离”变成“曼哈顿距离”。
当p==2,“闵可夫斯基距离”变成“欧几里得距离”。
当p==∞,“闵可夫斯基距离”变成“切比雪夫距离”。
其中,最常用的是欧式距离。准确地说,距离刻画的是相异性,就是数值越大,相似度越低。
Jaccard系数
Jaccard系数是用来处理仅包含非对称的二元属性的对象,定义如下:
余弦相似度
余弦相似度度量的是对象的方向是否一致,未考虑对象的数值。定义如下:
其中,“.”表示向量点积。
皮尔逊相关系数
一般属性之间的相关性计算,定义如下:
这些相似度计算还有不少变体,或者修正过的计算方式,这里就不在赘述。
基于用户的协同过滤算法
简而言之,就是找到和你有相似爱好的其他的用户,然后选取相似度排前K的用户,基于这些用户的爱好,推荐东西给你。举一个最简单的例子,
很明显,A和你的爱好相似,C和你的爱好完全不相似,若取k=1,那么会推荐A的爱好给你,也就是会向你推荐茄子和牛肉。但数据量变大时,找到具体的k个用户是一件很费时的事,为降低计算复杂度,就要用到物品到用户的反查表,很简单,反查表就是喜欢香蕉的有你、A、B,喜欢草莓的有你、B、D,这就可以看出来,和你有关系的用户就只有A和B,D。
通过选择一种相似度计算方式,获得相似度排序,我们假设取k=2,那么算出来最相似的就是A,其次是B。然后通过这K个用户来推荐商品了。但是我们可推荐的商品有茄子、牛肉、玉米、啤酒,但是不能全部都推荐给你,我们需要的就是对这些商品进行计算。假如我们算出来A和你的相似度是80%,B和你的相似度是25%,那么推荐度可以这么来算:
茄子: 1*0.8+1*0.25 = 1.05
牛肉: 1*0.8 = 0.8
玉米: 1*0.25 = 0.25
啤酒: 1*0.25 = 0.25
很明显,我们会首先把茄子推荐给你,其次是牛肉。当然,计算推荐度的方式还有很多,上述只是其中的一种。
算法总结
基于物品的协同过滤算法和基于用户的没有本质区别,只是基于物品是先算物品间的相似度,在上例中,香蕉和苹果的相似度就高于香蕉和草莓的相似度,所以可以初步判断,只要一个用户喜欢香蕉,那么推荐度就是苹果高于草莓。因此,总结算法的步骤如下:
计算其他用户和你的相似度,可以使用反差表忽略一部分用户
根据相似度的高低找出K个与你最相似的邻居
在这些邻居喜欢的物品中,根据邻居与你的远近程度算出每一件物品的推荐度
根据每一件物品的推荐度高低给你推荐物品。
这个算法实现起来比较简单,但是在实际应用中有时候也会有问题的。首先是冷启动的问题,也就是一个用户没有购买任何东西,那么如何去计算相似度?其次是一些非常流行的商品可能很多人都喜欢,这种商品推荐给你就没什么意义了。这些都是推荐系统的脏数据,比如允许用户进行勾选一些感兴趣的商品,或者通过给商品加一个权重或者把这种商品完全去掉,具体处理方式可以参照数据预处理一文。
此文花费了不少功夫,赞赏、点赞、转发都是对作者的认可和支持。