UFLDL上的ICA为什么一定要做PCA whiten

本文探讨了无监督学习中PCA与ICA两种降维技术的应用,并解释了为何在进行ICA之前需要先对数据进行PCA白化的原理。通过对比PCA与ICA的损失函数,揭示了它们在提取数据特征方面的不同作用。

  Andrew Ng先生的UFLDL教程真可谓deep learning入门的首选课程。在两年前我看教程里讲ICA部分的(链接)时候,里面提到使用教程所述的ICA模型时,输入数据必须经过PCA白化操作,页面上有个TODO问为什么要这样做。以当年的我对机器学习的理解并不能解答这个问题,就只是按照教程上讲的写完了代码,后来就一直没有看过了。
  今天在与人讨论无监督学习的几种损失函数的时候,提到了PCA的损失函数:

maxWx2s.t.WWT=I,

优化这个方差,就可以得到最大化方差的解。其中, W 是个扁矩阵,以起到降维的作用。我们都知道,这个优化式可以通过svd求解:W=USV,取 U 的前几列,即可得到降维用的旋转矩阵,而最后几个奇异值,对应U的最后几列,一般都会是接近0的数,是要丢掉的。
  这时,我突然想起来,为什么ICA的损失函数会使用min函数:
minWx1s.t.WWT=I.

  要知道 1 范数和 2 范数的差别确实有,但并不是那么明显,如果使用min函数的话,岂不是找到了没有数据的那些子空间去了?
  于是我就去翻了下教程,原来这里需要先对 x 做PCA白化,先取到x的方差较大的几维子空间,再在这上面做最小化操作,如果把这里的 1 范数换为 2 范数,得到的实际上就是 U 的中间几列。

### 数据预处理 在应用ICA之前,通常需要对数据进行预处理。这包括中心化(去均值)和可能的白化(去除相关性)操作。中心化是指将每个观测信号减去其均值,使得数据具有零均值[^3]。白化则是进一步处理,使得数据的相关矩阵成为单位矩阵,这样可以简化后续ICA的计算[^1]。 ```python from sklearn.preprocessing import StandardScaler # 假设X是你的混合数据集 scaler = StandardScaler() X_centered = scaler.fit_transform(X) # 中心化 ``` ### 应用ICA 一旦数据被预处理,就可以使用FastICA算法来估计解混矩阵。FastICA是一种常用的ICA算法,它基于非高斯性最大化原则。在Python中,可以使用`sklearn.decomposition.FastICA`来实现这一过程[^2]。 ```python from sklearn.decomposition import FastICA # 定义ICA模型 ica = FastICA(n_components=X_centered.shape[1], fun='logcosh', whiten=True) # 拟合模型并转换数据 S_ = ica.fit_transform(X_centered) # S_ 是估计的源信号 ``` ### 解释结果 ICA的结果是原始信号的一个估计。由于ICA不能确定信号的顺序和尺度,因此可能需要对结果进行额外的调整才能与原始信号对应起来。通常,可以通过可视化或与其他已知信号比较来确认哪些估计信号对应于哪些实际源信号[^3]。 ```python import matplotlib.pyplot as plt # 可视化估计的源信号 plt.figure(figsize=(16, 6)) for i in range(S_.shape[1]): plt.subplot(S_.shape[1], 1, i + 1) plt.plot(S_[:, i]) plt.show() ``` ### 注意事项 - 在应用ICA时,重要的是要确保源信号是统计独立的,并且不是高斯分布的。如果源信号中有高斯分布的信号,ICA可能无法正确地分离它们。 - ICA假设混合矩阵A是方阵,这意味着观测信号的数量等于源信号的数量。如果观测信号多于源信号,则需要先进行降维处理,如PCA[^4]。 - 选择合适的ICA算法参数,比如非线性函数的选择('logcosh', 'exp'等),会影响ICA的效果。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值