数据白化(Data Whitening)原理与python代码

本文详细介绍了数据白化(DataWhitening)的概念,包括其数学原理,如何使用Python进行操作,以及通过实例展示了如何将具有特定协方差矩阵的数据转换为均值为0、方差为1且协方差为0的新变量集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据白化(Data Whitening)原理与python代码、python程序

“数据白化” 操作的目的是:将多个分布转化为(均值为0,方差为1,协方差为0)的分布。
白化变换是一种线性变换,它将具有已知协方差矩阵的随机变量向量转换为新变量集,其均值为0,其协方差为单位矩阵,意味着它们不相关,并且每个变量的方差为1。

1、数学原理
xxx~ND(μ,Σ)N_D(\mu,\Sigma)ND(μ,Σ)zzz~ND(0,E)N_D(0,E)ND(0,E)

1.1、公式推导
XXX~ND(μ,Σ)N_D(\mu,\Sigma)ND(μ,Σ)

ZZZ=(X−μ)(X-\mu)(Xμ) Σ−0.5\Sigma^{-0.5}Σ0.5

=(X−μ)(X-\mu)(Xμ) WWW D−0.5D^{-0.5}D0.5 WTW^TWT

其中,矩阵WWW是 “协方差矩阵 Σ\SigmaΣ ” 的特征矩阵,W=[w1,w2,...wn]W=[w_1,w_2,...w_n]W=[w1,w2,...wn]w1w_1w1w2w_2w2wnw_nwn,是 “协方差矩阵 Σ\SigmaΣ ” 的特征向量,nnn 是 “协方差矩阵 Σ\SigmaΣ ” 的维度大小。
D−0.5​=[λ1−0.5000λ2−0.5000λn−0.5] D^{-0.5}​ = \left[ \begin{matrix} \lambda_1^{-0.5} & 0 & 0 \\ 0 & \lambda_2^{-0.5} & 0 \\ 0 & 0 & \lambda_n^{-0.5} \end{matrix} \right] D0.5=λ10.5000λ20.5000λn0.5
其中,矩阵DDD是对角矩阵,其对角线上元素为 “协方差矩阵 Σ\SigmaΣ ”的特征值。

2、实例

import numpy as np

# 每一行代表一个样本,每一列代表一个特征。
# 认为每一列,即每一个特征具有一个分布。
A = np.array([
    [17.08457711,	22.61576081,	203.3386133],
    [19.70149254,	27.87784298,	176.0068371],
    [11.65671642,	17.96361718,	194.8588095],
    [23.95522388,	32.10314533,	197.4329122],
    [18.70646766,	25.72878056,	180.3631946],
    [2.044776119,	2.380476143,	231.4212621],
    [2.179104478,	2.529428779,	237.9855568],
    [2.07960199,	2.431141247,	230.4704282],
    [2.179104478,	2.501740688,	227.078446],
    [2.169154229,	2.591605277,	242.792894]
])
# 计算每列均值
column_means = np.mean(A, axis=0)

# 计算协方差矩阵
covariance_matrix = np.cov(A, rowvar=False)

# 将每个元素减去所在列的均值
A_centered = A - column_means

# 对协方差矩阵进行特征值分解
eigenvalues, eigenvectors = np.linalg.eigh(covariance_matrix)

# 构造特征值的对角矩阵
D = np.diag(eigenvalues)

# 计算 A = WDW^T
covariance_matrix_reconstructed = np.dot(eigenvectors, np.dot(D, eigenvectors.T))

# 对特征值进行“-0.5次幂”操作
sqrt_inv_eigenvalues = np.diag(1.0 / np.sqrt(eigenvalues))

D_neg_0_5 = np.diag(sqrt_inv_eigenvalues)

Z = np.dot(A_centered,np.dot(np.dot(eigenvectors,sqrt_inv_eigenvalues),eigenvectors.T))

# 计算z的均值,与协方差矩阵
# 计算每列均值
column_means_Z = np.mean(Z, axis=0)
# 计算协方差矩阵
covariance_matrix_Z = np.cov(Z, rowvar=False)

print("z")
print(Z)
print("column_means_Z")
print(column_means_Z)
print("covariance_matrix_Z")
print(covariance_matrix_Z)

2.1、结果验证

Z
[[ 1.22515433 0.32545596 0.03891343]
[-0.04010495 0.13798136 -1.57216174]
[-2.1325392 1.02756441 -0.93042199]
[ 1.28287007 1.92085036 0.38661855]
[ 0.85751323 -0.63725821 -1.43948917]
[-0.1605952 -0.8487307 0.500477 ]
[-0.35305255 -0.12191592 1.01615413]
[-0.13033371 -0.93950466 0.43181074]
[ 0.07945394 -1.36278028 0.17555514]
[-0.62836595 0.49833767 1.39254393]]

column_means_Z
[ 2.73114864e-15, -2.89768209e-15, -7.10542736e-16]
covariance_matrix_Z
[[ 1.00000000e+00, 6.71516857e-13, 3.81715972e-14]
[ 6.71516857e-13, 1.00000000e+00, -3.32529068e-14]
[ 3.81715972e-14, -3.32529068e-14, 1.00000000e+00]]

可见,变量[z1,z2,z3]服从为均值为0,方差为1,相互的协方差为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值