ICA与PCA在二维点云上的应用对比

在特征空间中,独立成分分析(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则在数据的方差解释上表现更好。这种对比有助于理解两种方法的适用场景和优缺点。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485