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

  这个算法是Lee和Seung在1999年发表在nature杂志上的。具体论文看这里:http://www.seas.upenn.edu/~ddlee/Papers/nmf.pdf

  看不懂英文没关系,可以看这个中文的介绍:http://wenku.baidu.com/view/94c8af0bf78a6529647d5331.html

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

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

  这里是分解的公式:

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

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

  

  关于代码,我借鉴了这个博客的:http://fxy1211.blog.163.com/blog/static/68255322007826111015905/,真是太感谢这位博主了。

  下面是代码:

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

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

原图

重构图

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

转载于:https://www.cnblogs.com/tiandsp/archive/2012/11/13/2768597.html

非负矩阵分解(Non-negative Matrix Factorization,NMF)是一种在机器学习和数据挖掘领域广泛应用的算法。其核心思想是将一个非负矩阵分解为两个非负的低秩矩阵的乘积,从而发现原始矩阵的潜在结构和特征。 在MATLAB中,可以通过调用内置函数或开源工具箱来实现非负矩阵分解。一种常用的方法是使用MATLAB自带的函数`nnmf`。这个函数可以通过多种不同的算法实现非负矩阵分解,如乘法更新法、反射法等。 使用`nnmf`函数可以指定要分解的原始矩阵以及分解后的矩阵的秩。此外,还可以选择不同的代价函数和优化算法以获得更好的分解结果。函数的输出为分解后的两个非负矩阵及相应的误差。 除了`nnmf`函数外,MATLAB中还有其他一些工具箱和函数可以实现非负矩阵分解,如NMF_ARD、NMF库等。这些工具箱和函数提供了更多的参数选项和算法选择,可以根据实际需求进行调整和优化。 在使用非负矩阵分解时,需要注意选择合适的参数和算法,以及对分解结果进行合理的解释和应用。同时,也要注意数据的预处理和归一化,以提高非负矩阵分解的效果和可解释性。 总之,MATLAB提供了多种实现非负矩阵分解的函数和工具箱,可以根据需求选择合适的方法进行分解和应用。非负矩阵分解在机器学习、图像处理、文本挖掘等领域有广泛的应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值