1. 程式人生 > >基於內容的推薦 java實現

基於內容的推薦 java實現

  • 這是本人在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、執行結果:
這裡寫圖片描述

注:部分圖片來源為 機器學習-吳恩達 中的視訊截圖