Отбеленные и неотбеленные данные - не одно и то же
Я хочу осветлить свои данные, а затем применить к ним некоторые дальнейшие преобразования. Чтобы точно понять, что происходит и чего ожидать, я сначала отбелил данные, а затем снял их с помощью разложения Холецкого. Ковариация восстановленных данных такая же, но сами данные - нет. Я ожидал, что восстановленные данные должны быть такими же, поскольку все, что мы делаем, это некоторые линейные преобразования. Я что-то не так делаю?
Тестовый код на Python:
import numpy as np
np.set_printoptions(precision=3, suppress=True)
np.random.seed(1)
def whiten(X):
Xmean = np.mean(X, axis=0)
U, s, Vt = np.linalg.svd(X-Xmean, full_matrices=False)
Xwhite = np.dot(U, Vt)
return Xwhite + Xmean
def project_cov_cholesky(X, sigma):
Xmean = np.mean(X, axis=0)
X = X-Xmean
L = np.linalg.cholesky(sigma)
X = L.dot(X.T).T
return X+Xmean
X = np.random.rand(200, 4)
# add correlation between variables
X[:,1] = (X[:,1]+X[:,0])/2
X[:,2] = 2*(X[:,2]-X[:,0])
# get covariance
Xdemean = X - np.mean(X, axis=0)
cov = np.dot(Xdemean.T, Xdemean)
print(cov)
# whiten
Xw = whiten(X)
# reconstruct/un-whiten and see the covariance
Xuw = project_cov_cholesky(Xw, cov)
Xuwdemean = Xuw - np.mean(Xuw, axis=0)
print(np.dot(Xuwdemean.T, Xuwdemean))
# get correlation between the original and reconstructed data
cc = np.array([])
for i in range(X.shape[1]):
cc = np.append(cc, np.corrcoef(X[:,i], Xuw[:,i])[0,1])
print(cc)
print(X[1:5,:])
print(Xuw[1:5,:])
Выход:
# covariance of original data
[[ 16.203 8.618 -27.785 1.134]
[ 8.618 8.727 -15.645 1.443]
[-27.785 -15.645 116.293 -4.725]
[ 1.134 1.443 -4.725 17.151]]
# covariance of reconstructed data
[[ 16.203 8.618 -27.785 1.134]
[ 8.618 8.727 -15.645 1.443]
[-27.785 -15.645 116.293 -4.725]
[ 1.134 1.443 -4.725 17.151]]
# original data
[[ 0.147 0.12 0.079 0.346]
[ 0.397 0.468 0.045 0.685]
[ 0.204 0.541 -0.354 0.67 ]
[ 0.417 0.488 -0.554 0.198]]
# reconstructed data
[[ 0.21 0.094 0.405 0.297]
[ 0.383 0.433 0.21 0.675]
[-0.041 0.321 0.486 0.651]
[ 0.261 0.374 -0.124 0.186]]
[0.834 0.866 0.869 0.997]