推荐方法-1:UserCF&ItemCF

Summary of recommended methods(1)

1.Metrics

  • RMSE
  • MAE
  • Coverage
  • Diversity
  • Recall
  • Precision

1.1 RMSE(均根方误差)

R M S E = ∑ u , i ∈ T ( r u i − r ^ u i ) 2 ∣ T ∣ RMSE = \frac{\sqrt{\sum_{u, i \in T}(r_{ui} - \hat{r}_{ui}})^{2}}{\lvert T \rvert} RMSE=Tu,iT(ruir^ui )2

  • u u u : 用户 u u u
  • i i i : 物品 i i i
  • r u i r_{ui} rui : 用户 u u u i i i 的评分
  • r ^ u i \hat{r}_{ui} r^ui : 算法预测的评分

1.2 MAE(平均绝对值误差)

M A E = ∑ u , i ∈ T ∣ r u i − r ^ u i ∣ ∣ T ∣ MAE = \frac{\sum_{u,i \in T} \lvert r_{ui} - \hat{r}_{ui} \rvert}{\lvert T \rvert} MAE=Tu,iTruir^ui

RMSE vs MAE

  • RMSE : 增加的对预测物品评分不准的惩罚(平方项惩罚),系统更加苛刻
  • MAE : 对于整数评分系统,对预测分数取整会降低MAE误差

1.3 Coverage(覆盖率:推荐物品占物品集合的比例)

描述推荐算法对物品长尾的发掘能力(推荐结果中尽可能覆盖多的物品且出现次数差不多=长尾发掘能力强)

C o v e r a g e = ∣ ⋃ u ∈ U R ( u ) ∣ ∣ I ∣ Coverage = \frac{\lvert \bigcup_{u \in U} R(u) \rvert}{\lvert I \rvert} Coverage=IuUR(u)

  • U U U : 用户的集合
  • R ( u ) R(u) R(u) : 推荐给用户 u u u 长度为 N N N的物品列表
  • ∣ I ∣ \lvert I \rvert I : 物品总集合

1.3.1 信息熵(H),基尼系数(G)

H = − ∑ i = 1 n p ( i ) l o g ( p ( i ) ) H = - \sum_{i=1}^{n} p(i)log(p(i)) H=i=1np(i)log(p(i))

  • p ( i ) p(i) p(i) : 物品 i i i 的流行度/所有物品的流行度之和
  • 物品的流行度:对物品产生过行为的用户总数

G = 1 n − 1 ∑ j = 1 n ( 2 j − n − 1 ) p ( i j ) G = \frac{1}{n-1}\sum_{j=1}^{n}(2j - n - 1)p(i_{j}) G=n11j=1n(2jn1)p(ij)

  • i j i_j ij : 根据物品流行度 p ( ) p() p() 从小到大排序的物品列表中的 j t h j_{th} jth 个物品

1.3.2 马太效应

马太效应:强者更强,弱者更弱,在推荐问题中,会存在热门问题更热,长期霸占首页展示获得更多的曝光机会.

1.3.3 如何检测推荐算法是否存在马太效应

1.从原始的用户行为中计算出物品的流行度和基尼系数 G 1 G_1 G1

2.从推荐算法给出的推荐结果列表中计算出物品流行度的基尼系数 G 2 G_2 G2

3.如果 G 2 > G 1 G_2 > G_1 G2>G1 ,推荐算法存在马太效应

1.4 Diversity(多样性)

用户的兴趣往往是多样的,但具体到用户访问推荐系统的某一刻兴趣往往是单一的,如果推荐结果也比较单一极有可能不能覆盖到用户此刻的兴趣.

D i v e r s i t y = 1 − ∑ i , j ∈ R ( u ) , i ≠ j S ( i , j ) 1 2 ∣ R ( u ) ∣ ( ∣ R ( u ) ∣ − 1 ) Diversity = 1 - \frac{\sum_{i,j\in R(u),i \neq j} S(i, j)}{\frac{1}{2}\lvert R(u)\rvert(\lvert R(u)\rvert -1)} Diversity=121R(u)(R(u)1)i,jR(u),i=jS(i,j)

  • s ( i , j ) ∈ [ 0 , 1 ] s(i, j) \in [0, 1] s(i,j)[0,1] : 物品 $i, j $之间的相似度

D = 1 ∣ U ∣ ∑ u ∈ U D i v e r s i t y ( R ( u ) ) D = \frac{1}{\lvert U \rvert}\sum_{u\in U} Diversity(R(u)) D=U1uUDiversity(R(u))

1.5 Recall(召回率)

R e c a l l = ∑ u ∣ R ( u ) ⋂ T ( u ) ∣ ∑ u ∣ T ( u ) ∣ Recall = \frac{\sum_{u} \lvert R(u) \bigcap T(u) \rvert}{\sum_{u} \lvert T(u) \rvert} Recall=uT(u)uR(u)T(u)

  • R ( u ) R(u) R(u) : 给用户 u u u 推荐的 N N N 个物品
  • T ( u ) T(u) T(u) : 用户 u u u 在测试集上的真实喜欢物品的集合

1.6 Precision

P r e c i s i o n = ∑ u ∣ R ( u ) ⋂ T ( u ) ∣ ∑ u ∣ R ( u ) ∣ Precision = \frac{\sum_{u} \lvert R(u) \bigcap T(u) \rvert}{\sum_{u} \lvert R(u) \rvert} Precision=uR(u)uR(u)T(u)

1.7 Novelty(新颖性)

新颖:推荐用户没有见过的,推荐结果的平均流行度,一定程度上可以比较粗犷的反映新颖性.

1.8 Serendipity(惊喜度)

令人惊喜的推荐结果:推荐的结果跟用户的喜好不相似,但是用户对推荐的结果很满意.

1.9 Trust(信任度)

推荐结果的让用户信任,会增加用户和推荐系统的交互行为

1.10 Real-time(实时性)

  1. 在用户和推荐系统交互的过程中可以实时的更新推荐列表

  2. 可以实时的将新的物品进行推荐

1.11 Robustness(健壮性:推荐系统抗击作弊的能力)

  1. 尽量使用代价较高的用户行为

  2. 对数据进行攻击检测,清洗异常数据

2.基于邻域的算法

2.1 UserCF

  1. 找到和目标用户相似的用户集合
  2. 从这个集合当中,推荐给用户没有见过的物品

2.1.1 相似度计算(基于物品集合计算相似度)

1. Jaccard

W u v = ∣ N ( u ) ⋂ N ( v ) ∣ ∣ N ( u ) ⋃ N ( v ) ∣ W_{uv} = \frac{\lvert N(u) \bigcap N(v) \rvert}{\lvert N(u) \bigcup N(v) \rvert} Wuv=N(u)N(v)N(u)N(v)

2. 余弦相似度

W u v = ∣ N ( u ) ⋂ N ( v ) ∣ ∣ N ( u ) ∣ ∣ N ( v ) ∣ W_{uv} = \frac{\lvert N(u) \bigcap N(v) \rvert}{\sqrt{\lvert N(u) \rvert \lvert N(v) \rvert}} Wuv=N(u)N(v) N(u)N(v)

  • N ( u ) N(u) N(u) : 表示用户 u u u 曾经有过正反馈的物品集合
  • N ( v ) N(v) N(v) : 表示用户 v v v 曾经有过正反馈的物品集合

3. 相似度计算的改进(用户相似度矩阵)

两用户计算相似度,时间复杂度: O ( ∣ U ∣ ∗ ∣ U ∣ ) O(\lvert U \rvert* \lvert U \rvert) O(UU)

事实上,很多用户之间并有交集,很多 ∣ N ( u ) ⋂ N ( v ) ∣ = 0 \lvert N(u) \bigcap N(v) \rvert = 0 N(u)N(v)=0的情况.

所以,可以之计算出用户两两之间有交互的用的相似度.

  1. 构建物品到用户的倒排表
  2. 建立用户的相似度矩阵
item1 item2 item3
user
A a b d
B a c None
C b e None
D c d e
user1 user2
item
a A B
b A C
c B D
d A D
e C D

如何构造相似度矩阵WMat : 为余弦相似度中的分子

  • item.a : W [ A ] [ B ] , W [ B ] [ A ] W_{[A][B]},W_{[B][A]} W[A][B],W[B][A]位置权重加1
  • item.b : W [ A ] [ C ] , W [ A ] [ C ] W_{[A][C]},W_{[A][C]} W[A][C],W[A][C]位置权重加1
WMat
A B C D
A 0 1 1 1
B 1 0 0 1
C 1 0 0 1
D 1 1 1 1

4.计算对物品的喜爱度

P ( u , i ) = ∑ v ∈ S ( u , K ) ⋂ N ( i ) w u v r v i P(u, i) = \sum_{v \in S(u, K) \bigcap N(i)} w_{uv} r_{vi} P(u,i)=vS(u,K)N(i)wuvrvi

  • S ( u , K ) S(u,K) S(u,K): 跟用户 u u u 最相似的top K个用户
  • N ( i ) N(i) N(i) : 对物品 i i i 有过行为的的用户集合
  • S ( u , K ) ⋂ N ( i ) S(u, K) \bigcap N(i) S(u,K)N(i) : 在与 i i i有过交互行为的用户中取前top K个
  • W u v W_{uv} Wuv : 用户 u , v u, v u,v 的相似度
  • r v i r_{vi} rvi : 用户 v v v ,对物品 i i i 的喜好度(单一反馈:喜欢不喜欢,为1)

计算用例(根据WMat)

P ( A , c ) = W A , B + W A , D = 1 6 + 1 3 = 0.7416 P(A, c) = W_{A,B} + W_{A, D} = \frac{1}{\sqrt{6}}+\frac{1}{3}= 0.7416 P(A,c)=WA,B+WA,D=6 1+31=0.7416

  1. 计算用户 A A A 对 物品 c c c,的喜爱程度
  2. 跟物品 c c c,有过交互行为的用户只有 B , D B, D B,D

2.1.2 User-IIF

削弱两两用户之间共有的热门物品对相似度计算的影响.

W u v = ∑ i ∈ N ( u ) ⋂ N ( v ) 1 l o g 1 + ∣ N ( i ) ∣ ∣ N ( u ) ∣ ∣ N ( v ) ∣ W_{uv} = \frac{\sum_{i\in N(u)\bigcap N(v)} \frac{1}{log1 + \lvert N(i) \rvert}}{\sqrt{\lvert N(u) \rvert \lvert N(v) \rvert}} Wuv=N(u)N(v) iN(u)N(v)log1+N(i)1

1 l o g 1 + ∣ N ( i ) ∣ \frac{1}{log1 + \lvert N(i) \rvert} log1+N(i)1 : 物品热度的倒数

2.1.3 相似度计算(基于用户-物品的评分矩阵)

RMat # 评分矩阵
user p1 p2 p3 p4 p5
0 a 5 3 4 4 NaN
1 b 3 1 2 3 3.0
2 c 4 3 4 3 5.0
3 d 3 3 1 5 4.0
4 e 1 5 5 2 1.0
  1. Pearson相关系数

s i m ( a , b ) = ∑ p ∈ P ( r a , p − r ˉ a ) ( r b , p − r ˉ b ) ∑ p ∈ P ( r a , p − r ˉ a ) 2 ∑ p ∈ P ( r b , p − r ˉ b ) 2 sim(a, b) = \frac{\sum_{p\in P}(r_{a,p}-\bar{r}_a)(r_{b,p} - \bar{r}_b)}{\sqrt{\sum_{p\in P}(r_{a,p} - \bar{r}_a)^2}\sqrt{\sum_{p\in P}(r_{b,p} - \bar{r}_b)^2}} sim(a,b)=pP(ra,prˉa)2 pP(rb,prˉb)2 pP(ra,prˉa)(rb,prˉb)

  • P P P : 物品集合
  • a , b a,b a,b : 用户 a , b a,b a,b
  • r a , p r_{a,p} ra,p : 用户 a a a 对物品 p p p 的评分
  • r ˉ a \bar{r}_a rˉa : 用户 a a a 对其评价过物品的平均分
  • s i m ( a , b ) sim(a, b) sim(a,b) :相似度的取值区间在[-1, 1]
  1. 预测评分

p r e d ( a , p ) = r ˉ a + ∑ b ∈ N s i m ( a , b ) ∗ ( r b , p − r ˉ b ) ∑ b ∈ N s i m ( a , b ) pred(a,p) = \bar{r}_a + \frac{\sum_{b\in N}sim(a, b)*(r_{b,p} - \bar{r}_b)}{\sum_{b\in N}sim(a,b)} pred(a,p)=rˉa+bNsim(a,b)bNsim(a,b)(rb,prˉb)

  • N N N : topN个与 a a a 相似的用户

2.2 ItemCF

  1. 计算物品的相似度
  2. 根据物品的相似度和用户购买历史给用户推荐相似的物品

W i j = ∣ N ( i ) ⋂ N ( j ) ∣ ∣ N ( i ) ∣ W_{ij} = \frac{\lvert N(i)\bigcap N(j) \rvert}{\lvert N(i) \rvert} Wij=N(i)N(i)N(j)

  • N ( i ) N(i) N(i) : 喜欢物品 i i i 的用户数量
  • ∣ N ( i ) ⋂ N ( j ) ∣ \lvert N(i) \bigcap N(j) \rvert N(i)N(j) : 同时喜欢物品 i i i j j j 的用户数量
  • W i j W_{ij} Wij : 喜欢物品 i i i 的用户中有多少比例也喜欢物品 j j j

2.2.1 针对热门物品的改进

如果物品很热门,很多人喜欢,那么热门物品会和其他物品的相似度增加.不利于对长尾物品的挖掘,增加了马太效应

W i j = ∣ N ( i ) ⋂ N ( j ) ∣ ∣ N ( i ) ∣ ∣ ( N ( j ) ∣ W_{ij} = \frac{\lvert N(i) \bigcap N(j) \rvert}{\sqrt{\lvert N(i) \rvert \lvert(N(j)\rvert}} Wij=N(i)(N(j) N(i)N(j)

对分母增加了物品 j j j 的权重,减小热门物品对相似度的影响.

同理:ItemCF的计算和UserCF类似:

  1. 构建用户-物品的倒排表(避免没有用户交集的物品相似度计算)
  2. 构建物品的相似度矩阵W

P ( u , j ) = ∑ i ∈ N ( u ) ⋂ S ( j , K ) w j i r u i P(u,j) = \sum_{i\in N(u) \bigcap S(j, K)} w_{ji}r_{ui} P(u,j)=iN(u)S(j,K)wjirui

2.2.2 针对过活跃用户的改进IUF(Inverse User Frequence)

ItemCF两个物品的相似度是基于共同喜它们的Users,所以每个用户的历史纪录都会影响到相似度计算,如果有的用户过于活跃,因为这一个用户产生很大的开销.

W i j = ∑ u ∈ N ( i ) ⋂ N ( j ) 1 l o g 1 + ∣ N ( u ) ∣ ∣ N ( i ) ∣ ∣ N ( j ) ∣ W_{ij} = \frac{\sum_{u\in N(i)\bigcap N(j)} \frac{1}{log1+\lvert N(u) \rvert}}{\sqrt{\lvert N(i) \rvert \lvert N(j) \rvert}} Wij=N(i)N(j) uN(i)N(j)log1+N(u)1

IUF是通过对两两物品的交集用户的活跃度进行变换,减小过活跃用户的影响.

2.2.3 物品相似度的归一化

ItemCF中对相似度矩阵进行最大值归一化,可以提高推荐的准确率,推荐结果的多样性.一般情况下,热门的类其类内的物品相似度一般比较大.如果不进行归一化,就会推荐热门类内的物品,增加马太效应.会降低模型覆盖率.

W ′ = W i j M a x j W i j W^{'} = \frac{W_{ij}}{Max_{j} W_{ij}} W=MaxjWijWij

2.2.4 物品相似度计算(用户-物品评分矩阵)

RMat # 评分矩阵
user p1 p2 p3 p4 p5
0 a 5 3 4 4 NaN
1 b 3 1 2 3 3.0
2 c 4 3 4 3 5.0
3 d 3 3 1 5 4.0
4 e 1 5 5 2 1.0
  1. 余弦相似度

s i m ( a ⃗ ⋅ b ⃗ ) = a ⃗ ⋅ b ⃗ ∣ a ⃗ ∣ ∗ ∣ b ⃗ ∣ sim(\vec{a}\cdot \vec{b}) = \frac{\vec{a}\cdot \vec{b}}{\lvert \vec{a}\rvert*\lvert \vec{b}\rvert} sim(a b )=a b a b

  • a ⃗ \vec a a : 物品 a a a 对应的评分向量
  • b ⃗ \vec b b : 物品 b b b 对应的评分向量
  1. 改进余弦相似度(考虑了用户平均评分的差异)

s i m ( p 1 , p 2 ) = ∑ u ∈ U ( r u , p 1 − r ˉ u ) ( r u , p 2 − r ˉ u ) ∑ u ∈ U ( r u , p 1 − r ˉ u ) 2 ∑ u ∈ U ( r u , p 2 − r ˉ u ) 2 sim(p_1, p_2) = \frac{\sum_{u\in U}(r_{u,p_1} - \bar{r}_u)(r_{u,p_2} - \bar{r}_u)}{\sqrt{\sum_{u\in U}(r_{u,p_1}-\bar{r}_u)^2}\sqrt{\sum_{u\in U}(r_{u,p_2} - \bar{r}_u)^2}} sim(p1,p2)=uU(ru,p1rˉu)2 uU(ru,p2rˉu)2 uU(ru,p1rˉu)(ru,p2rˉu)

预测评分

p r e d ( a , p 1 ) = ∑ p i ∈ r a t e d I t e m s ( u ) s i m ( p i , p 1 ) ∗ r a , p i ∑ p i ∈ r a t e d I t e m s ( a ) s i m ( p i , p 1 ) pred(a, p_1) = \frac{\sum_{p_i\in ratedItems(u)} sim(p_i, p_1)*r_{a,p_i}}{\sum_{p_i\in ratedItems(a)}sim(p_i, p_1)} pred(a,p1)=piratedItems(a)sim(pi,p1)piratedItems(u)sim(pi,p1)ra,pi

2.2.5 哈利波特问题

ItemCF算法对图书推荐问题中,很多图书都和<哈利波特>相关,主要是哈利波特太畅销了,大多数买书的人都会同时购买<哈利波特>.

w i j = ∣ N ( i ) ⋂ N ( j ) ∣ ∣ N ( i ) ∣ ∣ N ( j ) ∣ w_{ij} = \frac{\lvert N(i)\bigcap N(j) \rvert}{\sqrt{\lvert N(i)\rvert \lvert N(j) \rvert }} wij=N(i)N(j) N(i)N(j)

如果 j j j 非常热门, ∣ N ( i ) ⋂ N ( j ) ∣ \lvert N(i)\bigcap N(j) \rvert N(i)N(j),会很接近 ∣ N ( i ) ∣ \lvert N(i) \rvert N(i),尽管分母已经 j j j的热度,但是实际应用中,热门商品仍会获得很高的相似度.

解决方法:增加对热门物品的惩罚

W i j = ∣ N ( i ) ⋂ N ( j ) ∣ ∣ N ( i ) ∣ 1 − α ∣ N ( j ) ∣ α W_{ij} = \frac{\lvert N(i)\bigcap N(j) \rvert}{\lvert N(i)\rvert^{1-\alpha}\lvert N(j)\rvert^{\alpha}} Wij=N(i)1αN(j)αN(i)N(j)

  • α \alpha α : α ∈ [ 0.5 , 1 ] \alpha \in [0.5, 1] α[0.5,1]
  • α = 0.5 \alpha = 0.5 α=0.5 : 准确率和召回率最高
  • α 越 大 \alpha 越大 α : 覆盖率越高,推荐结果的平均热度降低

2.3 UserCF vs ItemCF

UserCF ItemCF
Item
性能 用户少于物品 物品少于用户
领域 时效较强,个性化弱 长尾挖掘,个性化强
实时性 用户新行为不会立即反馈到推荐结果 用户的新行为会实时影响推荐结果
冷启动 新用户不友好,用户矩阵定时更新,新物品产生用户行为后才会被推荐给相似用户 新用户产生一个行为即可为其推荐,物品矩阵不能实时更新
推荐理由 推荐结果可解释性弱 根据用户的历史推荐,结果使用户比较信服

你可能感兴趣的:(推荐方法-1:UserCF&ItemCF)