数据白化(Data Whitening)原理与python代码、python程序
“数据白化” 操作的目的是:将多个分布转化为(均值为0,方差为1,协方差为0)的分布。
白化变换是一种线性变换,它将具有已知协方差矩阵的随机变量向量转换为新变量集,其均值为0,其协方差为单位矩阵,意味着它们不相关,并且每个变量的方差为1。
1、数学原理
x
x
x~
N
D
(
μ
,
Σ
)
N_D(\mu,\Sigma)
ND(μ,Σ) →
z
z
z~
N
D
(
0
,
E
)
N_D(0,E)
ND(0,E)
1.1、公式推导
X
X
X~
N
D
(
μ
,
Σ
)
N_D(\mu,\Sigma)
ND(μ,Σ)
Z Z Z= ( X − μ ) (X-\mu) (X−μ) Σ − 0.5 \Sigma^{-0.5} Σ−0.5
= ( X − μ ) (X-\mu) (X−μ) W W W D − 0.5 D^{-0.5} D−0.5 W T W^T WT
其中,矩阵
W
W
W是 “协方差矩阵
Σ
\Sigma
Σ ” 的特征矩阵,
W
=
[
w
1
,
w
2
,
.
.
.
w
n
]
W=[w_1,w_2,...w_n]
W=[w1,w2,...wn] ,
w
1
w_1
w1,
w
2
w_2
w2,
w
n
w_n
wn,是 “协方差矩阵
Σ
\Sigma
Σ ” 的特征向量,
n
n
n 是 “协方差矩阵
Σ
\Sigma
Σ ” 的维度大小。
D
−
0.5
=
[
λ
1
−
0.5
0
0
0
λ
2
−
0.5
0
0
0
λ
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]
D−0.5=
λ1−0.5000λ2−0.5000λn−0.5
其中,矩阵
D
D
D是对角矩阵,其对角线上元素为 “协方差矩阵
Σ
\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。