矩阵分解假设“潜在因素”,例如对用户的意大利食物的偏好和项目食物的意外性与矩阵中的评级有关 .
因此,整个问题类型转变为矩阵重构问题,存在许多不同的解决方案 . 一个简单的,可能很慢的解决方案是(除了ALS和其他一些矩阵重建的可能性)使用梯度下降算法逼近矩阵 . 我推荐这篇简短的文章ieee article about recommender systems .
提取潜在因素是一个不同的问题 .
因此,GDM的实现可能如下所示:
public void learnGDM(){
//traverse learnSet
for(int repeat = 0; repeat < this.steps; repeat++){
for (int i = 0; i < this.learnSet.length; i++){
for (int j = 0; j < this.learnSet[0].length; j++){
if(this.learnSet[i][j] > 0.0d){
double Rij = this.learnSet[i][j];
for(int f = 0 ; f <= latentFactors; f++){
double error = Rij - dotProduct(Q.getRow(i), P.getRow(j));/*estimated_Rij;*/
//ieee computer 1.pdf
double qif = Q.get(i, f);
double pif = P.get(j, f);
double Qvalue = qif + gradientGamma * (error * pif - gradientLambda * qif);
double Pvalue = pif + gradientGamma * (error * qif - gradientLambda * pif);
Q.set(i,f, Qvalue);
P.set(j, f, Pvalue);
}
}
}
}
//check global error
if(checkGlobalError() < 0.001d){
System.out.println("took" + repeat + "steps");
break;
}
}
学习集是包含评级矩阵的二维数组,如ieee文章中所述 . GDM算法每次迭代一次改变评级向量P和Q,以便它们接近评级矩阵中的评级 . 然后可以通过P和Q的点积计算“未给定”等级 . 然后,对于未给定的等级,最高估计将是推荐 .
这就是它的开始 . GDM的许多优化和其他算法或修改版本也可以并行运行 .
一些好的读物: