在特征空间中,独立成分分析(ICA)和主成分分析(PCA)是两种不同的降维技术。ICA旨在寻找特征空间中对应于高非高斯性的投影方向,这些方向在原始特征空间中不必是正交的,但在白化后的特征空间中是正交的,其中所有方向对应相同的方差。而PCA则寻找原始特征空间中的正交方向,这些方向对应于最大方差的方向。
本例中,通过模拟数据来展示ICA和PCA在二维点云上的效果对比。首先,使用一个高度非高斯的过程(学生t分布,自由度较低)来模拟独立源,并将其混合以创建观测数据。在原始观测空间中,PCA识别的方向由橙色向量表示。将PCA空间中的信号表示为,通过PCA向量对应的方差进行白化后的信号(下图左下)。运行ICA相当于在这个空间中找到一个旋转,以识别最大非高斯性的方向(下图右下)。
为了生成样本数据,首先导入必要的库,并设置随机数生成器的种子,以确保结果的可重复性。然后,生成一个具有特定自由度的学生t分布数据,并将其放大以模拟不同的源。接着,通过一个混合矩阵将这些源混合,以生成观测数据。
import numpy as np
from sklearn.decomposition import PCA, FastICA
rng = np.random.RandomState(42)
S = rng.standard_t(1.5, size=(20000, 2))
S[:, 0] *= 2.0 # Mix data
A = np.array([[1, 1], [0, 2]]) # Mixing matrix
X = np.dot(S, A.T) # Generate observations
接下来,使用PCA和ICA对观测数据进行拟合和转换。PCA通过找到数据的主成分来降维,而ICA则通过寻找最大的非高斯性方向来降维。
pca = PCA()
S_pca_ = pca.fit(X).transform(X)
ica = FastICA(random_state=rng, whiten='arbitrary-variance')
S_ica_ = ica.fit(X).transform(X)
为了更直观地展示结果,定义了一个绘图函数,用于在特征空间中绘制样本点和PCA、ICA的方向向量。然后,创建一个2x2的子图,分别展示真实的独立源、观测数据、PCA恢复的信号和ICA恢复的信号。
import matplotlib.pyplot as plt
def plot_samples(S, axis_list=None):
plt.scatter(S[:, 0], S[:, 1], s=2, marker="o", zorder=10, color="steelblue", alpha=0.5)
if axis_list is not None:
for axis, color, label in axis_list:
x_axis, y_axis = axis / axis.std()
plt.quiver((0, 0), (0, 0), x_axis, y_axis, zorder=11, width=0.01, scale=6, color=color, label=label)
# ... 省略部分代码 ...
plt.show()
通过对比PCA和ICA恢复的信号,可以观察到两种方法在处理非高斯数据时的不同表现。ICA能够更好地分离出原始的独立源,而PCA则在数据的方差解释上表现更好。这种对比有助于理解两种方法的适用场景和优缺点。