利用皮尔逊相关度系数构建一个简单的推荐系统

by 小戴

伴随着Web2.0概念的普及,我们正在广泛地享受推荐系统给我们带来的便利。

现代的电子商务、SNS社区等应用大量地使用了推荐系统。通过推荐系统,人人网帮我们找到多年未见的老友,亚马逊总能知道我们偏好什么样的商品,而豆瓣网更是将算法和产品完美结合的最佳典范之一。

通过大量的用户数据和充满智慧的推荐系统,豆瓣网已经成为了我寻找读物、电影和志趣相投的朋友的不二场所。

最近我阅读了《集体智慧编程》一书,开始接触到一点推荐系统的算法。于是在这里我便把一些我学到的东西分享给大家。

在下面的算法里,我们利用一组如下所示的输入数据,它们是用PHP代码描述的。这组数据保存了7位用户以及他们对若干部电影的评价。所有的评价值都介于1到5之间,这有点像我们常常见到的1至5颗星的评价方式。这种数据组织的方式是很贴近于我们现实的应用的。

01 $critics array(
02                     'arale'     =>   array(
03                                             '盗梦空间'  =>   2.5,
04                                             '阿甘正传'  =>   3.5,
05                                             '线人'        =>   3.0,
06                                             '阿凡达'       =>   3.5,
07                                             '在云端'       =>   2.5,
08                                             '人在囧途'  =>  3.0),
09                     'johnson'   =>   array(
10                                             '盗梦空间'  =>   3.0,
11                                             '阿甘正传'  =>   3.5,
12                                             '线人'        =>   1.5,
13                                             '阿凡达'       =>   5.0,
14                                             '人在囧途'  =>   3.0,
15                                             '在云端'       =>   3.5),
16                     'white'     =>   array(
17                                             '盗梦空间'  =>   2.5,
18                                             '阿甘正传'  =>   3.0,
19                                             '阿凡达'       =>   3.5,
20                                             '人在囧途'  =>   4.0),
21                     'richard'   =>   array(
22                                             '阿甘正传'  =>   3.5,
23                                             '线人'        =>   3.0,
24                                             '人在囧途'  =>   4.5,
25                                             '阿凡达'       =>   4.0,
26                                             '在云端'       =>   2.5),
27                     'hillary'   =>   array(
28                                             '盗梦空间'  =>   3.0,
29                                             '阿甘正传'  =>   4.0,
30                                             '线人'        =>   2.0,
31                                             '阿凡达'       =>   3.0,
32                                             '人在囧途'  =>   3.0,
33                                             '在云端'       =>   2.0),
34                     'colin'     =>   array(
35                                             '盗梦空间'  =>   3.0,
36                                             '阿甘正传'  =>   4.0,
37                                             '人在囧途'  =>   3.0,
38                                             '阿凡达'       =>   5.0,
39                                             '在云端'       =>   3.5),
40                     'rock'      =>   array(
41                                             '阿甘正传'  =>   4.5,
42                                             '在云端'       =>   1.0,
43                                             '阿凡达'       =>   4.0));

在推荐系统算法的实现中,我们要用到皮尔逊相关度系数这一方法来利用已有的数据计算两位用户或者是两件产品之间的相关程度。皮尔逊相关度系数是一个介于1到-1之间的值,其中,1表示两个变量完全正相关,0表示无关而-1则表示完全负相关。下面我们给出皮尔逊相关度系数的计算公式。有关皮尔逊相关度系数更详细的数学原理,大家可以Google到很多资料。

用PHP代码可以很容易地描述出皮尔逊系数的实现。

01 function getPearson($prefs$person1$person2)
02 {
03     if (!is_array($prefs)) {
04         return false;
05     }
06  
07     // 得到双方都评价过的物品列表
08     $similar array();
09     foreach ($prefs[$person1as $item => $value)
10     {
11         if (array_key_exists($item$prefs[$person2]))
12         {
13             $similar[$item] = 1;
14         }
15     }
16  
17     // 计算列表元素的个数
18     $nums count($similar);
19     if ($nums <= 0) {
20         return 0;
21     }
22  
23     // 对所有的偏好求和
24     $sum1 = getSum($similar$prefs[$person1]);
25     $sum2 = getSum($similar$prefs[$person2]);
26  
27     // 求平方和
28     $sum1Sq = getSum($similar$prefs[$person1], 2);
29     $sum2Sq = getSum($similar$prefs[$person2], 2);
30  
31     // 求乘积之和
32     $pSum = getSum($similar$prefs[$person1], 1,$prefs[$person2]);
33  
34     // 计算皮尔逊评价值
35     $numerator $pSum - ($sum1 $sum2 $nums); // 分子
36     $denominator = sqrt(($sum1Sq - pow($sum1, 2) / $nums) * ($sum2Sq - pow($sum2, 2) / $nums)); // 分母
37     if ($denominator == 0) {
38         return 0;
39     }
40     return $numerator $denominator;
41 }

其中用到的getSum()函数描述如下。

01 function getSum($similar$person$power = 1, $person2 = null)
02 {
03     if (!is_array($similar) || !is_array($person) || $power < 0)
04     {
05         return false;
06     }
07     $sum = 0;
08     foreach ($similar as $item => $value)
09     {
10         if (is_array($person2))

你可能感兴趣的:(集体编程智慧,算法,电子商务,sns,php,产品,google)