# 协同过滤推荐算法

`协同过滤推荐`作为最为主流与经典的技术之一，它是基于这样的假设：用户如果在过去对某些项目产生过兴趣，那么将来他很可能依然对其保持热忱。协同过滤技术又可依据是否采用了机器学习思想建模进一步划分为基于内存的协同过滤（Memory-based CF）与基于模型的协同过滤技术（Model-based CF）。

• userCF
• itemCF

• 经典SVD
• FunkSVD
• BiasSVD
• FISM
• SVD++

## 基于内存的协同过滤推荐

### 基于用户的协同过滤（User CF）

#### 1.计算用户相似度

```def UserSimilarity(train):
W = dict()
for u in train.keys():
for v in train.keys():
if u == v:
continue
W[u][v] = len(train[u] & train[v])
W[u][v] /= np.sqrt(len(train[u]) * len(train[v]) * 1.0)
return W
```

```def UserSimilarity(train):
# 建立item -> users table
item_users = dict()
for u, items in train.items():
for i in items.keys():
if i not in item_users:
item_users[i] = set()
# 记录每个用户反馈过的物品数
N = dict()
# 记录每两个用户共同反馈过的物品数
C = dict()
for i, users in item_users.items():
for u in users:
N[u] += 1
for v in users:
if u == v:
continue
C[u][v] += 1
# 计算用户相似度权重矩阵
W = dict()
for u, related_users in C.items():
for v, cuv in related_users.items():
W[u][v] = cuv / np.sqrt(N[u] * N[v])

return W

```

#### 2.基于相似用户推荐物品

```def Recommend(user_id, train, W, K):
rank_rs = dict()
interacted_items = train[user_id]
for v, wuv in sorted(W[user_id].items(), key=lambda x:x[1], reverse=True)[0:K]:
for i, rvi in train[v].items:
if i in interacted_items:
# 过滤掉该用户之前反馈过的物品
continue
rank_rs[i] += wuv * rvi
return rank_rs

```

### 基于物品的协同过滤（Item CF）

#### 1.计算物品相似度

```def ItemSimilarity(train):
# 记录每个物品被反馈过的用户数
N = dict()
# 记录共同喜欢两个物品的用户数
C = dict()
for u, items in train.items():
for i in items:
N[i] += 1
for j in items:
if i == j:
continue
C[i][j] += 1
# 计算物品i和j的相似度矩阵
W = dict()
for i, related_items in C.items():
for j, cij in related_items.items():
W[i][j] = cij / np.sqrt(N[i] * N[j])

return W
```

#### 2.基于相似用户推荐物品

```def Recommendation(train, user_id, W, K):
rank_rs = dict()
u_items = train[user_id]
for i, rui in u_items.items():
for j, wij in sorted(W[i].items(), key=lambda x: x[1], reverse=True)[0:K]:
if j in u_items:
continue
rank_rs[j] += rui * wij
return rank_rs
```

### UserCF 和 Item CF 比较

• UserCF 给用户推荐那些和他有共同兴趣爱好的用户喜欢的物品，而 ItemCF 给用户推荐那些和他之前喜欢的物品类似的物品。
• UserCF 的推荐结果着重于反映和用户兴趣相似的小群体的热点，而 ItemCF 的推荐结果着重于维系用户的历史兴趣。
• UserCF 的推荐注重社会化，反映了用户所在的小型兴趣群体中物品的热门程度，而 ItemCF 的推荐更加个性化，反映了用户自己的兴趣传承。
• 从技术上考虑，UserCF 需要维护一个用户相似度的矩阵，而 ItemCF 需要维护一个物品相似度矩阵。
• 从存储的角度说，如果用户很多，那么维护用户兴趣相似度矩阵需要很大的空间， 同理，如果物品很多，那么维护物品相似度矩阵代价较大。

## 基于模型的协同过滤推荐

### 经典 SVD

（1） 对 M 矩阵的 missing data 进行填充，整体均值、用户均值、物品均值或 0

（2） 求解 SVD 问题，得到 U 矩阵和 V 矩阵

（3） 利用 U 和 V 矩阵的低秩 k 维矩阵来估计 M

（1） missing data（在数据集占比超过 95%）和 observe data 权重一样

（2） 最小化过程没有正则化（只有最小方差），容易产生过拟合

（3）计算复杂度很高，特别是在稠密的大规模矩阵上更是非常慢。

### FunkSVD

2006 年 Netflix Prize 开始后，Simon Funk 在博客上公布了一个算法(称为 Funk-SVD)，解决了传统 SVD 的几个缺点。Simon Funk 提出的矩阵分解方法后来被 Netflix Prize 的冠军称为 Latent Factor Model(简称为 LFM)，即隐语义模型。FunkSVD，将矩阵 M 分解为了 2 个低秩的 user，item 矩阵，

（1）将用户 u 对物品 i 的打分分解成用户的隐向量 vu，以及物品的隐向量 vi

（2）用户 u 和物品 i 的向量点积（inner product）得到的 value，可以用来代表用户 u 对物品 i 的喜好程度，分数越高代表该 item 推荐给用户的概率就越大

### BiasSVD

• ：训练集中所有记录的评分的全局平均数。比如有的网站的评分普遍很高，有的普遍很低。
• bu：用户偏置(user bias)项。这一项表示了用户的评分习惯中和物品没有关系的那种因素。比如有些用户就是比较苛刻，对什么东西要求都很高，那么他的评分就会偏低，而有的用户恰恰相反。
• bi 物品偏置(item bias)项。这一项表示了物品接受的评分中和用户没有什么关系的因素。比如有些物品本身质量就很高，因此获得的评分相对都比较高。

#### SVD++

FunkSVD 模型和 BiasSVD 都可以看成是 user-based 的 CF 模型，直接将用户 id 映射成隐向量，而 FISM 模型可以看成是 item- based 的 CF 模型，将用户交户过的 item 的集合映射成隐向量。一个是 userid 本身的信息，一个是 user 过去交互过的 item 的信息，如何结合 user- base 和 item-base 这两者本身的优势呢？

SVD++方法正是这两者的结合，其核心数学表达如下：

1，项亮，推荐系统实践

2，辛俊波，推荐系统中的深度匹配模型，https://zhuanlan.zhihu.com/p/101136699

3，推荐系统 SVD 和 SVD++算法，https://www.cnblogs.com/shenxiaolin/p/9494579.html

0 条评论

• ### 推荐系统冷启动

冷启动是推荐系统的重要挑战之一。那么，什么是冷启动？如何设计一个好的冷启动方案？本文将主要从以下7个方面给大家讲清楚这些问题：

• ### 盘点 | Python自带的那些数据集

在学习Pandas透视表的时候，大家应该注意到，我们使用的案例数据"泰坦尼克号"来自于seaborn自带的在线数据库，我们可以通过seaborn提供的函数loa...

• ### 算法工程师-SQL进阶：温柔的陷阱-NULL

我们以往遇到的编程语言基本都是基于二值逻辑的，即逻辑真值只有true和false两个。而 SQL 语言则采用一种特殊的逻辑体系——三值逻辑，逻辑真值除了true...

• ### 推荐系统基础知识储备

1.1.1 推荐系统概述 首先，需要申明一点的就是推荐系统！=推荐算法。推荐系统是一套完善的推荐机制，包括前期数据的准备、具体推荐的过程(这个过程可能是一套复...

• ### 基于图卷积的价格感知推荐

Paper：Price-aware Recommendation with Graph Convolutional Networks

• ### 9102年，你已经是个大春节了，你要自己学会用AI了

2019 年，AI 为我们「渐渐无趣」的春节增色不少……它不仅可以帮助人们送出新年祝福，也能为人高效传递信息。在繁忙的春运期间，人工智能也能帮助人们更快地回到家...

• ### 在人工智能这件事情上，马云走了一条与众不同的道路

随着人工智能在这些年的进展被AlphaGo显性化，它开始成为中外科技巨头布局的重点，甚至一些公司还将AI当做决定未来的战略。学术界同样十分重视人工智能技术，Al...

• ### 大数据揭秘：AI工程师真的能拿到百万年薪吗？

近年来，人工智能技术在各行各业中的应用越来越普及，相关专业技术人才也是供不应求，各大公司或是创业公司不惜重金招募AI人才。最近一项统计显示，人工智能相关职位平...