# SVD-推荐

《A Guide to Singular Value Decomp osition for Collab orative Filtering》

用户对电影的打分可以用feature建立联系：用户喜欢动作片还是科幻片，该电影是喜剧还是传记。\
建立两个矩阵：每个用户对各个feature的喜欢程度，电影的各个feature程度。则两矩阵相乘的结果与原来的评分越近越好，即期望越销越好。

$$
E=\frac 12 \sum_{i=1}^n \sum_{j=1}^m I_{ij}(V_{ij}-p(U_i,M_j))^2 + \frac {k_u}{2}\sum_{i=1}^n ||U_i||^2 + \frac {k_m}{2} \sum_{j=1}^m ||M_j||^2
$$

其中n表示用户数目，m表示物品数目，$$I_ij$$是用来表示用户i有没有对物品j评过分，因为我们只需要评过分的那些越接近越好，没评过的就不需要考虑，$$V_ij$$表示训练数据中给出的评分，也就是实际评分，$$p(U_i,M_j)$$表示我们对用户i对物品j的评分的预测，结果根据两向量点乘得到，后面的两项主要是为了防止过拟合，之所以都加了系数1/2是为了等会求导方便。

用梯度下降法求解,算法流程：

$$
1. Set the starting values of matrices U,M.
2. Repeat
    - (a) Compute gradients \Delta_U and \Delta_M 
    - (b) Set U \leftarrow U-\mu\Delta_U , M \leftarrow M-\mu_\Delta_M .
until the vaildation RMSE start to increase
$$

其中梯度：

$$
\frac{\partial E}{\partial U_i} = \sum_{j=1}^m I_{ij}((V_{ij}-p(U_i,M_j))M_j)-K_uU_i , i=1,\ldots,n  \\
\frac{\partial E}{\partial M_j} = \sum_{i=1}^n I_{ij}((V_{ij}-p(U_i,M_j))U_j)-K_mM_j , j=1,\ldots,m
$$

上述算法被称为批处理式学习算法，因为它计算的是整个矩阵。\
不完全增量式学习

$$
E_i = \frac 12 \sum_{i=1}^n \sum_{j=1}^m I_{ij}(V_{ij}-p(U_i,M_j))^2 + \frac {k_u}{2}\sum_{i=1}^n ||U_i||^2 + \frac {k_m}{2} \sum_{j=1}^m I_{ij}(||M_j||)^2
$$

梯度:

$$
\frac{\partial E_i}{\partial U_i} = \sum_{j=1}^m I_{ij}((V_{ij}-p(U_i,M_j))M_j)-K_uU_i , i=1,\ldots,n  \\
\frac{\partial E_i}{\partial M_j} 
= I_{ij}((V_{ij}-p(U_i,M_j))U_j)-K_mI_{ij}(M_j)  \\
=I_{ij}[(V_{ij}-p(U_i,M_j))U_j)-K_mM_j], j=1,\ldots,m
$$

完全增量式学习是对每一个评分进行期望计算，期望如下：

还有些SVD算法考虑了每个用户，每个物品的bias,这里所谓的bias就是每个人的偏差，比如一个电影a,b两人都认为不错，但是a评分方便比较保守，不错的给3分，b评分比较宽松，不错的给4分，故一下的评分方式考虑到了每个用户，每个物品的bias，要比上述算法更加精准。原来评分的话是直接计算$$userfeature * itemfeature^T$$, ，但现在要考虑各种bias，如下：

$$
p(U_i,M_j,\alpha_i,\beta_j) = a+U_i^TM_j+\alpha_i+\beta_j
$$

其中a表示所有评分的平均数，$$\alpha_i$$表示用户i的bias，$$\beta_i$$表示物品j的偏差，相乘的矩阵还是和上面一样的意思。\
期望和bias求导（矩阵求导的式子不变）：

$$
E_{ij} = \frac 12 (V_{ij}-p(U_i,M_j,\alpha_i,\beta_j))^2 + \frac {k_u}{2} ||U_i||^2 + \frac {k_m}{2} I_{ij}(||M_j||)^2+ \frac {k_b}{2} (\alpha_i^2 + \beta_j^2) \\
\frac{\partial E_{ij}}{\partial U_i} =  (V_{ij}-p(U_i,M_j,\alpha_i,\beta_j))-K_b\alpha_i  \\
\frac{\partial E_{ij}}{\partial M_j} 
= (V_{ij}-p(U_i,M_j,\alpha_i,\beta_j))-K_b\beta_j
$$

评测效果，就是误差平方和：

$$
RMSE(P,A) = \sqrt \frac {\sum_{i=1}^n \sum_{j=1}^m J_{ij}(A_{ij}-P_{ij})^2}{\sum_{i=1}^n \sum_{j=1}^m J_{ij}}
$$

## 基于矩阵分解的推荐算法

[ 基于矩阵分解的推荐算法，简单入门](http://blog.csdn.net/accumulate_zhang/article/details/52040198) 跟上面基本一样

### 参考佳文

[ SVD在推荐系统中的应用与实现(c++)](http://blog.csdn.net/wangyuquanliuli/article/details/43850931)\
[浅谈矩阵分解在推荐系统中的应用](http://www.cnblogs.com/hxsyl/p/4881453.html)\
[非负矩阵分解（NMF）](http://blog.csdn.net/acdreamers/article/details/44663421)

[推荐算法概览](http://geek.csdn.net/news/detail/91818)

[饿了么推荐系统：从0到1](https://mp.weixin.qq.com/s?__biz=MzA3MjY1MTQwNQ==\&mid=2649823151\&idx=2\&sn=cf7a4bf0884a88c0b47db4f88b92c491\&chksm=871eb04db069395b0a017997f00ab5911e056dd16c92ef5027750dbe48b31aaf4a1f75cc7d08\&scene=25\&pass_ticket=UhUZubnMPmbSEZDKWHUdhAI65FeJr45Pf3r73xCQK3I%3D#wechat_redirect)

[推荐系统中基于深度学习的混合协同过滤模型](https://zhuanlan.zhihu.com/p/25234865)

[推荐系统本质与网易严选实践](http://geek.csdn.net/news/detail/159638)
