我试图在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版本,但没有帮助。