基於內容的推薦 java實現
阿新 • • 發佈:2019-01-03
- 這是本人在cousera上學習機器學習的筆記,不能保證其正確性,謹慎參考
1、下圖是待處理的資料,程式碼使用資料和下圖一樣:
2、思路:對每個使用者假定其為一個3維向量(在程式碼中初始化為[1,1,1]的轉置,然後採用梯度下降法不斷的對這個3維向量的值進行更新),假設更新到最後的向量值為[0,5,0]的轉置,然後使用該向量和電影“Cute puppoes of love”的特徵向量進行計算,即可得到該電影的預測分為4.95。
3、使用梯度下降法對某個使用者的向量進行更新(我在程式碼中沒有考慮正則化這一問題,現在還不懂正則化,後面學會了就附上加了正則化的):
下圖為沒有使用正則化的函式:
4、下面僅針對使用者carol進行了程式碼實現
public class ContentBase {
private static int[][] rate_set = { { 5, 5, 0, 0 }, { 5, -1, -1, 0 },
{ -1, 4, 0, -1 }, { 0, 0, 5, 4 }, { 0, 0, 5, -1 } };
private static double[][] m_feature = { { 0.9, 0 }, { 1.0, 0.01 },
{ 0.99, 0 }, { 0.1, 1.0 }, { 0, 0.9 } };
//僅針對使用者carol進行了程式碼實現
public static void main(String[] args) {
double t = 0.1;
double[] para = { 1.0, 1.0, 1.0 };
double[] partial = new double[3];
double min = 0.0;
int i = 0, j, u,times=0;
double temp,temp2;
//100為使用者2的向量學習次數
while(times++<100){
min=0.0 ;
i=0;
//該while迴圈計算代價函式
while (i < 5) {
temp = 0.0;
if (rate_set[i][2] != -1) {
for (u = 0; u < 3; u++) {
if (u == 0)
temp += para[u];
else
temp += para[u] * m_feature[i][u - 1];
}
min += (temp - rate_set[i][2]) * (temp - rate_set[i][2]);
}
i++;
}
System.out.print("當用戶 carol的向量值為[");
for(j=0;j<3;j++)
if(j!=2)
System.out.print(para[j]+",");
else
System.out.println(para[j]+"]時,min="+min);
System.out.println();
for (j = 0; j < 3; j++) {
i = 0;
partial[j] = 0;
while (i < 5) {
temp = 0.0;temp2=0.0;
if (rate_set[i][2] != -1) {
for (u = 0; u < 3; u++) {
if (u == 0)
temp += para[u];
else
temp += para[u] * m_feature[i][u - 1];
}
temp2 += temp - rate_set[i][2];
if (j != 0)
temp2 *= m_feature[i][j - 1];
partial[j]+=temp2;
}
i++;
}
}
//根據求得的偏導數 partial來更新某使用者的引數值
for (j = 0; j < 3; j++) {
para[j] = para[j] - t * partial[j];
}
}
}
}
4、執行結果:
注:部分圖片來源為 機器學習-吳恩達 中的視訊截圖