非負矩陣分解(2):算法推導與實現


作者:桂。

時間:2017-04-06  20:26:01 

鏈接:http://www.cnblogs.com/xingshansi/p/6670214.html 

聲明:歡迎被轉載,不過記得注明出處哦~


 

前言

本文非負矩陣分解(Nonegative matrix factorization,NMF)系列第二篇,主要介紹最基本的NMF原理及代碼實現,內容主要包括:

  1)基於Euclidean距離的NMF推導及實現;

  2)基於KL散度的NMF推導及實現;

  3)NMF應用示例

開始之前,有兩點需要補充:

  • 前面分析用的是X=AS形式,感覺別扭,好多文章都是用V = WH,后續打算也采用這也表達方式;
  • NMF其實是含有約束的優化問題,但乘法算法可以巧妙得讓我們只需討論:無約束優化問題。

 

一、基於Euclidean距離的NMF推導及實現

考慮無約束優化問題:

利用梯度下降:

其中:

如果直接梯度下降,對於無約束的優化問題,我們不能保證結果都是非負的,下面巧妙之處來了將梯度下降法變為乘法算法

令:

梯度下降法變換為乘法算法:

真是巧妙!一個復雜的約束性優化問題,就讓一個簡單的無約束給解決了。這樣一來,如果原矩陣為非負,W、H初始值同樣非負,結果自始至終都是非負,直至迭代到滿足收斂條件。

收斂性證明可以參考:Lee D D, Seung H S. Algorithms for Non-negative Matrix Factorization[C]// NIPS. 2000:556--562.

給出對應的代碼實現:

function [W, H] = nmf(V, K, MAXITER)
%Euclidean distance
F = size(V,1);
T = size(V,2);
 
rand('seed',0)
W = 1+rand(F, K);
% W = W./repmat(sum(W),F,1);
H = 1+rand(K, T);
 
ONES = ones(F,T);
 
for i=1:MAXITER
    H = H .* (W'*V)./(W'*W*H+eps) ;
    W = W .* (V*H')./(W*H*H'+eps);
end

其實關鍵的就是循環里的兩行。

 

二、基於KL散度的NMF推導及實現

整個思路與Euclidean distance下的求解思路如出一轍。

考慮無約束優化問題:

利用梯度下降算法:

其中:

根據梯度下降算法轉化為乘法算法:

令:

梯度下降算法改寫為乘法算法:

收斂性證明可以參考:Lee D D, Seung H S. Algorithms for Non-negative Matrix Factorization[C]// NIPS. 2000:556--562.

對應代碼:

function [W, H] = nmf(V, K, MAXITER)
%KL-divergence
F = size(V,1);
T = size(V,2);
 
rand('seed',0)
W = 1+rand(F, K);
% W = W./repmat(sum(W),F,1);
H = 1+rand(K, T);
 
ONES = ones(F,T);

for i=1:MAXITER
    H = H .* (W'*( V./(W*H+eps))) ./ (W'*ONES);
    W = W .* ((V./(W*H+eps))*H') ./(ONES*H');
end

  

三、NMF應用示例

對於一個混合語音,如鼓點和管樂器混合的單通道聲音,可以利用非負矩陣進行分解,實現語音信號的分離。

思路

 語音的時頻分析,得到的語譜圖是一個二維數據矩陣,其中鼓點、管樂器的概率分布不同,利用NMF可以實現信號的分離。

對應代碼(NMF調用上面任何一個都可以)

% Read in audio file
[x0 fs] = audioread('test_audio.wav');
x = x0(1:5*fs);%read 5s wav
nw = 1024;
ni = 256;
X = fft(enframe(x,nw,ni)');
V = abs(X); 
% NMF
K = 2; % number of basis vectors
MAXITER = 200; % total number of iterations to run
[W, H] = nmf(V, K, MAXITER); 
% get the mixture phase
phi = angle(X);
%Reconstruct
X1 = W(:,1)*H(1,:);
X2 = W(:,2)*H(2,:);
s1 = zeros(1,length(x));
s2 = zeros(1,length(x));
for i = 1:size(X1,2)
    nic = (1+(i-1)*ni):(nw+(i-1)*ni);
    s1(1,nic) = s1(1,nic)+real(ifft(X1(:,i).*exp(1j*phi(:,i))))';
    s2(1,nic) = s2(1,nic)+real(ifft(X2(:,i).*exp(1j*phi(:,i))))';
end
s1 = s1/max(abs(s1));
s2 = s2/max(abs(s2));

  可以看出這里K是給定的,即NMF實現分解需要給出先驗的類別數。這里給出語譜圖,圖片可以更加直觀地觀察分離效果,結果圖:

看看時域的分離效果:

分離效果還是不錯的。

 

參考:

  •  Lee D D, Seung H S. Algorithms for Non-negative Matrix Factorization[C]// NIPS. 2000:556--562.
  • 張賢達:《矩陣分析與應用,第二版》.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM