numpy中数据矩阵的白化转换不会复制MATLAB结果

时间:2017-04-12 12:06:54

标签: matlab numpy scipy linear-algebra matrix-inverse

我试图在numpy中进行矩阵的美白变换(或sphering变换)。有很多方法可以做到这一点(例如,通过计算特征值),但我正在寻找下面描述的这种特定方法的解决方案。我试图将协方差矩阵提升为负分数幂。

这就是人们在MATLAB中使用示例矩阵A:

的方式
A = [1 2 3; 4 5 6; 7 8 9; 10 11 12];
C = cov(A);
C^-0.5

作为答案,我得到一个矩阵,其元素有实部和虚部。

当我尝试在Python中执行相同操作时,我得到一个nans矩阵:

from scipy.linalg import fractional_matrix_power
import numpy as np

A=np.asarray([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
C=np.cov(np.transpose(A))
fractional_matrix_power(C, -0.5)

我在这里错过了什么吗?

我尝试了解决方案suggested in this answer,但我不确定这是否正在计算我想要的内容。在MATLAB和Python中得到的矩阵是不一样的(因为这个问题的解决方案(C -0.5 )不是唯一的?)。

from scipy.linalg import logm, expm
E = -0.5*logm(C)
F = expm(E)

等效的MATLAB代码是:

expm((-0.5)*logm(C))

有没有办法检查这个?例如,C -0.5 的平方是否等于C的倒数,在这种情况下,它们的乘法将导致身份矩阵?

在尝试使用Python进行调试时,我遇到了其他一些奇怪的事情(与上述问题没有直接关系,但可能暗示我面临的一些问题)。

矩阵及其逆的乘法不是我

D = fractional_matrix_power(C, 0.5)
E = np.linalg.inv(D)
np.dot(E,D)

上述操作不返回Identity矩阵。不应该吗?它在MATLAB中。我也使用scipy.linalg.inv而不是numpy版本,但没有帮助。

0 个答案:

没有答案