正则化奇异值分解Regularized Singular Value Decomposition (RSVD)
2016-06-30 09:24
1126 查看
原文在这里: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大小的矩阵。
下面讲解介绍一种矩阵分解的方法,这个方法是非常实用的。
考虑一个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大小的矩阵。
相关文章推荐
- iOS-- UIView中的坐标转换
- [Leetcode]225. Implement Stack using Queues
- ugui Image控件介绍
- 设计师最常忽略的UI页面状态:空白状态
- Qt Quick里的图形效果:阴影(Drop Shadow)
- Android官方开发文档Training系列课程中文版:多样屏幕之实现自适应UI
- 源码推荐(0630):UISearchController的详细使用,下拉放大视图以及系统自带的毛玻璃的介绍
- EasyUI form submit success方法失效,且在IE下提示下载内容的解决办法
- APUE(4)---文件和目录 (3)
- 使用Volley StringRequest返回String 编码格式错误乱码问题解决
- ios UITableview 刷新某一个cell 或 section
- 动态计算UITableViewCell高度详解
- UIImageView,UIScrollView
- AngularUI Router学习笔记
- easyui datagrid 分页保持checkbox选中状态
- RocketMQ队列queue的偏移量Offset均衡分布测试
- UISwitch
- 理解 Android Build 系统
- 自定义UITableView索引动画,实现饿了么菜单效果
- ui-router中路由的二级嵌套