獨立成分分析 (Independent Component Analysis, ICA) 是一種統計和計算技術,旨在從多變量的數據中提取出互相獨立的信號。與主成分分析 (PCA) 不同,PCA 尋找的是不相關(uncorrelated)的成分,而 ICA 尋找的是統計上獨立(statistically independent)的成分。
ICA 的目標是將觀測到的多變量信號分解為統計獨立的組成部分。這些組成部分常常被稱為「獨立成分」(Independent Components)。ICA 的應用廣泛,包括信號處理、特徵提取、盜版檢測、腦電波分析等。典型的應用之一是「雞尾酒會問題」,即從多個混合的音頻信號中提取出各個獨立的音源。
中心化資料:對資料進行中心化處理,使每個變量的均值為 0。
白化資料:對資料進行白化處理,消除不同變量之間的相關性。這一步通常通過對資料進行 PCA 或 ZCA 白化實現。
計算獨立成分:通過最大化非高斯性來尋找獨立成分。非高斯性越高,成分越獨立。常用的算法包括 FastICA。
重構信號:使用計算出的獨立成分重構原始資料。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import FastICA
np.random.seed(0)
n_samples = 2000
time = np.linspace(0, 8, n_samples)
# 兩個獨立的正弦波信號
S1 = np.sin(2 * time) # 信號 1: 正弦波
S2 = np.sign(np.sin(3 * time)) # 信號 2: 方波
# 組合成矩陣形式
S = np.c_[S1, S2]
# 將信號進行混合 (線性混合)
A = np.array([[1, 1], [0.5, 2]]) # 混合矩陣
X = np.dot(S, A.T) # 混合信號
# 使用 ICA 分離信號
ica = FastICA(n_components=2)
S_ica = ica.fit_transform(X) # 分離出的信號
A_ica = ica.mixing_ # ICA 混合矩陣
# 正規化以便於比較
S_ica /= S_ica.std(axis=0)
plt.figure(figsize=(10, 8))
plt.subplot(3, 1, 1)
plt.title("原始信號")
plt.plot(S)
plt.subplot(3, 1, 2)
plt.title("混合信號")
plt.plot(X)
plt.subplot(3, 1, 3)
plt.title("分離出的信號 (ICA)")
plt.plot(S_ica)
plt.tight_layout()
plt.show()
ICA 是一種更高階的技術,尤其適用於當我們關心資料中潛在獨立結構或信號時。然而,與 PCA 相比,ICA 的計算複雜度較高,並且對初始條件較敏感。