MATRIX FACTORIZATION(矩陣分解)-正則化奇異值分解Regularized Singular Value Decomposition (RSVD)

  下面講解介紹一種矩陣分解的方法,這個方法是非常實用的。

考慮一個m×n的矩陣R,現在是想找到一個UV矩陣,使其滿足,(矩陣R可能是一個稀疏的矩陣)。

正規化的奇異值分解(the Regularized Singular Value Decomposition,RSVD)的方法被用來評價一個矩陣。下面給出正則化奇異值分解的極小化函數和參數求解的算法

     

最終將得到一個低維的矩陣UV,並且R≈U'V,達到分解的效果。

下面給出程序

main.m

clear all
clc
load('評分矩陣.mat');
R=pinfen;
lamda=0.02;   %正則參數
alpha=0.002; %學習率γ1
itrea=200; %迭代次數
K=20; % d
[U V lost] = matrix_factoriation(R,K,itrea,alpha,lamda);
plot(lost,'k-','linewidth',1.5);
xlabel('迭代次數');
ylabel('lost');
title('訓練的損失函數的收斂情況');
grid on
matrix_factoriation.m

function [U V e]=matrix_factoriation(R,K,itrea,alpha,lamda)
[m n]=size(R);
U=rand(m,K);
V=rand(n,K);
V=V';
fprintf('%10s %8s %12s %15s\n','Iteration','alpha','lamda','error');
for step=1:itrea
    for i=1:m
        for j=1:n
            if R(i,j)>0
                eij=R(i,j)-U(i,:)*V(:,j);
                for k=1:K
                    U(i,k)=U(i,k)+alpha*(eij*V(k,j)-lamda*U(i,k));
                    V(k,j)=V(k,j)+alpha*(eij*U(i,k)-lamda*V(k,j));
                end
            end
        end
    end
    eR=U*V;
    e(step)=0;
    for i=1:m
        for j=1:n
            if R(i,j)>0
                e(step)=e(step)+(R(i,j)-U(i,:)*V(:,j)).^2;
                for k=1:K
                    e(step)=e(step)+(lamda/2)*((U(i,k).^2)+V(k,j).^2);
                    if e<0.001
                        break;
                    end
                end
            end
        end
    end
    fprintf('%6d %15s %13s %14d\n',step,alpha,lamda,e(step));
end

最終得到的結果如下


其中R爲943×1682大小的矩陣,U爲943×20大小的矩陣,V爲20×1682大小的矩陣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章