白化

转自https://blog.youkuaiyun.com/zchang81/article/details/70211445

 

白化的目的是去除输入数据的冗余信息。

例如:训练数据是图像,由于图像中相邻像素之间具有很强的相关性,因此输入是冗余的。白化的目的就是降低输入的冗余性。

输入数据集,经过白化处理后,生成的新数据集满足两个条件:一是特征相关性较低;二是特征具有相同的方差。

白化算法的实现过程:第一步操作是PCA,求出新特征空间中的新坐标,第二步是对新的坐标进行方差归一化操作。

白化分为PCA白化、ZCA白化,算法实现步骤如下:

PCA预处理:

     

左图表示原始数据X,然后我们通过协方差矩阵可以求得特征向量u1、u2,然后把每个数据点,投影到这两个新的特征向量(这两个特征向量是不变且正交的),得到进行坐标如下:

这就是pca处理。

 

PCA白化

pca白化是指对上面的pca的新坐标X’,每一维的特征做一个标准差归一化处理。从上面我们看到在新的坐标空间中,(x1,x2)两个坐标轴方向的数据明显标准差不同,因此我们接着要对新的每一维坐标做一个标注差归一化处理。

ZCA白化

ZCA白虎是在PCA白化的基础上,把上面PCA白化的结果,又变换到原来坐标系下的坐标

### 白化算法的原理与实现 白化是一种预处理技术,通常用于机器学习和信号处理领域。其核心目标是对数据进行线性变换,使得经过变换的数据具有单位协方差矩阵[^1]。这意味着: - 数据的每一维度都有零均值; - 各维度之间的相关性被消除。 #### 原理概述 白化的本质在于去除数据的相关性和缩放特征到相同的范围。具体来说,给定一个随机向量 \( X \),它的协方差矩阵为 \( C_X = E[(X-E[X])(X-E[X])^T] \)[^2]。为了实现白化,我们需要找到一个线性变换矩阵 \( W \),使得新的随机向量 \( Y = WX \) 满足以下条件: \[ Cov(Y) = I, \] 其中 \( I \) 是单位矩阵。 这一过程可以通过奇异值分解(SVD)或特征值分解来实现。以下是两种常见的白化方法及其对应的实现步骤。 --- #### 方法一:基于 SVD 的白化 1. **中心化** 将原始数据减去均值,得到零均值数据 \( Z = X - \mu \), 其中 \( \mu = E[X] \)[^3]。 2. **计算协方差矩阵** 对于零均值数据 \( Z \),计算其协方差矩阵 \( C_Z = ZZ^T / n \),其中 \( n \) 是样本数量[^4]。 3. **奇异值分解 (SVD)** 对协方差矩阵 \( C_Z \) 进行奇异值分解: \[ C_Z = U\Sigma V^T \][^1], 其中 \( U \) 和 \( V \) 是正交矩阵,\( \Sigma \) 是对角矩阵,包含奇异值。 4. **构建白化矩阵** 构造白化矩阵 \( W_{whiten} = V D^{-1/2} U^T \),其中 \( D^{-1/2} \) 是由 \( \Sigma \) 中奇异值平方根倒数构成的对角矩阵[^1]。 5. **应用白化矩阵** 使用白化矩阵对数据进行变换: \[ Y = W_{whiten}Z \] --- #### 方法二:基于特征值分解的白化 1. **中心化** 类似于方法一,先将数据 \( X \) 转换为中心化数据 \( Z = X - \mu \)[^3]。 2. **计算协方差矩阵并分解** 计算协方差矩阵 \( C_Z = ZZ^T / n \),并对该矩阵执行特征值分解: \[ C_Z = Q\Lambda Q^T \][^2], 其中 \( Q \) 是特征向量组成的正交矩阵,\( \Lambda \) 是对角矩阵,包含特征值。 3. **构建白化矩阵** 定义白化矩阵 \( W_{whiten} = Q\Lambda^{-1/2}Q^T \),其中 \( \Lambda^{-1/2} \) 表示对角线上每个元素取平方根后再求倒数[^1]。 4. **应用白化矩阵** 变换数据以获得白化后的结果: \[ Y = W_{whiten}Z \] --- #### Python 实现代码 下面是一个简单的基于特征值分解的白化算法实现: ```python import numpy as np def whiten(X): """ 对输入数据 X 执行白化操作 :param X: 输入数据矩阵,形状为 (n_samples, n_features) :return: 白化后的数据矩阵 """ # 1. 中心化 mean = np.mean(X, axis=0) Z = X - mean # 2. 计算协方差矩阵 cov_matrix = np.cov(Z.T) # 3. 特征值分解 eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix) # 4. 构建白化矩阵 Lambda_inv_sqrt = np.diag(1.0 / np.sqrt(eigenvalues)) whitening_matrix = np.dot(np.dot(eigenvectors, Lambda_inv_sqrt), eigenvectors.T) # 5. 应用白化矩阵 Y = np.dot(Z, whitening_matrix) return Y # 测试 data = np.random.rand(100, 5) # 随机生成一些数据 white_data = whiten(data) print("Original Data Shape:", data.shape) print("Whitened Data Shape:", white_data.shape) ``` --- #### 注意事项 1. 白化会改变数据分布特性,可能会影响后续分析的结果。因此,在某些场景下需谨慎使用。 2. 如果数据规模较大,则建议采用数值稳定的方法(如 SVD),以避免因浮点误差导致的问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值