Programming Collective Intelligence 读书笔记之 Recommandation

第二章进入正题,Making Recommandation 引入一个重要概念: Collabrative Filtering, 即协同过滤。

书中以电影评价系统和推荐系统为例解析协同过滤的概念及应用。首先以nested dictionary为载体用python建立一系列包含人名,片名,评分的数据。然后抛出问题: how to find similar users? 即如何从海量数据分析中寻获品位相似的用户。

相似度计算体系:Euclidean Distance Score (欧式距离)
欧式距离在数学中的定义为N维欧式空间两点间的距离。书中以简单的二维空间为例



以书中图片为例,建立以两个片名为坐标轴的二维坐标系,将人名和他们对应的对于两部影片的评分作为点置于图中。然后计算每一个维度的距离平方,相加后再做方计算出值来表示这个距离。暂将这个值标位D。很明显,D的值随着两点间的距离变大而变大,取值范围飘忽不定。进一步优化公式,算的1/(1+D), 使得这个值永远介于0和1之间,数值越接近一,样本的相似度越高。

相似度计算体系:Pearson Correlation Score (皮尔逊相关系数)
这个系数是用来判断两组数的线性相关程度的。这个系数的计算更加复杂但是更为精确。大黄试着用大白话理解这里的意义,用电影评价的例子来看,有三个人A,B,C,其中A,B的欧式距离比B,C要小,但是观察数据发现,A,B对于很多电影的评分都有分歧,即对于某些电影A给分高,B给分低,另外一些相反。但是B,C的评价体系却非常相似,即对于某些电影B给了“高分”,C也是。这里的高分我用引号括起来,意思是相对高分,也就是在B自己的体系里,某一部电影分数高,但绝对分数并不一定。换一种说法就是B,C对于电影的绝对分数评价差距较大,但是对于这些电影给出的排名却非常一致,这时候我们就需要这个皮尔逊相关系数来判定他俩才是相似度较高的用户了。皮尔逊相关系数的数学表达式为 x和y的协方差/(x的标准差*y的标准差),这个结果会落在-1和1之间,越接近1,相关性越强。


CodeCogsEqn.gif

两两的问题解决后,我们自然可以以某一个目标用户为基础,计算所有其他用户和他的相关性,并找出和他相关性最高的那个人,从而将那个人的电影推荐给目标用户

在解决了上述相关性问题后,作者再次抛出疑问,找到一个相似性很高的用户是否已经足够去推荐电影,会不会出现一些情况比如有一些很适合我的电影,相关性很高的那个人并没有看过或者评分过,或者相关性很高的那个人在某一部电影的评分上和其他人完全相悖,给了个很低的分数,但其实在绝大部分人眼中那是部好电影。如果仅仅使用用户相关性,这样的电影推荐就会被忽视。这是下一个需要解决的问题。
解决这个问题的途径便是利用权重。再次截取书中的图表:


P2.PNG

图片中,每个用户和目标用户都有相关度数值,作为权重,都有对于某一部作品的评分,相乘后的积再求和,除以权重,得到最后的分数,可以看到最后一行的数据为判定推荐与否的终值。

下一部分书中简要介绍了另一个维度的推荐,即推荐产品相关性较高的其他产品,从编程的角度这并不难办,即将python的dictionary变更Key和Value来重新计算相关性。这种推荐常见于对目标用户数据不足的情况,比如书中列举的在amazon买书时,进入该书的页面后会看到“买了这本书的用户还买了”这样的推荐版块。

这一章节到此依然没有结束,作者引入了两个新概念:User-Based Filtering和Item-Based Filtering。之前的例子中基本都是基于用户的过滤,但是对于一个非常庞大,拥有指数级用户的网站或者系统,做这样的过滤是非常缓慢的,而且由于用户的行为非常频繁,所以计算的结果也需要实时变更,那么这个时候这种策略将失去优势。于是转向了基于项目的过滤,对于某一用户,先找出他的历史数据,将位列前排的项目提取出来,然后通过类似于前面介绍的权重体系获取其他项目的相关性。这样做的好处是项目的更新频率相对用户是更低的,很多计算不需要实时的数据,可以预先计算保留结果,大大提高了推荐系统的效率和速度。这种策略特别时候用户基数很大的情况。

最后,对于如何选择基于用户还是基于项目,作者给出一条结论:“Item-based filtering usually outperforms user-based filtering in sparse datasets, and the two perform about equally in dense datasets”。这样的结论是基于数据量和运算速度的,这两种过滤方式在现实中都有实际存在和应用的场景,不可以一概选择其中一种。

本章最后的练习中提到了另一个指标:Tanimoto score。这个指标是用于计算符号度量或布尔值度量的个体间的相似度的。当参考样本无法量化评分,而只是例如用是或否,大小这样的指标来衡量,则Tanimoto score是用来计算相似度的一个好方式。


CodeCogsEqn (1).gif

公式很简单,两者相同选项总数除以两者不同选项总数和。

推荐阅读更多精彩内容