Sunday, November 29th, 2009
上次去beta沙龙的视频,希望没有浪费大家的时间,感谢beta沙龙的组织工作。
Posted in Data Mining | 2 Comments »
Tuesday, November 17th, 2009
周末beta沙龙和大家分享的音乐智能推荐PPT,有些内容和上次的PPT差不多,这次主要和大家分享一个完整的数据挖掘流程,同样的,还是工程方面比较多,学术方面这里有很多大牛。
Posted in Data Mining | 6 Comments »
Monday, May 18th, 2009
断断续续的做了大半年歌曲相关性方面的试验,有一些肤浅的体会,工程方面多些,学术上仍很不足,与大家分享,望后来之君少走弯路,抑或被我带入岐途,不当之处,请指正。
PS:前段时间申请了个独立域名:http://www.fuchaoqun.com,烦请订阅feed者更新:http://www.fuchaoqun.com/feed/,原http://chaoqun.17348.com作了301跳转,将来一段时间内亦能访问。
Posted in Data Mining | 9 Comments »
Tuesday, February 3rd, 2009
本博客所有原创文章采用知识共享署名-非商业性使用-相同方式共享,转载请保留链接http://chaoqun.17348.com/2009/02/slope-one-for-music-recommender-system/
不知不觉,研究歌曲相关推荐快半年了,第一篇文章利用orange进行关联规则挖掘完成于2008.08.26,到现在基本搞定基于矩阵奇异值分解(SVD)的协同过滤算法,期间得到了很多朋友的帮助,在此致谢。有些收获,将逐步的分享出来,有兴趣的可以参照研习。
对于Slope One算法,不熟悉的可以参照我之前的文章:Slope one:简单高效的推荐算法,已经被很多人证明有很好的推荐效果。
Slope one算法中有一个很重要的步骤是获取用户的打分数据,这个对很多网站都很费劲,很多用户都会听歌,但大多懒得去给歌曲打分,另外用户打分的时候会比较困惑,该打多少分呢?喜欢这首歌,是打4分还是5分呢?费劲。
我这里给出的是另外一种方法,做法是分析用户的听歌记录,一般网站都会记录这样的记录,统计一段时间内用户的听歌记录,我们得到下面格式的数据:
用户ID 歌曲ID 听歌次数
比如某个片段:
3389 9527 23
3389 9528 56
3306 1211 78
3306 9527 45
表示用户3389听歌曲9527的次数是23,听9528的次数是56,诸如此类。这样的数据当然不能直接用来做Slope one,需要把数据格式化到某个区间。我们分析一下用户听歌的行为,一般来说最喜欢的歌曲听的最多,越喜欢的歌曲听的越多,听的少的歌曲自然不那么喜欢。所以我们可以简单的模拟用户对歌曲的打分:
用户对歌曲的打分 = 用户听此歌曲的次数 / 用户听单首歌曲的最大次数
这样就可以把打分数据规整到0~1之间,还是上面的数据:
3389 9527 23/56
3389 9528 56/56
3306 1211 78/78
3306 9527 45/78
用户听的最多的歌曲打分是1,其他歌曲的打分等于听歌次数除以最大次数,我们就获得了用户的打分数据了。剩下的工作就是按照标准的Slope One流程走了,程序代码可以参考:http://code.google.com/p/openslopeone/
贴出几个实例大家看看,第一次做的结果,再去做的话应该比这个要好一些:
歌曲
推荐歌曲
南无大悲观世音菩萨 刘小茜
梵音大悲咒 齐豫
大悲咒 齐豫
观世音菩萨发愿偈.大悲咒 齐豫
大悲咒 邝美云
般若波罗蜜多心经 齐豫
大悲咒 齐豫
清净法身佛 齐豫
阿弥陀佛在心间 小娟
吉祥如意 凤凰传奇
好一朵茉莉花 朱昌耀
理查德-克莱德曼《梦中的婚礼》 合辑(欧美)
茉莉花(汉族民歌) 雷佳
好一朵茉莉花-笛子 合辑(内地)
最浪漫的事 赵咏华
沧海一声笑 罗文
how can i keep from singing Enya
生死不离 ...
Posted in Data Mining | 2 Comments »
Tuesday, January 6th, 2009
本博客所有原创文章采用知识共享署名-非商业性使用-相同方式共享,转载请保留链接http://chaoqun.17348.com/2009/01/slope-one-on-netflix-prize/
前段时间做了个slope one算法在Netflix Pirze上的测试,关于slope one算法可以参考我之前写的文章:Slope one:简单高效的推荐算法,Netflix Prize是DVD在线租赁商Netflix于2006年10月2日发起一项竞赛:任何组织或个人只要能够提交比它现有电影推荐系统Cinematch效果好10%的新方法,就可以获得100万美元的奖金。竞赛最多持续到2011年10月2日。同时,NetflixPrize还提供每年5万美元的年度进步奖。为什么是五万美元的年度进步奖呢?因为100万美元大奖存银行,每年的利息是5万美元,看来老外是挺有意思的。
Netflix Pirze采用RMSE作为评测的标准,RMSE中文的意思是均方根误差,计算的公式:
其中Ot是原始数据,Ft是预测数据,n是样本数。
目前最好的成绩是有BellKor in BigChaos创造的0.8598(2009.01.05数据),比官方数据提高9.63%,这样可以推算出官方的数据应该是0.9492左右,BellKor in BigChaos也是2008年度进步奖的获得者,他们更新数据的频率很高,如不出意外,最后的大奖应该是他们的。
目前的方向大多是SVD奇异值分解,可以参见BellKor in BigChaos他们的文章http://www.netflixprize.com/community/viewtopic.php?id=1193,这里有一个开源的项目nprize,也是一个SVD处理Netflix Prize的模型,大部分代码是Python的(国外很多用Python做数据挖掘和自然语言处理的案例),成绩到了0.9046,折算比官方数据要高4.70%,如果你想拿SVD热热手,可以看看这个开源项目,过些日子我会写一些SVD应用在推荐系统方面的文章,着急的可以阅读吴军的文章数学之美 系列十八 - 矩阵运算和文本处理中的分类问题。
由于对slope one算法比较熟悉,决定看看slope one算法在netflix pirze上的表现如何,netflix prize训练数据太大,大概有1亿多条的打分记录,OpenSlopeOne在运行效率方面不是很好,OpenSlopeOne处理几百万上千万的打分数据还是非常不错的,更多的话需要更多的机器水平扩展,如果有好的Mysql DBA可以尝试优化一下mysql server的参数,估计效果会很好,当然也需要有好的机器配合,我这里是用Python写的一个程序,多进程+多线程+手工Map-Reduce,需要源代码的话可以找我拿。
跑出来的结果不是很好,我的得分是0.9829,比官方数据差0.0337,大概差3.55%,分析原因可能是用户打分的数据普遍偏高,人们大多给自己喜欢的电影打分,对于不喜欢的数据打分就少很多了,下面是打分数据的分布情况:
mysql> select rating,count(*) as times from nf_log group by rating;
+--------+----------+
| rating | times |
+--------+----------+
| 1 | 4617904 |
| 2 | 10131945 |
| 3 | 28810978 |
| 4 | ...
Posted in Data Mining | 4 Comments »
Friday, September 12th, 2008
About OpenSlopeOne
OpenSlopeOne is an implementation of Slope One based on PHP&MySQL, it's an open source project under GPL V3.
It aims to a fast way to use Slope One with PHP&MySQL, and it can handle tons of data.
It's localed on Google Code:
http://code.google.com/p/openslopeone/
You can get the latest code here:
svn checkout ...
Posted in Data Mining, MySQL, Open Source, PHP | 1 Comment »