基于物品的协同过滤推荐算法

    在我们日常浏览各种网站的时候,经常会受到该网站或者应用的推荐,比较典型的例子就是在淘宝天猫上买东西的时候,点击商品,搜索商品或者付款完成后,我们会发现系统给我们
列举出了很多相似的物品,或者一些可能相关的物品。比如你要买牙膏,可能点了一款牙膏,它就给你推荐好多款牙膏,可能还会有牙刷,牙线等其他东西。那么我们不禁想问,这个推荐算法它是怎么实现的呢?
我们今天就来简单的讲讲推荐算法。
    首先我们知道系统推荐的东西,会和我们想要找的物品很相似,所以这个推荐算法的本质就是在于,根据你搜索点击输入的信息,去给你找到相似的东西。
这里我们先提出一个概念:相似度。
我们先来看看二维的世界里,相似度是怎么定义的,也就是我们这片博文要讲的余弦相似度。

在二维的平面中,有两个向量,a(x1,y1),b(x2,y2),它们的相似度就是他们之间的夹角θ的余弦值(cosθ),当它们夹角越小,cosθ就越逼近1就说明它们相似度越高。

推广到多维向量:a(a1,a2…an),b(b1,b2…bn)
$cosθ=\frac{a1b1+a2b2…an*bn}{\sqrt{a1^2+a2^2..an^2}x\sqrt{b1^2+b2^2+…bn^2}}$
我们要用到的协同过滤算法和这个差不多:
摘自百度百科:协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。
协同过滤又可分为评比(rating)或者群体过滤(social filtering)协同过滤以其出色的速度和健壮性,在全球互联网领域炙手可热。
这样讲干干的我们看个例子,这里我们就是根据物品维度来协同过滤

例子:

我们现在假设有用户A,B,C,物品1,2,3,4, 5
行为的权重:点击1分, 搜索3分, 收藏6分, 付款10分
然后他们的行为如下
用户 物品 行为
A 1 点击
C 1 付款
A 2 搜索
C 5 点击
B 2 收藏
B 3 点击
B 1 收藏
C 3 点击
A 1 收藏
A 4 点击
B 2 点击

1.先将用户信息给聚合成一个用户行为矩阵

1
2
3
4
5
6
    A                    B                  C
1 1点击+1收藏 1收藏 1付款
2 1搜索 1收藏+1点击
3 1点击 1点击
4 1点击
5 1点击

转化为数学矩阵

1
2
3
4
5
6
    A           B           C
1 1+6 6 10
2 3 6+1
3 1 1
4 1
5 1

继续转化

1
2
3
4
5
6
A               B           C
1 7 6 10
2 3 7 0
3 0 1 1
4 1 0 0
5 0 0 1

2.现在我们就得到了一个用户和物品的评分矩阵,令它为A,然后用我们上面说的余弦相似度算法计算出每一种物品间的相似程度。
比如物品1,2之间的相似度
$cos<1,2> = \frac{73+67+10*0}{\sqrt{7^2+6^2+10^2}+\sqrt{3^2+7^2+0^2}} =0.74$
然后我们可以得到一张物品之间相似度的表格,令它为B

0 1 2 3 4 5
1 0 0.74 0.83 0.51 0.74
2 0.74 0 0.65 0.39 0
3 0.83 0.65 0 0 0.71
4 0.51 0.39 0 0 0
5 0.74 0 0.71 0 0

3.然后我们通过物品相似度矩阵和之前用户物品评分矩阵相乘得出用户的推荐列表

0 A B C
1 2.73 6.01 1.57
2 5.57 5.09 8.05
3 7.76 9.53 9.01
4 4.74 5.79 5.1
5 5.18 5.15 8.11

4.将计算结果去除用户已经产生过操作的物品,得到

0 A B C
1 0 0 0
2 0 0 8.05
3 7.76 0 0
4 0 5.79 5.1
5 5.18 5.15 0

5.最后根据实际情况选取需要的推荐物品,这里我们就只选评分最高的那个物品,得到 用户_商品_分数的数据
A_3_7.76
B_4_5.79
C_2_8.05
然后就可以选出推荐的物品了~