非负矩阵分解算法

% D 输入数据 n(个)* m(维)  r 降维后的维度
%  D=W*H   W 基向量矩阵  H 在基下的坐标向量

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

你可能感兴趣的:(算法,function)