协同过滤:
在协同过滤中,用户相似度的计算是关键的一笔。
问题:如何的用户X对苹果手机的喜爱与否?
电视机 | 智能手表 | 苹果手机 | 华为手机 | |
---|---|---|---|---|
用户A | 👍 | 😒 | 😒 | 😒 |
用户B | 😒 | 👍 | 👍 | 😒 |
用户C | 😒 | 😒 | 😒 | 👍 |
用户D | 😒 | 👍 | 👍 | 😒 |
用户X | 😒 | 👍 | ? | 👍 |
物品-用户的共现矩阵中的行向量代表相应用户的用户向量,计算用户相似度就是计算两个用户行向量之前的相似度:
①余弦相似度
衡量两个向量之间的夹角,夹角越小,两个用户越相似
s
i
m
(
i
,
j
)
=
c
o
s
(
i
,
j
)
=
i
⋅
j
∣
∣
i
∣
∣
⋅
∣
∣
j
∣
∣
sim(\bold{i},\bold{j})= cos(\bold{i},\bold{j})=\frac{\bold{i}·\bold{j}}{||\bold{i}|| · ||\bold{j}||}
sim(i,j)=cos(i,j)=∣∣i∣∣⋅∣∣j∣∣i⋅j
其中i和j是向量,加了粗体,假如设i是用户B,j是用户D,点赞为1,哭脸为0,那么i可以表示为(0,1,1,1),j可以表示为(0,1,1,0). 那么这两个用户相似度代入公式得:
i·j = 0x0 + 1x1 + 1x1 + 1x0 = 2
||i|| = (0^2 + 1^2 + 1^2 + 12)1/2 = 根号3
||j|| = (0^2 + 1^2 + 1^2 + 02)1/2 = 根号2
2/(根号2 x 根号3) ~~ 0.82 【这里是近似计算的】
计算得到用户B和用户D的相似度是 0.81 其实已经挺高了。
接下来我们找两个不那么相似的用户B和C,假设i是用户B,j是用户C,那么i依旧表示为(0,1,1,1),j表示为(0,0,0,1),那么计算相似度代入公式得:
i·j = 0x0 + 1x0 + 1x0 + 1x1 = 1
||i|| = (0^2 + 1^2 + 1^2 + 12)1/2 = 根号3
||j|| = (0^2 + 0^2 + 0^2 + 12)1/2 = 1
1/(根号3 x 1) ~~ 0.58 【这里是近似计算的】,此时相似度就下降了
缺点:
余弦相似度的主要缺点是用户向量存在非1即0的逻辑,只考虑了用户对某一个物品喜欢或者不喜欢,而没有考虑用户对物品的喜欢程度和讨厌程度,从向量来说,就是只考虑了用户向量的方向,而没有考虑长度。
②皮尔逊相关系数:
相较于余弦相似度,皮尔逊相关系数考虑了用户评分大小的因素,并且使用用户平均分对该用户平均评分习惯进行了修正,减少了某一个用户评分偏高或者偏低的影响。
注释:R(i,p) 代表用户i物品p的评分
s
i
m
(
i
,
j
)
=
∑
p
∈
P
(
R
i
,
p
−
R
ˉ
i
)
(
R
j
,
p
−
R
ˉ
j
)
∑
p
∈
P
(
R
i
,
p
−
R
ˉ
i
)
2
∑
p
∈
P
(
R
j
,
p
−
R
ˉ
j
)
2
sim(\bold{i},\bold{j})=\frac{\sum_p\in_P(R_i,_p- \bar R_i)(R_j,_p- \bar R_j)}{\sqrt{\sum _p\in _P(R_i,_p-\bar R_i)^2}\sqrt{\sum _p\in _P(R_j,_p-\bar R_j)^2}}
sim(i,j)=∑p∈P(Ri,p−Rˉi)2∑p∈P(Rj,p−Rˉj)2∑p∈P(Ri,p−Rˉi)(Rj,p−Rˉj)
该公式看起来似乎比较麻烦,其实可以这么来理解,先将公式分子分母 【减R的平均】这部分去掉,去掉之后是这样的:
s
i
m
(
i
,
j
)
=
∑
p
∈
P
(
R
i
,
p
)
(
R
j
,
p
)
∑
p
∈
P
(
R
i
,
p
)
2
∑
p
∈
P
(
R
j
,
p
)
2
sim(\bold{i},\bold{j})=\frac{\sum_p\in_P(R_i,_p)(R_j,_p)}{\sqrt{\sum _p\in _P(R_i,_p)^2}\sqrt{\sum _p\in _P(R_j,_p)^2}}
sim(i,j)=∑p∈P(Ri,p)2∑p∈P(Rj,p)2∑p∈P(Ri,p)(Rj,p)
这么看,就和余弦相似度的公式一样了:
分子是两个不同的用户向量的点积,将两个用户对相同的物品的评分乘起来相加,不正好是向量乘积运算么。
分母是该用户对每个物品评分的二次方相加后开方,不正好是该用户的向量的模么,两个用户向量的模相乘,不正好就是余弦相似度的分母么。
和余弦相似度不同的是,皮尔逊相关系数可以处理用户对物品打分的情况,而不是单一的喜欢还是不喜欢。
加上【减R的平均】这部分是排除个别用户打分习惯对相似计算造成的影响,如果用A平时打分就是很高,喜欢的是100,不喜欢的是90,可能其他用户如用户B喜欢的是60,不喜欢的是50,通过减去用户平均打分值,可以得到用户A喜欢的打分是100-((100+90)/2) = 5, 不喜欢的打分是:90-((100+90)/2)= -5分, 按照该公式得到用户B喜欢的打分是5分,不喜欢的打分是-5分,这样一来减轻计算压力,都换算为较小的数,二来可以发掘潜在用户的相似。
③皮尔逊相关系数引申
第二点是排除用户个人习惯打分参数,其实也可以排除物品被打分习惯参数,如果一个物品被大多数人接受,那么排除物品平均打分后这部分人的打分还是基本一样的,如果出现不一样的情况,一些人给物品i 打100分,一些人给物品i打50分,那么排除物品平均打分之后,会使得第一批人和第二批人内部之前愈发相似,而两批人之前愈发不相似,甚至出现第二批人不喜欢该物品的情况,因为排除掉平均分之后该评分甚至为负数了。
其实相似度计算也在不断的更新迭代,寻找更好的相似度计算方法。
④获得用户X对苹果手机的喜爱与否
通过上述三种相似度计算每个用户与用户X的相似度,取TopN的相似用户【例子中只有几个用户,其实现实中应该有很多用户参与计算】,利用这几个相似用户的苹果手机的评分 * 相似度得到用户X对苹果手机的喜爱分数。
R
u
,
p
=
∑
s
∈
S
(
W
u
,
s
⋅
R
s
,
p
)
∑
s
∈
S
W
u
,
s
R_u,_p = \frac{\sum {_s\in_S (W_u,_s · R_s,_p)}}{\sum _s\in_S W_u,_s}
Ru,p=∑s∈SWu,s∑s∈S(Wu,s⋅Rs,p)
权重W(u,s):用户u和用户s的相似度
R(s,p):用户s对物品p的评分
公式定义:累加(每个用户和用户X的相似度 乘以 该用户对苹果手机的评分),得到一个结果,该结果除以(每个用户和用户X的相似度之和)。 得到的结果就是用户X对苹果手机的喜爱程度。
结尾:评价基于用户的协同过滤 UserCF
1、在现实业务中,用户数量往往远大于物品数量,也就是计算用户之间相似度,需要存储历史大量的用户矩阵数据,该存储开销随着用户的增加会以较大的比例上升,对于存储系统是一个很大的挑战。
2、用户向量矩阵往往不止稠密的,而是稀疏的,大部分用户可获取的信息极为少,导致计算的时候寻找用户的相似用户很难实现,或者说实现后很难判断是否真的相似,对于获取用户评分较难的公司及业务很不友好,比如远程车票、旅游公司等等
我也是刚开始学习,欢迎在评论区讨论:🌹🌹🌹