FastICA 应用于二维点云#

本示例在特征空间中直观地展示了使用两种不同成分分析技术的结果比较。

独立成分分析 (ICA)主成分分析 (PCA)

在特征空间中表示 ICA 给出了“几何 ICA”的视图:ICA 是一种算法,它在特征空间中找到对应于具有高非高斯性的投影的方向。这些方向在原始特征空间中不需要正交,但在白化特征空间中是正交的,在白化特征空间中,所有方向对应于相同的方差。

另一方面,PCA 在原始特征空间中找到正交方向,这些方向对应于解释最大方差的方向。

在这里,我们使用高度非高斯过程模拟独立源,即具有低自由度的 2 个学生 t 分布(左上图)。我们将它们混合以创建观测值(右上图)。在这个原始观测空间中,PCA 识别的方向由橙色向量表示。我们在 PCA 空间中表示信号,在通过对应于 PCA 向量的方差进行白化之后(左下)。运行 ICA 对应于在该空间中找到一个旋转以识别最大非高斯性的方向(右下)。

# Authors: Alexandre Gramfort, Gael Varoquaux
# License: BSD 3 clause

生成样本数据#

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 = PCA()
S_pca_ = pca.fit(X).transform(X)

ica = FastICA(random_state=rng, whiten="arbitrary-variance")
S_ica_ = ica.fit(X).transform(X)  # Estimate the sources

绘制结果#

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:
            axis /= axis.std()
            x_axis, y_axis = axis
            plt.quiver(
                (0, 0),
                (0, 0),
                x_axis,
                y_axis,
                zorder=11,
                width=0.01,
                scale=6,
                color=color,
                label=label,
            )

    plt.hlines(0, -3, 3)
    plt.vlines(0, -3, 3)
    plt.xlim(-3, 3)
    plt.ylim(-3, 3)
    plt.xlabel("x")
    plt.ylabel("y")


plt.figure()
plt.subplot(2, 2, 1)
plot_samples(S / S.std())
plt.title("True Independent Sources")

axis_list = [(pca.components_.T, "orange", "PCA"), (ica.mixing_, "red", "ICA")]
plt.subplot(2, 2, 2)
plot_samples(X / np.std(X), axis_list=axis_list)
legend = plt.legend(loc="lower right")
legend.set_zorder(100)

plt.title("Observations")

plt.subplot(2, 2, 3)
plot_samples(S_pca_ / np.std(S_pca_, axis=0))
plt.title("PCA recovered signals")

plt.subplot(2, 2, 4)
plot_samples(S_ica_ / np.std(S_ica_))
plt.title("ICA recovered signals")

plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.36)
plt.tight_layout()
plt.show()
True Independent Sources, Observations, PCA recovered signals, ICA recovered signals

脚本总运行时间:(0 分钟 0.454 秒)

相关示例

使用 FastICA 进行盲源分离

使用 FastICA 进行盲源分离

单个估计器与 Bagging:偏差-方差分解

单个估计器与 Bagging:偏差-方差分解

Iris 数据集的 LDA 和 PCA 二维投影比较

Iris 数据集的 LDA 和 PCA 二维投影比较

普通最小二乘法和岭回归方差

普通最小二乘法和岭回归方差

由 Sphinx-Gallery 生成的图库