非负矩阵分解 java_matlab练习程序(非负矩阵分解)

原理上面两篇文章已经很清楚了,我在按自己的理解介绍一下吧。

通常矩阵分解如svd或其他什么的分解都会把矩阵分解为有正有负的矩阵,而他的这种分解方法就把矩阵完全分解成只有正数的矩阵,因为现实世界中如图像,负数是没什么意义的,所以这种只分解为正数矩阵的分解方法就很有意义了,要不也不会发在nature这样牛B的杂志上。

这里是分解的公式:

0480ae42a5f95781c97ea14cd57a2a4d.png

这里r是分解矩阵的秩,V是原矩阵的一个近似,W与H就是分解而成的两个矩阵。

下面是W和H的求法,是一个迭代算法,初始的W与H是随机的就行了:

a70103c6f6cdfd66c7365984cf2105fd.png

下面是代码:

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)));

endimg_V=W*H;

figure;

imshow(mat2gray(img_V));

下面是原图和重构后的效果,如果秩和迭代次数越大,那么重构后的图越接近原图:

c3f1cfec8c9b4bd220eab3d1e8f7c89f.png原图

a5f4c1f265e1fb3fe82e8be56e246a3a.png重构图

因为这个是看自己相关方向论文偶然在一篇论文的引用中看到了这个算法,所以就稍微了解了一下,肯定有不妥的地方,就这样吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值