矩陣分解假設“潛在因素”,例如對用戶的意大利食物的偏好和項目食物的意外性與矩陣中的評級有關 .
因此,整個問題類型轉變為矩陣重構問題,存在許多不同的解決方案 . 一個簡單的,可能很慢的解決方案是(除了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的許多優化和其他算法或修改版本也可以并行運行 .
一些好的讀物: