协同过滤之Slope One算法

来源:互联网 发布:vue.js中自定义指令 编辑:程序博客网 时间:2024/05/17 03:41

纯笔记,直接从维基百科上翻译过来的:http://en.wikipedia.org/wiki/Slope_One

slope-one算法是基于评分的item-based算法中最简单的一种了,它的思想非常简单,但在很多场合却有很好的效果。但是slope one只适用于有评分的情况,对于二值评分,如商品的有无购买,这种算法是不适用的。

通常的item-based算法是基于用户的评分历史及其他用户对item的评分来预测用户对item的评分的。举个例子,如果一个用户给重塑的专辑评了5分,那么他会不会对PK14同样也评5分呢?

处理这种问题时,我们通常是根据用户的历史评分记录,使用线性回归 f(x) = ax + b来拟合。因此,如果item的数量为1000,那么可能导致有1000000种回归方式,2000000个回归变量。这种方法会造成严重的过度拟合(因为回归是基于用户自身的),除非我们选择那些许多用户有共同评分的item来进行计算(即协同过滤)。

另外一种方法是,我们把回归直线简化成 f(x) = x + b。这样就只剩一个回归变量了(slope one)。

slope one算法解释:

假设有A,B两位用户,他们对item I,J的评分如下:

用户A对I和J均有评分,用户B只对I有评分,现在需要预测用户B对J的评分。

使用slope-one算法,结果很简单:用户A对I和J的评分差为:1.5 - 1 = 0.5,因此用户B对J的评分 = 2 + 0.5 = 2.5


再看另一个例子:

CustomerItem 1Item 2Item 3A532B34?C?25在这个例子中,用户A和B对item1,2的评分平均差为: (2 + (-1)) / 2 = 0.5,也就是说,item 1平均获得比item 2高0.5的评分。类似地,item 3和item 1的评分差为3。因此,假如我们根据C对item 2的评分历史来预测他对item 1的评分,结果为2 + 0.5 = 2.5。如果我们用她对item 3的评分来预测item 1,则结果为5+3=8。

在这种情况下,用户对多个item都有评分历史,我们只需要简单地根据对同一个item共同评分的用户数做一个加权平均即可。这里总共有2位用户同时对item1和item2做过评分,有一位用户同时对item2和item3做过评分,因此C对item 1的评分为:

(2 * 2.5 + 1 * 8) / (2 + 1) = 4.33

给定n个item,slope one在实现上只需要计算和存储item间的平均分差以及共同评分的用户数,总共有n*n对item。

算法复杂度:

若有n个item,m个用户,以及N个评分,则每两个item之间的平均分差,需要n*(n-1)/2的单位存储,以及最多m*n*n次计算。若用户最多对y个item有评分,则计算平均分差的时间复杂度为 n*n + m*y*y。若一个用户有x个评分,则预测一次评分需要x次计算,预测用户的所有评分需要(n-x)*x次计算。

一种精简空间的方法是划分数据(个人理解是,将评分数据根据item进行存储)或使用稀疏存储,即忽略没有共同评分的数据。

原创粉丝点击