%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后,即使最終推薦的順序。
參看:
