2009年5月4日星期一

今天实现了RBM算法

感谢王元涛同学的帮助,今天实现了RBM模型,用50个hidden unit得到Probe上的RMSE=0.924。将这个结果融合进以前的预测器集合中,得到Quiz上的RMSE从0.8694改进到0.8688。

看了RBM确实是一大类方法,能够弥补其他方法的不足。目前我在实验更多hidden unit的RBM,已经用Gauss hidden unit 的RBM。

2009年4月19日星期日

Top40

今天第一次进入Top40,0.8717

2009年4月14日星期二

程序并行化 multi-thread

因为我用的计算机有4个核,为了充分利用计算机资源,今天将基于SVD的模型重新用多线程进行实现,速度大大提升。 SVD很容易并行化,我的策略是在扫描数据的循环上并行化处理,在修改模型时用锁进行互斥。

2009年4月10日星期五

clustering items and users by latent factors?

By SVD model, we can calculate latent factors for users and items. p(u) is latent factor for u, while q(i) is latent factor for i.

Recently, I thought about calculate user similarity by latent factor,

For example,

s(u,v) = f(p(u), p(v)) ?

I am testing this idea now, and I hope this idea can improve prediction accuracy.

PS.
I have tested this method on the residual of NSVD model. By using this clustering method in estimating group effects, I reduce the RMSE of NSVD model from 0.8923 to 0.8910

2009年4月8日星期三

An improved item-based KNN predictor

Today, I revise the item-based KNN predictor and get RMSE = 0.8730 in quiz with other 39 predictors.

The classical item-based kNN will firstly calculate similarity between item i and j by:



The, the rating r(u,i) will be predicted by:



However, I revise this predictor by:



This predictor can produce more accurate prediction by choosing adequate alpha

2009年4月7日星期二

关于评分分布的思考

对于一部电影,它被一堆人评分了,这些评分具有一些属性,均值,方差,偏差,等等。
目前我在设计一个新的模型,对于每一部电影,我们计算他的平均得分,记为m(i),那么对于一个用户-电影(u,i),
我建立如下的模型来估计他的评分

r(u,i) = mu + bu + bi + dot(p[u], q[i]) * h[k]

其中,k = m(i)

这个模型可以不断的变换,比如我们也可以令k = var(i),也就是说

dot(p[u], q[i]) * h[k]

表示了用户u对具有k属性的电影i的看法。 我仍然用梯度法训练这个模型。结果稍后公布。

2009年4月6日星期一

rescale ratings 重新定制评分等级

在预测某个电影的评分时,如果用户打的是3.5分,而预测器预测成5分,这个预测尽管不准确,但至少预测对了这个用户是喜欢这部电影的。反之,如果预测成2分,尽管和5分的误差一样,但他没有预测对用户的喜好。所以,我们认为,3.5和5的预测误差要小于3.5和2的预测误差(在一个1-5分的评分系统中).

在一个5分系统中,我们一般认为,分数大于3,表示用户喜欢这个电影,反之表示用户不喜欢。但是,一般的评分系统是线性的,我们觉得,sigmoid函数似乎更加能代表评分的分布。我们将一个评分做如下变换:

f(r) = 1 / (1 + exp(3 - r))

然后我们可以发现,如果评3.5分,在这个系统中就变成0.622分,5分变成0.881分,而2分变成0.269分。

f(5) - f(3.5) = 0.259
f(3.5) - f(2) = 0.353

这样就能反应出评分的差别

sigmoid函数

r(u,i) = sigmoid(b(u) + b(i) + dot(p(u), q(i)))

sigmoid(x) = 1 + 4 / (1 + exp(-x - 0.62))

用0.62的原因是,sigmoid(0) = 3.6 是数据集的平均得分

2009年4月3日星期五

聚类在CF中的应用,我的一点看法

最近在研究,如何把一些评分之外的特征加入到CF中,比如context信息。我觉得利用聚类是一个比较好的手段。

假设我们有很多用户的信息,我们可以用这些信息对用户进行聚类,c_u是u所属的聚类。另外如果我们也有很多物品的信息,我们也可以对物品聚类,c_i是i所属的聚类。那么我们可以用如下模型:

r(u,i) = b(u,i) + dot(p(c_u), q(c_i))

其中b(u,i)是一个base预测器,比如可以是一个RSVD预测器。

其实我觉得global effect也是一种聚类。比如根据用户评分数对用户聚类userSupp,等等。

比如我们有电影的导演,演员,我们也可以用这些信息对电影聚类。个人感觉,这种方法是一种不错的利用其它信息的方法。

2009年4月2日星期四

Improvement超过8%

今天加入了标题信息的一个模型,RMSE达到了0.8752. 从而Improvement达到了8.01%。庆祝一下,呵呵。

下一个目标是进入前40名,在下一个目标是让RMSE<0.87。希望能尽快达到目标,嘿嘿

2009年3月28日星期六

TimeSVD

最近一直在写一篇关于如何使用时间信息的论文,准备投4月份的WI,今天将论文中的一些结果加入到以前的预测器集合中,RMSE从0.8770降到了0.8761。以前的预测器集合中已经有了很多考虑时间信息的预测器,不过这个这个预测器效果是最好的。

根据我的估计,时间信息对最终结果的影响大概在0.007 - 0.01之间,在我的论文中将会阐述这个结果的由来。

2009年3月23日星期一

Global Effects in Netflix Prize

忙活了几天,终于把那个global effects给搞定了,不容易啊,嘿嘿

Today, I have implement alogrithm of global effects in Netflix. My method is similar to Koren's method. However, I think, his paper is not very clearly. I have tested many methods and at last get same result as him. Therefore, I will give detail description of my algorithms.


Related Papers:
The BigChaos Solution to the Netflix Prize 2008
Scalable Collaborative Filtering with Jointly Derived Neighborhood Interpolation Weights

0. global average

b0(u,i) = global_mean

1. movie effect

x(u,i) = average(i) = sum_u {r(u,i) - b0(u,i)} / n(i)

we calculate average rating of movies. In order to avoid, we also shrink average(i) by:

average(i) = average(i) * n(i) / (n(i) + alpha)

In my implement, we choose alpha = 22 and get RMSE = 1.0527

b1(u,i) = b0(u,i) + p(u) x(u,i)

Here, p(u) is estimate by Koren's method.

p(u) = sum_i (b1(u,i) - b0(u,i)) * x(u,i) / sum_i x(u,i) * x(u,i)

and shrink by:

p(u) = p(u) * n(u) / (n(u) + alpha)
2. user effect

x(u,i) = average(u) = sum_u {r(u,i) - b1(u,i)} / n(u)

we also shrink x(u,i), choose alpha = 7.5 and get RMSE = 0.9840

Then, we get predictor b2:
b2(u,i) = b1(u,i) + p(u) x(u,i)

3. user X time(user)

Let t(u) be the first time when user u give ratings. t(u,i) is the time when u assign rating to i. Then, the effect x(u,i) is:

x(u,i) = sqrt(t(u,i) - t(u)) ; t(u,i) - t(u) > beta
x(u,i) = 0 ; otherwise

In our algorithm, we choose beta = 18 and shrink parameter alpha = 160. We get RMSE = 0.9801.

Then, we get predictor b3:
b3(u,i) = b2(u,i) + p(u) x(u,i)

2009年3月19日星期四

在已有的模型结果上做KNN

假设我们已经有了一个预测器b。我们定义item直接的相似度为:


然后用item-based KNN进行预测,我们在20个factor的SVD结果上,进行了K=30的KNN算法。计算出一个预测器,加入到最后的预测器集合中融合,得到RMSE=0.8782

我准备将这个方法应用到更多的预测器上

2009年3月18日星期三

电影发布时间的影响

今天开始考虑电影发布时间对精度的影响,最近几天经过调整,目前RMSE=0.8791。这几天还在实现user-based factorized neighborhood model。
处理电影时间,我用了一个简单的模型:b(u,t),u是用户,t是电影发行时间。我以每8年作为一个时间段,然后在NSVD模型中加入这个修正项。

2009年3月12日星期四

基于分解的邻域算法

经过一夜的计算,NSVD算法终于跑出了一个50维的结果,我将他放入到融合模型中,没想到性能有大大的提升,RMSE从0.8873到了0.8811

模型的基本公式如下,也是用梯度法训练的。




---------------------------------------------------
本文使用了在线Latex公式编辑器,感觉不错,地址是http://thornahawk.unitedti.org/equationeditor/equationeditor.php

普通的SVD方法已经到头了

之前我的融合算法中,svd用的最高是500个latent class,刚刚加入了1000维的,最终RMSE只是从0.8874变成了0.8873,看来单纯增加维数已经没有用了。

下一步工作主要是改进NSVD(Neighborhood based SVD)算法,个人感觉,SVD和邻域加上一些非线性核函数,应该是所有可用的方法,而RBM,个人感觉,有点像加了核函数的NSVD算法。

2009年3月11日星期三

时间信息在推荐系统中的作用

今天加入了UserTimeSVD模型,目前的RMSE = 0.8874

根据我的研究,时间对于用户的影响超过了时间对于电影的影响。我计算了一些用户每个月的平均评分,发现用户在某些时间喜欢对他们喜欢的电影评分,而在另一些时间喜欢对不喜欢的电影评分。

而对于电影来说,一部电影会被很多用户评分,所以平均意义上,电影的评分不会有太大变化。不过我还发现一个现象,就是当电影刚出现时,他的评分在最初的几个月会有比较大的波动,但经过大概半年之后,他的评分就不会有变化了。

目前我正在写这方面的论文。如果我们用SVD分解,用50个latent factor,在Probe上的RMSE是0.908,但考虑了用户兴趣随时间变化后,可以得到更精确的RMSE为0.903

2009年3月6日星期五

加入了sigmoid核函数方法,RMSE0.8949

加入了sigmoid核函数方法,RMSE0.8949

考虑用户时间因素的SVD模型(TimeSVD02Model)

这个模型中,考虑了user评分的时间变化因素,在基本的SVD模型中加入了一项,变为

r(u,i,t) = mean + b(u) + b(i) + b(t) + dot(p(u),q(i)) + dot(x(u),y(t))

其中p(u),q(i)是一个d1维的向量,x(u),y(t)是一个d2维的向量

考虑电影的时间因素(ItemKNN3Model)

在item-basedKNN中,可以考虑电影的时间因素。

电影i,j的相似度为s(i,j),考虑时间因素后,定义为

s(i,j) = s(i,j) * exp(-k * |t(i) - t(j)|)

2009年3月5日星期四

关于SVD模型中的kernel

基本的svd模型是
r(ui) = mean + b(u) + b(i) + dot(p(u), q(i))

dot()是表示两个向量的点乘。

其实这里的dot(p(u),q(i))是考虑到了u和i的特点对均值做的一个偏差。他的分布应该是以0为中心的正态分布。我现在考虑引入kernel函数,目前用sigmoid核函数。

sigmoid(x) = a * (1 - exp(-kx)) / (1 + exp(-kx))

到目前为止的进度

2009/02/24

SVD模型 d = 250,学习速率0.0055,正则化参数0.002,RMSE = 0.904

2009/02/25

今天用一种新的方法计算item-based算法中的相关系数,只需要3个小时(包含读取文件的时间)。

邻域数为30,得到RMSE = 0.9416

邻域数为100,RMSE = 0.9574

邻域数为20,RMSE = 0.9394

2009/02/27

今天利用模型融合的方法,融合了SVD和item-based KNN两种方法,得到 RMSE = 0.9025

调整参数,alpha = 0.04 beta = 0.5 RMSE = 0.9012

alpha = 0.04 beta = 0.9 RMSE = 0.9013

2009/02/28

item-based 10NN + SVD250 RMSE = 0.9002

2009/03/01

今天发现我在计算probe数据集的RMSE时忘记开根号了,低级错误啊。我一直困惑为什么probe的RMSE在0.8左右,而quiz的确大于0.9,原来是根号的缘故.0.9 * 0.9 = 0.81,呵呵

2009/03/04

今天修改了FLC模型,

item-based 10NN + SVD250 RMSE =0.8994

2009/03/05

简单的线性回归 9个模型融合 RMSE = 0.8989

FCL RMSE = 0.8974 这说明FLC模型还是比线性回归融合的更好的。

现在正在计算NSVD模型,明天也加入融合

2009/03/06

今天加入了NSVD模型,并采用FLC融合,RMSE = 0.8965

下一阶段将考虑时间因素和电影标题