推荐系统入门之协作型过滤算法

product-recommendation-1024x402

双11刚过,又剁手了吧,各种电商,无论是淘宝,亚马逊,还是ebay。都搭载着一个推荐系统,这个推荐系统可以再你买过东西或者浏览过后分析并且给你推荐出你可能还需要购买的东西。再比如豆瓣,可以根据你对电影的喜好来为你推荐电影。可是,这些技术的背后又是什么呢?这个博客将会讲述一个推荐系统背后最基本的数学原理并使用Java实现。

  • 协作型过滤

用人的思维想一想,我想买一个东西却不知道他的好坏,最直接的方法就是找我的朋友们问一问,最好是买过这个产品的朋友,他们的评价可能更有意义。但是在互联网上,选择是无穷无尽的,想要通过几个人来确定东西好不好几乎是不可能的,我的朋友们不可能什么都知道,这时候,协作型过滤就要发挥用途了。协作型过滤算法需要对一大群人进行分析,确认出来与你品位相近的人,并且对这些人的偏好和你进行考察和对比,然后推荐给你。

  • 偏好假设

拿几个人对不同电影的评分来举例子。

首先建立一个Preference类,用来抽象一个喜好,其中两个变量,prefName代表喜好名字,prefScore代表评分,比如电影奇异博士,我对他打分为4.5分,那么prefName就为“奇异博士”,prefScore为4.5;

然后建立一个Person类用来抽象人,两个变量,personName为人名,还有一个数组来储存这个人所有的喜好。

之后就可以进行数据初始化了:代码写的比较直接,新建了几个Person(Mike,Leonard,Jayden…)然后对每个人添加若干电影,和相关的评分。

  • 相似用户查找

有了数据,就要有一种方法来判断两个人之间在品位方面的相似程度,举个例子,喜欢科幻片的同学可能对奇异博士都有较高的分数,这就是一种在品位方面的相似程度。最常用的评判算法为 欧几里得距离皮尔逊相关系数

  • 欧几里得距离

这个大家应该非常熟悉了,初中就会,在学习函数的时候,平面坐标系中,两点之间的距离就是那两个点的欧几里得距离。其实就是勾股定理,是不是很简单?

但是这只是在二维空间里,在多维空间中的欧几里得距离是这个公式的延伸:当n=2的时候就和上式一样的

可是这个距离怎么能表示偏好的相似程度呢?

看下图,分别是四个人对两部电影评分的图:横轴为神探杰克,纵轴为火星救援,可以看出Jayden和Mike的点的距离相近,所以说他们的欧几里得距离很近,所以可以判定他们有着相似的电影偏好程度。

为了计算方便,要设计一个函数,在偏好距离越近的地方给出越大的值。

使用1来除以距离加1的算法: 1/(1+sqrt(pow(2.5-3,2)+pow(3-3,2)));

分母加一是为了避免分母为0出现运算错误。

以下是代码:

为了方便,我在Person类里面有加入了若干方法,比如代码中的hasPreference()函数,用来判断这个人是否给这个电影(喜好)打分过。

试着运行一下,这个方法的返回值会在0到1之间,越大表示偏好越相近,1代表偏好完全相同。

上面的值就是Mike与Leonard相似度。而Mike和Jayden的相似度为0.4多,和图上基本吻合。

尽管欧几里得距离很实用,可是这个算法有一个缺陷

如果不同的用户打分严格程度不同的话,这个算法给出的结果就会不准确,比如我觉得一个电影很好,超级棒!我会给5分,但是另一个人打分可能比我严格,他同样觉得这个电影无可挑剔,但是他还是会打一个4.5分,其实我们应该在这个偏好上完全相同的,但是由于打分的严格程度不同,导致了欧几里得距离的产生。为了解决这个问题,就要引入皮尔逊相关系数了。

  • 皮尔逊相关系数

皮尔逊相关系数可以用来判断两组数据与某一个直线的拟合程度。通俗的说,这个系数可以表示两组数据之间的相关程度,介于-1到1之间,1代表完全正相关,0代表完全负相关。

不理解的人可以到这个网站上玩一玩: http://guessthecorrelation.com/

上面两个图的皮尔逊系数分别是0.15和0.82

虽然第二个图的点都比较分散,但是主要趋势还是能拟合为一条直线。

计算公式如下:

公式看起来比较复杂,写代码时候拆开来一步一步做:

整个代码还算简单,很多必要的方法都被设计在了Person类里面,比如getPrefByName()方法,可以通过偏好名来获取Person的偏好实例。

运行代码试一下,两行输出分别为相同的两个人的欧几里得距离和皮尔逊系数。

这篇博客先讲到这里,主要讲解了两种常见的相似性度量方法。掌握了这个之后,通过扫描每个用户的相似度并且排列就可以找到偏好程度相近的用户了,不过这只是基本,在面对用户数量大的情况下还有很长的路要走。

代码在我的Github里可以查看:https://github.com/Yigang0622/LearnRecommendation

 

我的博客MikeTech app现已登陆iPhone和Android

iPhone版下载
Android版下载

 

打赏

2 thoughts on “推荐系统入门之协作型过滤算法

  1. “通过扫描每个用户的相似度并且排列就可以找到偏好程度相近的用户了…” 这里排列时是如何同时结合欧几里德距离和Pearson的呢?

Leave a Reply

Your email address will not be published. Required fields are marked *