CWYAlpha

Just another WordPress.com site

Thought this was cool: 推荐系统几个算法的movielens结果比较

leave a comment »


本文用movielens-100k数据包中的5组数据对一些基本的推荐系统算法做了测试,为了节省测试时间,我用了最小的数据集。当然也做了大一些的数据集,但并没有做全部测试,所以只展示小数据集的结果如下:

 (数据包括:1682 items ,943 users,100,000 ratings)

行表示算法,

列表示数据集,

值表示RMSE。

   Latent Factor Model  user-based kNN(Cosine)  user-based kNN(Pearson)   user-based kNN(CorrectCosine)  Slope One 
 data1  0.9263  0.9706  1.3620  0.9645  1.2511
 data2  0.9156  0.9589  1.2766  0.9541  1.2780
 data3  0.9141  0.9539  1.3601  0.9519  1.2402
 data4  0.9173  0.9473  1.5162  0.9484  1.2097
 data5  0.9182  0.9507  1.6093  0.9551  1.2369

 关于结果的几点说明:

(1)因为这个数据集中的item比943多将近一倍,所以采用了user-based kNN。item-based kNN和user-based kNN算法对于程序实施起来差不多,基本上将user-item matrix转置成item-user就好了。

(2)用Pearson相关法计算用户之间的相似度,得到的结果很差。其实用Pearson相关法计算相似度,需要满足一些基本条件,比如数据之间必须是线性的,残差相互独立。但对于实际的系统,这些条件往往不能被满足。所以结果会差一些。

(3)Latent Factor Model算法中,有几个比较重要的参数。

  • 学习速率:关系到迭代的步长,如果过大的话很有可能在沿着梯度方向寻找局部最优解的时候会跨过最优的那个解;如果非常小的话,迭代次数就会非常多,收敛的比较慢。因此,学习速率的初值可以选的稍微大一些,每次迭代缩小一点点,比如让学习速率=学习速率*0.9。我在计算的时候取了0.005.
  • 特征矩阵维度k:矩阵分解的思路是将rating矩阵分解成两个矩阵,一个user的特征矩阵,一个item的特征矩阵。矩阵的特征维度代表了保留信息的多少。k越大保留原矩阵信息越多,但降维的优点就体现不出来了;k越小,保留的信息越少,预测的结果就会越差。所以k也是一个重要参数。我在计算的时候取了100.
  • 正则化因子:为了避免掉过拟合问题,在损失函数中加了一项正则化项,因此这个正则化因子会很影响最后的结果,选择起来也是个麻烦事情。如果你选的太小,正则化效果很差,过拟合问题就会很突出,即使你在某一组数据中计算的非常理想,那么你在其他的数据中也很有可能不会得到比较理想的结果;如果你选的太大,正则化效果出来了,但是欠拟合问题也随之而来了,计算结果会变得非常差。这里,我选择的是0.004.
  • user特征矩阵和item特征矩阵的初值:迭代计算需要一个初值,矩阵分解是个NP问题,所以我们得不到全局最优解,只能从初值开始,沿着梯度向下走,寻找这组初值对应的局部最优解,但初值的选择会影响到你得到的局部最优解的效果,它可能不太优也可能非常优,anyway,谁又知道呢?所以,用一些随机数作为初值,多计算几次做过平均是个比较好的办法,可以尽量地避免掉进不太优的局部最优解中。这里我用的是0.1*rand(0,1)/sqrt(k),这个参数是从别人那里学来的,效果不错 。还有一种思路是用所有用户已知评分的平均值来分配给初值,不过效果不如这个参数。
(4)从结果可以很清晰地看出,矩阵分解的算法效果最好,其次是用修正的余弦公式做相似度计算的knn算法,然后是余弦公式做相似度计算的knn,然后是slope one,最后是可怜的皮尔逊相关法做相似度计算的knn。这几个算法中,矩阵分解的方法最不好解释,有点半透明箱的意思(相对于神经网络那种黑箱);knn算法最好解释,也最好理解,而且中间的很多结果对于实际的系统都非常有意义,比如,用户的相似度矩阵,用户的k个最近邻,都是非常有意义的结果;slope one是一种item-based类型的算法,效果不是很好,我觉得和item多于user有比较大的关系。
(5)在计算的过程中,矩阵分解的算法计算速度最快,不到40次就可以迭代最优结果,而且速度非常快;其次就是slope one,最慢的是knn,因为要计算庞大的相似度矩阵。
(6)计算之前的数据统计分析非常重要,用slope one的时候,在给每个没有值的item寻找有共同评分的item会时我发现了有的item竟然没有任何一个item和它有共同的评分,导致计算失败。所以计算之前,一定要把数据中的bug数据清除掉。在实际的推荐系统算法中,在计算之前要先把一些比较hot的item拿掉,同时也要把一些数据非常非常少的user拿掉(这些user有可能是僵尸哦!!!)否则的话计算的时候就会出现过拟合的情况甚至出现计算中的bug现象。
以上我是个人的一些看法,仅供参考,欢迎批评指正。

from 阿俊的博客: http://somemory.com/myblog/?post=27

Written by cwyalpha

五月 22, 2012 在 3:24 上午

发表在 Uncategorized

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: