看到有两种做法。
第一种,矩阵分解,预测缺失值
这篇文章讲得比较全面:
http://blog.youkuaiyun.com/zhongkejingwang/article/details/43083603
这篇也还好:
http://www.cnblogs.com/FengYan/archive/2012/05/06/2480664.html
基础版本的SVD
就是有一个User-item的评分矩阵R(每行代表每个user对不同item的评分)。然后这个矩阵有些值是缺失的。
假设矩阵是U*I大小。将矩阵进行分解,R(U*I)=P(U*K)*Q(K*I)。目的是,要让这个分解,尽可能地拟合已知的评分值。
预测值,和真实值间,就会存在一个误差。就可以计算总的误差平方和SSE。
通过梯度下降等方法,只要通过训练把SSE降到最小那么P、Q就能最好地拟合R了。
于是,未知的值也计算出来了。防止过拟合RSVD
给P和Q,加上正则
升级版
比如加入用户偏置的
加上属性的非对称的
R(u)表示用户u评过分的商品集合,N(u)表示用户u浏览过但没有评过分的商品集合,Xj和Yj是商品的属性。这个模型很有意思,看预测式子,用户矩阵P已经被去掉了,取而代之的是利用用户评过分的商品和用户浏览过尚未评分的商品属性来表示用户属性,这有一定的合理性,因为用户的行为记录本身就能反应用户的喜好。而且,这个模型可以带来一个很大的好处,一个商场或者网站的用户数成千上万甚至过亿,存储用户属性的二维矩阵会占用巨大的存储空间,而商品数却没有那么多,所以这个模型的好处显而易见。但是它有个缺点,就是迭代时间太长了,这是可以预见的,以时间换空间嘛。
比如SVD++
这里的N(u)表示用户u行为记录(包括浏览的和评过分的商品集合)。
第二种,降维,新用户进来计算相似性
这篇文章:
http://blog.youkuaiyun.com/wuyanyi/article/details/7964883
这时候,就分成三个矩阵相乘:
任意一个M*N的矩阵A(M行*N列,M>N),可以被写成三个矩阵的乘机:
1.U:(M行M列的列正交矩阵)
2.S:(M*N的对角线矩阵,矩阵元素非负)
3.V:(N*N的正交矩阵的倒置)
即A=U*S*V‘(注意矩阵V需要倒置)
S是个很特别的矩阵,对角矩阵!并且,越靠前,重要性越高。所以,可以做近似,取前K个元素。达到降维的目的。
降维后,来了一个新用户,假设它的评分向量是 Bob, 则用它和U,S相乘,就可以得到一个表示用户的向量。
如上图(图中第二行式子有错误,Bob的转置应为行向量)。
对图中公式不做证明,只需要知道结论,结论是得到一个Bob的二维向量,即知道Bob的坐标。
基于这样的新坐标,就可以计算新用户Bob和已有用户的相似性。再根据已有用户的评分,给Bob做推荐。
物理意义
《数学之美》说的,分成三个矩阵的时候,都具有非常清晰的物理含义。按照值大小,只有他们对每个类的归属情况。
有些数学上的,嗯,有机会再看…
http://www.cnblogs.com/leftnoteasy/archive/2011/01/19/svd-and-applications.html
http://blog.youkuaiyun.com/zhongkejingwang/article/details/43053513