下面講解介紹一種矩陣分解的方法,這個方法是非常實用的。
考慮一個m×n的矩陣R,現在是想找到一個U和V矩陣,使其滿足,(矩陣R可能是一個稀疏的矩陣)。
正規化的奇異值分解(the Regularized Singular Value Decomposition,RSVD)的方法被用來評價一個矩陣。下面給出正則化奇異值分解的極小化函數和參數求解的算法
最終將得到一個低維的矩陣U和V,並且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.mfunction [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大小的矩陣。