%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 userbob = [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;endrank = 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;endindex = 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