• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  这个算法是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));

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

原图

重构图

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
matlab离散数据绘图 - 不做程序猿发布时间:2022-07-18
下一篇:
matlab练习程序(旋转矩阵、欧拉角、四元数互转)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap