機器學習_學習筆記系列(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),我們會依照以下步驟做轉換

  1. 對每筆資料減去其平均值

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.

--

--

劉智皓 (Chih-Hao Liu)
劉智皓 (Chih-Hao Liu)

Written by 劉智皓 (Chih-Hao Liu)

豬屎屋AI RD,熱愛AI研究、LLM/SD模型、RAG應用、CUDA/HIP加速運算、訓練推論加速,同時也是5G技術愛好者,研讀過3GPP/ETSI/O-RAN Spec和O-RAN/ONAP/OAI開源軟體。

No responses yet