matlab簡單實現SVD的推薦


%svd chengxu 

A = [5 5 0 5;5 0 3 4; 3 4 0 3; 0 0 5 3; 5 4 4 5; 5 4 5 5];
A = A';

[U S V] = svd(A);

U = U(:,1:4);
S = S(1:4,1:4);
V = V(:,1:4);

reA = U*S*V';

%give one new user

bob = [5 5 0 0 0 5];

uservector = bob*V*S;

for i = 1:1:size(A,1)
    temp = U(i,:);
    similarity = temp*uservector'/(sqrt(temp*temp')*sqrt(uservector*uservector'));
    userlist(i) = similarity;
end

rank = sort(userlist);
l = size(rank,2);
t = zeros(1,size(A,2));
for i=l:-1:l-1
    indx = find(rank(i)==userlist);
    sim = rank(i);
    t = t + A(indx,:)*sim;
end

index = find(bob==0);
rank = t(index);
rank

  

matlab的代碼很簡單,因為有現場的svd函數可以使用

首先進行svd分解,之后我們會得到U,S,V三個矩陣

個人是這么理解的

如果在最初的矩陣中:列代表item而行代表了user

那么u則代表了user和中間量的關系,V代表了item與中間量的關系

S代表了不同中間量在期中所占的比重,或者是貢獻。

這個中間量,我們可以理解為是item和類別,例如電影我們可以分為喜劇或者等等。

這就產生了一個附帶產品

我們可以根據U和V對user和item進行聚類。這個以后再說

 

下面我們來了一個新的用戶,我們知道它的一些信息,

那么,我們可以通過V和S把用戶的信息映射到U相同的平面

然后計算新用戶和Old user的相似度

通過老用戶對item的興趣,計算新用戶對沒有見過的item的興趣程度

對這個結果rank后,即使最終推薦的順序。

參看:

http://blog.csdn.net/abcjennifer/article/details/8131087


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM