APG优化非负矩阵分解(NeNMF)

文献:NeNMF: An Optimal Gradient Method for Nonnegative Matrix Factorization

min_{W,H}||X - WH||; s.t W,H>=0

(1)固定W,优化H

 

 (2)优化W,固定H;

W_k = P(U_k-1/L\triangledown_W(W_k,U_k) )

(3)更新W_k

U_{k+1}=W_k+(\alpha_k-1)/\alpha_{k+1}(W_k-W_{k-1})

(4)更新Y_k

 具体算法:

 

matlab 代码

function [W,H] = myNeNMF(X,k)
 %% min_{W,H}||X-WH||_2^2;
 %% s.t W,H>0;
 
 max_epoch = 200;
 [dim,nSmp] = size(X);
 Wt = abs(rand(dim,k));
 Ht = abs(rand(k,nSmp));

%%
deltPH = -Wt'*X + Wt'*Wt*Ht;
deltPW = -X*Ht' + Wt*(Ht*Ht');
Wwt    = [Wt',Ht];
DeltHW = [deltPW',deltPH];
tol = norm(DeltHW(DeltHW<0|Wwt>0));
tol_optgap = 1e-5;
tolH = 1e-3*tol;
tolW = 1e-3*tol;
innerloop = 10;
for i = 1:max_epoch
    %% update  H
    [Ht,deltPH,iterH] = updateH(X,Wt,Ht,tolH,innerloop);
    if iterH<innerloop
        tolH = tolH/10;
    end
    %% update W;
    [Wt,deltPW,iterW] = updateH(X',Ht',Wt',tolW,innerloop);
    if iterW<innerloop
        tolW = tolW/10;
    end
    Wt = Wt';
    obj(i) = norm(X- Wt*Ht);
    WH = [Wt',Ht];
    deltaWH = [deltPH,deltPW];
    delta = deltaWH(deltaWH<0|WH>0);
    if i>1
        if (abs(obj(i)-obj(i-1))<tol_optgap)||(norm(delta)<1e-5*tol)
            break;
        end
    end 
end
W = Wt;
H = Ht;
end
 
 %% update H;
 
function [H,deltPH,i] = updateH(X,Wt,Ht,tol,innerloop)
    itermax_inner = 100;
    Yk = Ht;
    Hk = Ht;
    alpha0 = 1;
    alphak = alpha0;
    WtX = Wt'*X;
    WWt = Wt'*Wt;
    L = norm(WWt);
    deltPH  = -WtX + WWt*Yk;
    for i=1:itermax_inner
        Hk0    = Hk;
        Hk     = max(Yk - 1/L*deltPH,0);
        alphak = 0.5*(1 + sqrt(4*alphak.^2 + 1));
        Yk     = Hk + (alpha0-1)/alphak*(Hk - Hk0);
        alpha0 = alphak;
        deltPH = -WtX + WWt*Hk;
        pGd = deltPH(deltPH<0|Yk>0);
        if i>innerloop
            if norm(pGd)<=tol
                break;
            end
        end
    end
    H = Hk;
end
 

聚类效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值