最强降维算法:独立成分分析!!

文摘   2024-11-20 11:27   北京  

哈喽,我是小白~

今儿给大家分享的是降维算法中的独立成分分析,即:Independent Component Analysis, ICA。

首先说,降维算法的目标是将高维数据压缩到低维,同时尽可能保留数据中的关键信息。想象你有一堆非常复杂的图片,每张图片有数百万像素,但我们希望用少数几个关键特征来表示它们,这就是降维要解决的问题。

如果需要本文PDF版本的同学,文末获取~

另外,文末有总结性的干货~

一起来看下具体细化内容~

独立成分分析 是什么?

独立成分分析是一种降维方法,目标是找到数据中独立的隐藏信号

它与主成分分析 (PCA) 的不同点在于:

  • PCA 假设数据是线性相关的,只要保留方差最大的方向。

  • ICA 假设数据是由独立信号混合而成,试图找出这些信号。

很常见的一个例子,比如你参加一个派对,耳边同时传来两个人讲话的声音(比如一个人在讲笑话,另一个人在谈政治)。你的大脑能通过两只耳朵,分别感受到两个麦克风采集到的混合声音,但你能独立分辨出是谁在说什么。ICA 就像是一台算法“大脑”,专门从混合信号中分离出独立的声音。

简单案例:拆分混合声音

假设:

  • 有两个音源:一个是乐曲 (A),另一个是人声 (B)。
  • 我们用两个麦克风记录,得到两个混合信号  和 

这两个麦克风接收到的信号是这些音源线性混合的结果,记为:

目标是通过观察  和 ,找到原始音源  和 

数学背后

1. 混合信号的特性

  • 每个独立信号 (比如乐曲和人声) 通常具有不同的统计特性,例如振幅的分布、时间相关性等。
  • ICA 假设这些信号是统计独立的。

2. ICA 的关键思想

  • 找到一个线性变换 ,将混合信号  转换为近似独立的信号 
  •  是一个解混矩阵,它的求解依赖于信号的独立性假设。

假设:

有两个信号源  和 ,分别为:

混合后信号为:

目标是从  和  中恢复  和 

使用 ICA 恢复信号

1. 标准化数据

通过对  和  进行中心化(去均值)和归一化(使方差为 1),消除偏移和尺度影响。

2. 解混矩阵求解

ICA 的核心是找到 ,即从混合信号中提取独立信号。算法会尝试调整  ,使输出信号的非高斯性(统计独立的特征)最大。

简化计算结果(假设已找到 

解得  后,得到:

比如:

计算后:

得:

有了以上简单的说明,咱们下面好好聊聊其背后的原理~

公式解析

ICA 的核心目标是从一组观察到的混合信号中分离出相互独立的源信号。以下是详细的数学公式推导和推理过程。

假设有  个源信号 ,这些信号通过一个未知的线性混合矩阵  混合,得到  个观测信号 。数学表示如下:

其中:

  •  是观测信号向量。
  •  是源信号向量。
  •  是混合矩阵。

我们的目标是通过一个解混矩阵  将观测信号  转换回独立的源信号 

假设条件

为了实现分离,ICA 需要以下基本假设: 

1. 信号的统计独立性:源信号  是彼此独立的。 

2. 非高斯性:每个源信号  的概率分布是非高斯的(至少有一个信号必须满足此条件)。 

3. 混合矩阵是方阵或可重建的:即观测信号和源信号的数量相等或关系可解。

推导

1. 中心化与白化

为简化计算,我们对  进行预处理:

1. 中心化 (Centering):去均值,令  的均值为零:

2. 白化 (Whitening):通过线性变换消除变量间的线性相关性,使得数据具有单位方差:

  •  是  的协方差矩阵的特征向量矩阵。
  •  是特征值对角矩阵。

经过白化后, 满足:

2. 独立性与非高斯性最大化

核心思想是找到一个解混矩阵 ,使得分离后的信号  的独立性最大化。

非高斯性度量

为了量化信号的独立性,ICA 利用非高斯性作为度量。常用的非高斯性指标包括:

1. 偏态 (Skewness): 偏态反映信号分布的对称性,定义为:

2. 峰度 (Kurtosis): 峰度反映信号分布的尖峰程度,定义为:

3. 对比熵 (Negentropy): 对比熵是基于熵的非高斯性测量,定义为:

其中  是信号的熵。

非高斯性优化目标

ICA 的目标是找到 ,使得输出信号  的非高斯性最大。这个问题通常通过以下准则优化:

其中  是非高斯性的目标函数,例如:

  • (最大熵估计)。
  • (基于偏态的目标)。

3. 解混矩阵的迭代更新

通过梯度下降法优化非高斯性目标,更新解混矩阵 

  •  是目标函数  的一阶导数。
  •  是  的二阶导数。
  •  是学习率。

4. 正交化约束

为确保解混矩阵  的列向量是正交的,每次更新后对  进行正交化:

ICA 流程总结

1. 数据预处理:对观测数据  去中心化、白化。

2. 初始化解混矩阵 * :随机初始化或用白化矩阵作为初始值。

3. 迭代优化:使用梯度法更新 ,最大化非高斯性。每次迭代后对  进行正交化。

4. 分离信号:得到近似独立的信号 

优缺点和适用场景

优点

1. 分离独立信号能力强:ICA 擅长从混合信号中分离出独立的源信号,尤其在信号处理领域表现优异,例如音频分离和生物医学信号分离(如脑电图 EEG 数据)。

2. 对噪声鲁棒性强:在非高斯独立信号的分离任务中,ICA 能有效应对一定程度的噪声。

3. 发现隐藏特征:在数据降维中,ICA 可挖掘传统方法(如 PCA)无法发现的独立结构或特性。

4. 广泛适用性:适用于不同领域的信号分离、特征提取以及盲源分离等任务。

缺点

1. 对非高斯信号敏感:ICA 依赖非高斯性,如果信号接近高斯分布(如噪声过大或信号特性不明显),效果会大打折扣。

2. 需要独立性假设:要求源信号独立这一假设在某些实际场景中未必成立。

3. 计算复杂度高:ICA 的迭代优化过程较复杂,尤其在大规模数据中,可能效率较低。

4. 不可控的解排列和幅值:ICA 的输出信号在排列顺序和幅值上无法直接控制,需要后处理。

适用场景

1. 金融预测

场景:利用历史市场数据(股票价格、交易量等)预测股票趋势。

处理流程

  • 数据预处理:填补缺失值、规范化等。
  • 特征选择:用随机森林评估特征重要性。
  • 建模:训练随机森林进行回归预测。
2. 医疗诊断

场景:预测疾病(如糖尿病、癌症)是否发生。

处理流程

  • 数据预处理:处理患者年龄、体重、血糖等生物特征。
  • 模型训练:用随机森林进行分类,输出疾病风险概率。
3. 客户行为预测

场景:分析用户行为(如购买或流失预测)。

处理流程

  • 提取客户特征(如购买频率、上次消费时间)。
  • 建模:用随机森林训练分类模型。
4. 图像分类

场景:对图像数据(如手写数字、物体)进行分类。

处理流程

  • 数据降维:先用 PCA 或 ICA 降维。
  • 分类:随机森林作为分类器训练模型。
5. 环境预测

场景:预测空气质量、降雨量或温度。

处理流程

  • 提取环境传感器数据。
  • 用随机森林进行回归预测环境指标。

完整案例

生成独立成分分析 (ICA) 的信号分离图形。运行后会给大家展示:

  • 原始信号:展示未混合的独立信号。
  • 混合信号:展示混合后的观测信号。
  • 分离信号:展示通过 ICA 分离出来的独立成分。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import FastICA

# 第一步:生成模拟EEG信号的独立源信号
np.random.seed(42)
n_samples = 2000  # 样本点数
time = np.linspace(08, n_samples)  # 时间轴,模拟8秒

# 生成三个独立信号(Independent Components)
s1 = np.sin(2 * time)                     # 正弦信号
s2 = np.sign(np.sin(3 * time))            # 方波信号
s3 = np.random.normal(size=n_samples)    # 高斯噪声信号

# 将信号标准化,以确保它们具有单位方差
S = np.c_[s1, s2, s3]
S /= S.std(axis=0)

# 第二步:创建一个混合矩阵,并生成观测信号(混合信号)
A = np.array([[110.5], [0.521], [1.512]])  # 混合矩阵
X = S.dot(A.T)  # 混合信号,通过矩阵乘法实现

# 第三步:使用ICA分离混合信号
ica = FastICA(n_components=3, random_state=42)  # 创建ICA模型
S_ica = ica.fit_transform(X)  # 通过ICA分离出的信号
A_ica = ica.mixing_  # ICA估计的混合矩阵(可用于验证)

# 第四步:绘制结果对比
plt.figure(figsize=(1516))  # 设置画布大小

# 原始独立信号
plt.subplot(411)  # 四行一列的第一个子图
plt.title("Original Independent Signals (Sources)", fontsize=14)
colors = ['red''blue''green']
for i, signal in enumerate(S.T):
    plt.plot(time, signal + i * 3, color=colors[i], label=f"Source {i+1}")  # 每个信号在y轴偏移,便于区分
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.legend()
plt.grid(True)

# 混合信号(观测信号)
plt.subplot(412)  # 四行一列的第二个子图
plt.title("Mixed Signals (Observed)", fontsize=14)
colors = ['purple''orange''cyan']
for i, signal in enumerate(X.T):
    plt.plot(time, signal + i * 3, color=colors[i], label=f"Mixed {i+1}")  # 同样对信号偏移
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.legend()
plt.grid(True)

# 分离后的独立信号
plt.subplot(413)  # 四行一列的第三个子图
plt.title("Recovered Independent Signals (ICA Output)", fontsize=14)
colors = ['magenta''lime''gold']
for i, signal in enumerate(S_ica.T):
    plt.plot(time, signal + i * 3, color=colors[i], label=f"Recovered {i+1}")  # 偏移便于区分
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.legend()
plt.grid(True)

# 混合矩阵的热力图可视化
plt.subplot(414)  # 四行一列的第四个子图
plt.title("Heatmap of Mixing Matrix", fontsize=14)
plt.imshow(A, cmap='viridis', aspect='auto')
plt.colorbar(label='Value')
plt.xticks(range(A.shape[1]), labels=[f"Source {i+1}" for i in range(A.shape[1])])
plt.yticks(range(A.shape[0]), labels=[f"Mixed {i+1}" for i in range(A.shape[0])])
plt.xlabel("Source Components")
plt.ylabel("Mixed Signals")

# 调整布局并展示
plt.tight_layout()
plt.show()

原始信号:显示了三个独立的源信号,分别为正弦波、方波和高斯噪声。

混合信号:经过混合矩阵后的信号,信号成分叠加,看起来更复杂。

分离信号:ICA 分离出的信号,基本恢复了原始的独立信号。

混合矩阵的热力图。

相信大家从最初的简单案例,到详细的原理,以及最后完整的案例,一定会有所收获,如果有问题,可以评论区留言,随时沟通~

最后

以上就是今天所有的内容了。
获取本文PDF,点击名片回复「基础算法模型」即可~
 
另外, 我们整理了机器学习算法册子,总共16大块的内容,124个问题的总结点击领取!
如果对你来说比较有用,记得点赞、转发,收藏起来慢慢学习~
下期会有更多干货等着你!~

Python和机器学习初学者
Python和机器学习分享,只写干货,一起学习~
 最新文章