下面讲解介绍一种矩阵分解的方法,这个方法是非常实用的。
考虑一个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.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大小的矩阵。