推荐方法-1:UserCF&ItemCF

99封情书 提交于 2020-01-16 11:26:01

Summary of recommended methods(1)

1.Metrics

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

1.1 RMSE(均根方误差)

RMSE=u,iT(ruir^ui)2T RMSE = \frac{\sqrt{\sum_{u, i \in T}(r_{ui} - \hat{r}_{ui}})^{2}}{\lvert T \rvert}

  • uu : 用户 uu
  • ii : 物品 ii
  • ruir_{ui} : 用户 uuii 的评分
  • r^ui\hat{r}_{ui} : 算法预测的评分

1.2 MAE(平均绝对值误差)

MAE=u,iTruir^uiT MAE = \frac{\sum_{u,i \in T} \lvert r_{ui} - \hat{r}_{ui} \rvert}{\lvert T \rvert}

RMSE vs MAE

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

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

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

Coverage=uUR(u)I Coverage = \frac{\lvert \bigcup_{u \in U} R(u) \rvert}{\lvert I \rvert}

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

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

H=i=1np(i)log(p(i)) H = - \sum_{i=1}^{n} p(i)log(p(i))

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

G=1n1j=1n(2jn1)p(ij) G = \frac{1}{n-1}\sum_{j=1}^{n}(2j - n - 1)p(i_{j})

  • iji_j : 根据物品流行度 p()p() 从小到大排序的物品列表中的 jthj_{th} 个物品

1.3.2 马太效应

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

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

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

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

3.如果 G2>G1G_2 > G_1 ,推荐算法存在马太效应

1.4 Diversity(多样性)

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

Diversity=1i,jR(u),ijS(i,j)12R(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)}

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

D=1UuUDiversity(R(u)) D = \frac{1}{\lvert U \rvert}\sum_{u\in U} Diversity(R(u))

1.5 Recall(召回率)

Recall=uR(u)T(u)uT(u) Recall = \frac{\sum_{u} \lvert R(u) \bigcap T(u) \rvert}{\sum_{u} \lvert T(u) \rvert}

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

1.6 Precision

Precision=uR(u)T(u)uR(u) Precision = \frac{\sum_{u} \lvert R(u) \bigcap T(u) \rvert}{\sum_{u} \lvert R(u) \rvert}

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

Wuv=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}

2. 余弦相似度

Wuv=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}}

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

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

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

事实上,很多用户之间并有交集,很多N(u)N(v)=0\lvert N(u) \bigcap N(v) \rvert = 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]}位置权重加1
  • item.b : 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)=vS(u,K)N(i)wuvrvi P(u, i) = \sum_{v \in S(u, K) \bigcap N(i)} w_{uv} r_{vi}

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

计算用例(根据WMat)

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

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

2.1.2 User-IIF

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

Wuv=iN(u)N(v)1log1+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}}

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

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相关系数

sim(a,b)=pP(ra,prˉa)(rb,prˉb)pP(ra,prˉa)2pP(rb,prˉ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}}

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

pred(a,p)=rˉa+bNsim(a,b)(rb,prˉb)bNsim(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)}

  • NN : topN个与 aa 相似的用户

2.2 ItemCF

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

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

  • N(i)N(i) : 喜欢物品 ii 的用户数量
  • N(i)N(j)\lvert N(i) \bigcap N(j) \rvert : 同时喜欢物品 iijj 的用户数量
  • WijW_{ij} : 喜欢物品 ii 的用户中有多少比例也喜欢物品 jj

2.2.1 针对热门物品的改进

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

Wij=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}}

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

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

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

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

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

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

Wij=uN(i)N(j)1log1+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}}

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

2.2.3 物品相似度的归一化

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

W=WijMaxjWij W^{'} = \frac{W_{ij}}{Max_{j} W_{ij}}

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. 余弦相似度

sim(ab)=abab sim(\vec{a}\cdot \vec{b}) = \frac{\vec{a}\cdot \vec{b}}{\lvert \vec{a}\rvert*\lvert \vec{b}\rvert}

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

sim(p1,p2)=uU(ru,p1rˉu)(ru,p2rˉu)uU(ru,p1rˉu)2uU(ru,p2rˉ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}}

预测评分

pred(a,p1)=piratedItems(u)sim(pi,p1)ra,pipiratedItems(a)sim(pi,p1) 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)}

2.2.5 哈利波特问题

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

wij=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 }}

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

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

Wij=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}}

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

2.3 UserCF vs ItemCF

UserCF ItemCF
Item
性能 用户少于物品 物品少于用户
领域 时效较强,个性化弱 长尾挖掘,个性化强
实时性 用户新行为不会立即反馈到推荐结果 用户的新行为会实时影响推荐结果
冷启动 新用户不友好,用户矩阵定时更新,新物品产生用户行为后才会被推荐给相似用户 新用户产生一个行为即可为其推荐,物品矩阵不能实时更新
推荐理由 推荐结果可解释性弱 根据用户的历史推荐,结果使用户比较信服
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!