NMF Matlab

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

非负矩阵分解
关键词:非负矩阵分解NMF Matlab代码
矩阵分解是实现大规模数据处理与分析的一种有效工具. 非负矩阵分解(non-negative matrix factorization,NMF)算法是在矩阵中所有元素均为非负的条件下对其实现的非负分解,这为矩阵分解提供了一种新的思路. 非负矩阵分解方法在智能信息处理和模式识别研究领域具有十分重要的应用意义. 本文介绍非负矩阵分解的基本思想和一些最新的研究成果,结合研究工作讨论在概率模型的框架下实现非负矩阵分解的目标函数和相应的算法,以及非负矩阵分解与知觉过程信息处理的关系,针对模式识别的实际问题给出具体的非负矩阵分解的应用实例,并提出非负矩阵分解及其应用中有待进一步研究的新问题。

function [W H] = nmf(V,r,maxiter);
%%
-------------------------------------------------------------------- %%
% Function: 非负矩阵分解(nonnegative matrix factorization)
% Argument:
% V:图像矩阵
% r: rank for the factorization
% maxiter: maximum number of iterations
%%
-------------------------------------------------------------------- %%
%start_time=cputime; % save start time
close all;
clear all;
ImShowOn = 1 ; % 1 最后显示结果 0 最后不显示结果
if nargin ~= 3 % 设置默认值
disp 'Usage: [W H] = nmf(V,r,maxiter)';
disp 'Copyright(C) ';
V = LoadImage();
r = input('Choose your own rank for the factorization [49]:');
if isempty(r)
r=49;
end
maxiter = input('Choose the maximum number of iterations [100]:');
if isempty(maxiter)
maxiter=100;
end
end
V=double(V);
[n m]=size(V); % V contains your data in its column vectors
W=rand(n,r); % randomly initialize basis
W=W./(ones(n,1)*sum(W)); % normalize column sums
H=rand(r,m); % randomly initialize encodings
%eps=1e-9; % set your own tolerance
h = waitbar(0,'Nonnegative Matrix Factorization');
for iter=1:maxiter
H=H.*(W'*((V+eps)./(W*H+eps)));
W=W.*(((V+eps)./(W*H+eps))*H');
W=W./(ones(n,1)*sum(W));
% insert your own graphics calls to visualize W and H
waitbar(iter/maxiter,h);
end
close(h);
h = waitbar(0,'Copyright(C) ');
web('', '-new');
if ImShowOn == 1 % 显示结果
subplot(1,2,1);imshow(V,[]);
title('Original image');
subplot(1,2,2);imshow(W*H,[]);
title(['NMFed image','(rank=',num2str(r),',iterations=',num2str(maxiter),')']);
end
%% -------------------------------------------------------------------- %%
function [W,H]=NMF(D,r)
sizeD=size(D);
n=sizeD(1);
m=sizeD(2);
W=abs(rand(n,r));
H=abs(rand(r,m));
for iterate=1:100
WD=W'*D;
WWH=W'*W*H;
for a = 1:r
for u=1:m
H(a,u)=H(a,u)*WD(a,u)/WWH(a,u);
end
end
DH=D*H';
WHH=W*H*H';
for i = 1:n
for a=1:r
W(i,a)=W(i,a)*DH(i,a)/WHH(i,a);
end
end
end。

相关文档
最新文档