您的位置:首页 > 产品设计 > UI/UE

正则化奇异值分解Regularized Singular Value Decomposition (RSVD)

2016-06-30 09:24 1041 查看
原文在这里:http://blog.csdn.net/hlx371240/article/details/42916869

下面讲解介绍一种矩阵分解的方法,这个方法是非常实用的。

考虑一个m×n的矩阵R,现在是想找到一个U和V矩阵,使其满足

,(矩阵R可能是一个稀疏的矩阵)。

正规化的奇异值分解(the Regularized Singular Value Decomposition,RSVD)的方法被用来评价一个矩阵。下面给出正则化奇异值分解的极小化函数和参数求解的算法

     


最终将得到一个低维的矩阵U和V,并且R≈U'V,达到分解的效果。

下面给出程序

main.m

[plain] view
plain copy

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

[plain] view
plain copy

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大小的矩阵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: