機器學習_學習筆記系列(64):獨立成分分析(Independent Component Analysis)
前幾回我們介紹了,幾個PCA相關的演算法以及Dictionary Learning。而今天我們要來看一個新的演算法「Independent Component Analysis」。
Independent Component Analysis
提到ICA演算法,我們通常都會拿一個非常經典的例子 –「Cocktail Party Problem」,這個問題就是,今天我們在雞尾酒宴會上跟朋友聊天,雖然宴會廳裡面同時有非常多人在聊天,但是我們仍然可以聽得到朋友說話,並忽略掉周遭其他人的聲音。
換在電腦上,在同樣的場合,電腦可能會收集到來自四面八方各個不同人的聲音,所以說今天如果我們只想擷取其中一個人的聲音,我們就必須得用一些特殊的技巧將其分出來,而這裡我們所會用到的就是 Independent Component Analysis。
接下來我們用比較嚴謹的數學問題探討,首先我們假設宴會廳上有d個人,並且有n個麥克風在收音。而這裡我們假設有一筆資料s∈R^d稱為source,裡面的每個元素都是每個人其獨立的聲音訊號,其中一個麥克風收到的訊號x就可以表達成
其中A∈R^dxd為一個混合矩陣。所以在這裡我們的目標是利用多筆x的訊號,重建s。
對於找回原來的訊號,我們設定一個矩陣W=A^-1讓
另外我們假設source的每個元素s_j,就個人的獨立訊號其分布,可以由機率密度p_s表示,所以整體s的joint distribution可以表示為:
套入上面s=Wx的式子
而我們知道假設我們今天有一個輸入值z,cumulative distribution function 為F,我們定義
所以其機率密度為
而根據ICA那篇paper,其所設定的cumulative distribution function為sigmoid function
所以我們整體n筆資料的log likelihood為
而從上面我們推出了這個方程式,我們就可以將其微分
以梯度下降來更新權重W,最後我們就可以得到輸入資料x_i的轉換矩陣W,r就可以求得原始訊號s_i。
但是顯然這樣的方法每次都要進行龐大的計算,會消耗很多時間,所以一位來自芬蘭Helsinki University of Technology的教授Aapo Hyvärinen提出了Fast ICA可以更快運算我們的原始訊號S。
Fast Independent Component Analysis
對於Fast ICA其概念其實和PCA和Dictionary Learning的想法很像,假使我們有n筆資料,那我們挑出C筆出來做分析就好,如此一來就可以大幅降低我們電腦運算的時間。
而在計算前我們會先將資料做whitening,所以這裡我們設我們所接收到的訊號為X∈R^(m x n),我們會依照以下步驟做轉換
- 對每筆資料減去其平均值
2. 做SVD
3. 設定K,並取K前C個值
4. 得到我們whitening後的矩陣
接下來就是進入到我們的演算法核心,其Fast ICA演算法如下
對於演算法中g,於Fast ICA中設定為
最後我們就可以求得我們的原始訊號
Example
接下來我們以實際例子來看,我們的原始訊號:
然後我們將三個訊號混合
接著我們用Fast ICA求解
我們可以看到我們可以透過Fast ICA將訊號還原回原本的樣子。
Python Sample Code:
Github:
Reference:
[1] Comon, P. (1994). Independent component analysis, a new concept?. Signal processing, 36(3), 287–314.
[2] Hyvarinen, A. (1999). Fast and robust fixed-point algorithms for independent component analysis. IEEE transactions on Neural Networks, 10(3), 626–634.