> For the complete documentation index, see [llms.txt](https://json007.gitbook.io/svm/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://json007.gitbook.io/svm/math-linear_algebra/svdtui_jian.md).

# 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)
