您的位置:首页 > 编程语言 > Python开发

基于用户最近邻模型的协同过滤算法的Python代码实现

2014-09-12 11:16 1676 查看
最近看了几篇研究最大信息系数的文章,最大信息系数是一种度量两个变量之间关联关系的新方法。传统度量两个变量之间关系的指标包括皮尔逊相关系数和信息论中的互信息。皮尔逊相关系数在度量具有线性相关关系的两个变量时具有较好的效果,但若两个变量之间的关系不是线性时,不能进行准确地度量。互信息是信息论的鼻祖香农老先生在研究通信理论时引入的,后来研究者发现互信息这个度量在研究两个变量之间的关系具有非常强的作用,在统计学界广受欢迎。

本文在这里不去研究以上三个度量之间的区别。受传统用户最近邻模型在计算用户相似度时通常使用皮尔逊相似度计算方法启发,我想在我的研究中使用最大信息系数来计算用户之间的相关度,不过计算最大信息系数的过程还没完全理解透。幸好已经有前辈大牛在网上公开了各种代码。但是其中的Matlab代码一直是有问题的,Python代码是可以跑通的。因此本人在网上找了找Python做最近邻模型的协同过滤的代码也找到了一个前辈的代码(点击打开链接)。不过感觉这个结果跟我以前做的结果有点不同,仔细研读了几天,发现有几点与我的理解不同,这里将我的代码附上。说明:由于我对Python的语法很不熟悉所以在读取数据和最后输出格式方面几乎是复制这位前辈的代码。不过核心算法部分有两处改动,下面一一说明(涉及到另外一位作者的代码时,本文以原代码代替)。

1.在利用皮尔逊相关系数计算公式计算用户相似度时,原代码在计算用户的的评分均值是调用计算用户评分均值公式进行计算;然而计算用户相似度时针对的是两个用户都评价过的项目,故而此时的用户的评分均值应该是在用户对评分交集项目上取均值。文献[1]中的原文为"All
the summations and averages in the formula are computed only over those articles that u1 and u2 both rated."。

2.在取前N个最近邻居进行预测评分时,原代码直接根据相似度大小选择最相近的N个邻居;然而常用的做法是将活跃用户u的最近邻居按相似度大小进行排序Nu,并获取训练集中评价过目标项目m的所有用户Nm,对Nu和Nm取交集并取前N项得到,若不足N项则直接取交集。

3.写此篇博客纯为探讨交流,欢迎讨论。

附上代码。



[1] Resnick P, Iacovou N, Suchak M, et al. GroupLens: an open architecture for collaborative filtering of netnews[C]//Proceedings of the 1994
ACM conference on Computer supported cooperative work. ACM, 1994: 175-186.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: