最近在看非负数矩阵,参考了一位博主的文章。非负矩阵的大意是将一个矩阵拆分成为两个较小矩阵。
例如: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)); H=H.*(W'*(V./(W*H))); end img_V=W*H; figure; imshow(mat2gray(img_V));经过实际运行发现,该代码只适合处理二维矩阵,如果直接处理三维矩阵,会报错。有兴趣的同学可以自己考虑下,用reshape语句将三维图像降成二维再使用非负矩阵降维处理。
运行结果(左边为原图,右边为非负矩阵压缩过图片):
1.迭代50次
2.迭代100次
3、迭代500次
4、迭代1000次
非负矩阵优势是降维,劣势是迭代次数越多,越精确,但是随着迭代次数的增加,500次左右能够逼近原图,但是1000次和500次之间区别不大。
最后有个问题:如果知道多次次迭代能最接近原图呢?
参考文献: https://www.cnblogs.com/tiandsp/archive/2012/11/13/2768597.html