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。希望能尽快达到目标,嘿嘿