[线性代数] 矩阵白化

给一个任意矩阵 X,一般情况下它的协方差矩阵并不是对角矩阵。矩阵白化就是用一个白化矩阵 A,使 Y = A * X 的协方差矩阵转化为对角矩阵。

这里首先指出 Y = A * X 成立的前提是 X 中的元素是按列排列的,如果 X 按行排列,Y = X * A。

1. 数学推导

如果数据按行排列则协方差矩阵的定义是(假设 X is already zero-mean):

我们的目标是找到白化矩阵 A 使 cov(Y) 为对角矩阵。为了简化,下面的推导过程中省略了前面的系数 1/(m-1), U 和 D 分别是 cov(X) 的特征向量和特征值对角矩阵:



结论就是如果数据按行排列,白化矩阵 A 为:

Y = X * A。
如果数据按列排列,白化矩阵 A 为:

Y =  A * X。

2. matlab 代码

clear; clc;

%% data are stored as rows.
X = randi(10,2,3);
[rows, cols] = size(X);  

%% zero-mean.
meanMatrix = mean(X);  
X = X - ones(rows, 1) * meanMatrix;

%%
% covM is symmetric, so svd is the same as eig.
% 1. U = V
% 2. svd is more stable than eig.
covM = cov(X);
[U, D, V] = svd(covM)

% add a small number eps to avoid singular Matrix situations.
A = U * inv(diag(sqrt(diag(D) + eps)));     % use inv
% A = U * diag(1 ./ (sqrt(diag(D) + eps))); % or use ./

Y = X * A
cov(Y)


你可能感兴趣的:([线性代数] 矩阵白化)