UserCF
先找到相似的用户,再找到他们喜欢的物品
基本思路
- 构建用户评分表
- 计算相似度
余弦相似度:
- 计算推荐结果
计算用户u对物品i的感兴趣程度:
S(u,K)包含和用户u兴趣最接近的K个用户,N(i)是对物品i有过行为的用户集合,Wuv是用户u和用户v的兴趣相似度,rvi是用户v对物品i的兴趣。
可以改进的点
- 用户相似度的改进
- 为了消除稀疏矩阵的影响,可以使用倒排矩阵
ItemCF
先找到用户喜欢的物品,再找到喜欢物品的相似物品
Item算法计算物品相似度的方法是:分析用户的行为记录(评分表),而不是物品的属性。
例如:购买了xx的用户同时购买了yy
基本思路
构建用户评分表 | | a | b | c | d | e | | :—-: | :—-: | :—-: | :—-: | :—-: | :—-: | | A | 3 | 4 | | 3.5 | | | B | 4 | | 4.5 | | 3.5 | | C | | 3.5 | | | 3 | | D | | 4 | | 3.5 | 3 |
计算物品相似度
- 构建用户-物品倒排表 | A | a | b | d | | :—-: | :—-: | :—-: | :—-: | | B | a | c | e | | C | b | e | | | D | b | d | e |
构建同现矩阵(表示同时喜欢两个物品的用户数) | | a | b | c | d | e | | :—-: | :—-: | :—-: | :—-: | :—-: | :—-: | | a | 0 | 1 | 1 | 1 | 1 | | b | 1 | 0 | 0 | 2 | 2 | | c | 1 | 0 | 0 | 0 | 1 | | d | 1 | 2 | 0 | 0 | 1 | | e | 1 | 2 | 1 | 1 | 0 |
计算每个物品有行为的用户数(可以根据倒排表得到) | 物品 | 有行为用户数 | | :—-: | :—-: | | a | 2 | | b | 3 | | c | 1 | | d | 2 | | e | 3 |
计算相似度
最原始公式:
物品之间的相似度矩阵:可以理解为“喜欢i的用户有多少比例喜欢j”
a | b | c | d | e | |
---|---|---|---|---|---|
a | 0 | 0.5 | 0.5 | 0.5 | 0.5 |
b | 0.33 | 0 | 0 | 0.67 | 0.67 |
c | 1.0 | 0 | 0 | 0 | 1.0 |
d | 0.5 | 1.0 | 0 | 0 | 0.5 |
e | 0.33 | 0.67 | 0.33 | 0.33 | 0 |
- 构建评分矩阵(以用户C为例)
用户C的评分矩阵:
物品 | 评分 |
---|---|
a | 0 |
b | 3.5 |
c | 0 |
d | 0 |
e | 3 |
- 计算推荐结果
计算用户u对物品i的兴趣
公式:
N(u):用户u喜欢的物品集合
S(i,K):和物品j最相似的K个物品的集合
Wij:物品i和j的相似度
ruj:用户u对物品j的兴趣
计算推荐结果:
物品 | 评分 |
---|---|
a | 3.25 |
b | 2.0 |
c | 3.0 |
d | 5.0 |
e | 2.33 |
举例:求C对a评分
分数 = 对b评分ba相似度 + 对e评分ea相似度
可改进的点
- 惩罚热门物品