SVD推荐算法(二)这次讲解的是model-based的SVD推荐算法。跟ALS推荐算法一样,都是矩阵分解的推荐算法,只不过求解的方式不同而已。假如评分矩阵是R,那么我们希望拟合这样一个模型R=U*M其中U是user特征,M是item特征。假如一个user的特征是u,一个item的特征是i,那么这个user对这个item的评分就是u*i(两个特征的内积)。损失函数是:然后我们的目标就是最小化这个E了。这是SVD矩阵分解预测评分最基本的一种方法。基于这个思想,各种最优化的方式和损失函数的改造也随之提出来了,来优化这个算法。最小化损失函数,我们可以用Batch Gradient Descent,Stochastic Gradient Descent等。损失函数,我们可以加上正则项防止过拟合。矩阵分解模型上,我们可以加上user评分偏差和item评分偏差。我用了论文《A Guide to Singular Value Decomposition for Collaborative Filtering》的一种方法,实现了一个单机版的SVD矩阵分解预测评分。https://github.com/linger2012/svd-for-recommendation-implemented-by-java用到的损失函数是求解用SGD,对于每个已知user-item的评分,都更新一次模型。1000次
...继续阅读
(50)
SVD推荐算法(一)看了不少论文,总结起来用SVD做推荐主要有两种不同的方式。1 本质上是memory-based,只不过先用SVD对user-item的评分矩阵做降维,得到降维后的user特征和item特征,可以分别做userbased的协同过滤和itembased的协同过滤。2 本质上是model-based,跟传统数学意义的SVD没有太大关系,只不过借鉴了SVD分解R=U*S*V这个形式,通过最优化方法进行模型拟合,求得R=U*V。本文主要讲解第一种情况,第二种情况下次再讲。可以参考的论文:《Applying SVD on Generalized Item-based Filtering 》《Application of Dimensionality Reduction in Recommender System -- ACase Study》memory-based的userbased和itembased关键点之一,是user相似度和item相似度的计算。而相似度的计算依赖于特征。最原始的做法,一个user的特征就是她对所有item的打分,而一个item的特征就是所有user对她的打分。在数学意义上,SVD是这样子的,一个M*N矩阵的R可以分解成为三个矩阵相乘的形式,R=U*S*V(U是M*M矩阵,S是M*N的对角矩阵,V是N*N
...继续阅读
(47)
一天一段scala代码(十四)为了更好的驾驭spark,最近在学习scala语言特性,主要看《快学scala》,顺便把一些自己认为有用的代码记下来。package examples
object Example14 extends App{
var ch='9'
var sign= ch match{
case '+' => 1
case '-' => -1
case _ if Character.isDigit(ch) => Character.digit(ch,10) //守卫模式,加上条件
case _ => 0
}
println(sign)
ch='8'
sign= ch match{
case c if Character.isDigit(c) => Character.digit(c,10) //c=ch 变量模式
case _ => 0
}
println(sign)
import scala.math._
var x = Pi
var y = x match{
case Pi => 3.14 //Pi is val,not Pi=x 匹配常量
}
println(y)
def matchConstant(x:Any)=
{
val cPi = Pi
x match
{
...继续阅读
(59)