MATLAB实现非负矩阵分解

该博客介绍了非负矩阵分解(NMF)的算法实现,特别是NMFLS_f函数,用于将数据矩阵A分解为W和H两个非负矩阵。在活跃集方法中,通过迭代优化W和H,直至 Frobenius 范数之差小于预设阈值。测试部分展示了如何加载数据并应用NMF,最后通过.spy图展示分解结果并输出范数误差。

函数部分

##活跃集方法
function [W,H] = NMFLS_f(A,k,maxit)
[m,n]=size(A);
%初始化W,记为W0
W=rand(m,k);
H=rand(k,n);
tol=0.5;
%规范化W0
for i=1:k
    W(:,i)=W(:,i)/norm(W(:,i),1);
end
disp(norm(A-W*H,'fro'))
for p=1:maxit
    if norm(A-W*H,'fro')>tol
         for o=1:n
            H(:,o)=lsqnonneg(W,A(:,o));
        end
        for j=1:m
            w=lsqnonneg(H',A(j,:)');
            W(j,:)=w';
        end
    end
end
W=sparse(W);
H=sparse(H);
disp(W)
disp(H)
figure(1)
spy(W)
figure(2)
spy(H)
disp(norm(A-W*H,'fro'))
end



##测试部分
A=struct2array(load('A_med.mat'));
k=1033;
maxit=2;
[W,H] = NMFLS_f(A,k,maxit);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值