推薦系統例項 基於矩陣分解

2021-07-10 02:04:47 字數 2821 閱讀 4325

使用matlab嘗試了隨機梯度下降的矩陣分解方法,實現了乙個比較簡單的推薦系統的原理。

常用推薦系統的方法有協同過濾,    基於物品內容過濾等等。

這次是用的矩陣分解模型屬於協同過濾的一種方法,大致原理是通過一定數量的因子來描述各個使用者的喜好和各個物品的屬性。

通過隨機梯度下降法分解後得到兩個矩陣,乙個是使用者因子矩陣,另乙個是物品因子矩陣。

這兩個矩陣相乘可以得到所有使用者對所有電影的**評分。

以movie-lens資料集舉例,這包含943個使用者對1682部電影的十萬條評分。

第一列使用者編號,第二列電影編號,第三列使用者對該物品的評分(1-5分);

matlab**:

function[grade,usercal,itemcal,deviation 

]= iterator( gradedata ,iteratime )

% 利用隨機梯度下降法分解稀疏的使用者評分矩陣,得到使用者因子矩陣和物品因子矩陣,因子項數30;

% iteratime : 迭代次數,建議值:30alpha = 0.01;

lambda = 10;

usercal = rand(943,30);

itemcal = rand(1682,30);

range = size(gradedata,1);

usercal_last = usercal;

itemcal_last = itemcal;

for limit = 1:1:iteratime

for i = 1:1:range

tempuser = gradedata(i,1);

tempitem = gradedata(i,2);

tempgrade = gradedata(i,3);

e = tempgrade - usercal(tempuser,:) * itemcal(tempitem,:)';

usercal(tempuser,:) = usercal_last(tempuser,:) + alpha * ( e * itemcal_last(tempitem,:) - lambda * usercal_last(tempuser,:) );

itemcal(tempitem,:) = itemcal_last(tempitem,:) + alpha * ( e * usercal_last(tempuser,:) - lambda * itemcal_last(tempitem,:) );

end usercal_last = usercal;

itemcal_last = itemcal;

alpha = alpha / (1 + limit);

enddeviation= deviation(gradedata ,lambda , usercal, itemcal);

realgrade = pack(gradedata);

grade = usercal * itemcal' - realgrade;

endfunction

[deviation

]= deviation( gradedata , lambda ,user ,item )

%計算平方誤差,誤差越小,擬合效果越好

range = size(gradedata(:,1));

deviation = 0;

for i = 1:1:range

tempuser = gradedata(i,1);

tempitem = gradedata(i,2);

tempgrade = gradedata(i,3);

deviation = deviation + ( tempgrade - user(tempuser,:) * item(tempitem,:)' )^2 + lambda * ( sum(user(tempuser,:).^2 ) + sum(item(tempitem,:).^2) ) ;

endend

function

[realgrade

]=pack(gradedata)

% realgrade =;

range = size(gradedata,1);

for i =1:1:range

realgrade(gradedata(i,1),gradedata(i,2)) = gradedata(i,3);

endend

設定了30個因子項,這個可以根據實際情況調整。

迭代次數可以根據每一次迭代的deviation與上一次的deviation比較來判定是否收斂。

**中直接迭代了20次,可以算出乙個比較好的結果。

這樣使用者因子矩陣為943*30,物品因子矩陣為,1682*30;

分解後得到這兩個矩陣:

將使用者因子矩陣(943*30)與物品因子矩陣(1682*30)的轉置相乘即可得到評分**矩陣(943*1682):

基於隨機梯度下降法的推薦系統雖然是基於內容推薦,但是系統設計者無需清楚每乙個物品的內容屬性和每乙個使用者的喜好,通過矩陣分解法得出的因子矩陣可以很好的描述使用者和物品的屬性,當然,這來自於使用者的歷史行為,使用者過去的行為越多,則推薦越準確。比較流行的矩陣分解法還有svd分解法等。

因為是協同過濾的方法,所以也存在著冷啟動的問題,比如乙個新物品,未和任何使用者產生互動,則它永遠不會被推薦,而新註冊的使用者也因為沒有歷史行為而無法對其推薦。其次,還有稀疏性問題,當系統中 使用者與物品的互動過少時,推薦結果往往不會太準確。

來自

基於矩陣分解的推薦系統

推薦系統產生推薦列表的方式通常有兩種 協同過濾以及基於內容推薦,或者基於個性化推薦。協同過濾方法根據使用者歷史行為 例如其購買的 選擇的 評價過的物品等 結合其他使用者的相似決策建立模型。這種模型可用於 使用者對哪些物品可能感興趣 或使用者對物品的感興趣程度 基於內容推薦利用一些列有關物品的離散特徵...

推薦系統ALS矩陣分解

思想類似線性回歸做 大致如下 定義乙個 模型 數學公式 然後確定乙個損失函式,將已有資料作為訓練集,不斷迭代來最小化損失函式的值,最終確定引數,把引數套到 模型中做 矩陣分解的 模型是 損失函式是 我們就是要最小化損失函式,從而求得引數q和p。矩陣分解模型的物理意義 我們希望學習到乙個p代表user...

推薦系統演算法 基於矩陣分解的CF演算法

raditional svd 通常svd矩陣分解指的是svd 奇異值 分解技術,在這我們姑且將其命名為traditional svd 傳統並經典著 其公式如下 traditional svd分解的形式為3個矩陣相乘,中間矩陣為奇異值矩陣。如果想運用svd分解的話,有乙個前提是要求矩陣是稠密的,即矩陣...