文献:NeNMF: An Optimal Gradient Method for Nonnegative Matrix Factorization
;
(1)固定W,优化H
(2)优化W,固定H;
(3)更新W_k
(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
聚类效果: