最近在看非负数矩阵,参考了一位博主的文章。非负矩阵的大意是将一个矩阵拆分成为两个较小矩阵。
例如:n*n矩阵,可以分解为n*1的列向量乘以1*n的行向量矩阵。
其原理如下,首先构建两个随机矩阵,然后通过递归的形式,每迭代一次,结果向原矩阵靠近一次。
原博客中matlab代码如下:
clear all;
close all;
clc;
V=double(imread('lena.jpg'));
imshow(mat2gray(V));
[i u]=size(V); %计算V的规格
r=100; %设置分解矩阵的秩
W=rand(i,r); %初始化WH,为非负数
H=rand(r,u);
maviter=100; %最大迭代次数
for iter=1:maviter
W=W.*((V./(W*H))*H'); %注意这里的三个公式和文中的是对应的
W=W./(ones(i,1)*sum(W));