假設(shè)由n個(gè)非負(fù)樣本數(shù)據(jù)組成的非負(fù)數(shù)據(jù)矩陣X返敬,非負(fù)矩陣分解的目標(biāo)是將非負(fù)數(shù)據(jù)矩陣X分解為基矩陣W和系數(shù)矩陣H的乘積遂庄,當(dāng)k小于min(m,n)時(shí),X就得到了有效壓縮劲赠。
非負(fù)矩陣分解
非負(fù)矩陣分解的MATLAB實(shí)現(xiàn):
1.隨機(jī)初始化W和H矩陣
2.設(shè)置最大迭代次數(shù)涛目,保證分解結(jié)果收斂
3.每迭代一次,先更新W经磅,對W的每一列做歸一化處理(保證縮放不變性)泌绣,再更新H钮追。
matlab實(shí)現(xiàn)
function [W,H,errs,loss] = nmf_euc(V, r)
% 輸入檢查
% 不含負(fù)值元素
% H為系數(shù)矩陣预厌,一列不能全為0
if min(min(V)) < 0
error('Matrix entries can not be negative');
end
if min(sum(V,2)) == 0
error('Not all entries in a row can be zero');
end
% V是一個(gè)含有n個(gè)樣本的矩陣,每一列對應(yīng)一個(gè)樣本元媚,每個(gè)樣本為m維
[m,n] = size(V);
% 隨機(jī)初始化W和H矩陣
W = rand(m,r);
H = rand(r,n);
% 設(shè)置最大迭代次數(shù)轧叽,保證分解結(jié)果是收斂的
niter = 1000;
myeps = 1e-10;
errs = zeros(niter,1);
for t = 1:niter
W = W .* ( (V*H') ./ max(W*(H*H'), myeps) );
W = normalize_W(W,1);
H = H .* ( (W'*V) ./ max((W'*W)*H, myeps) );
loss = sum((V-W*H).^2);
errs(t) = sum(sum(loss));
end