使用scipy将协方差转换为相关性时出错

sc4hvdpw  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(117)

我尝试使用以下方法将协方差矩阵(来自scipy.optimize.curve_fit)转换为相关矩阵:https://math.stackexchange.com/questions/186959/correlation-matrix-from-covariance-matrix
我的测试数据来自这里https://blogs.sas.com/content/iml/2010/12/10/converting-between-correlation-and-covariance-matrices.html
我的代码在这里

import numpy as np

    S = [[1.0,  1.0,  8.1],
         [1.0, 16.0, 18.0],
         [8.1, 18.0, 81.0] ]

    S = np.array(S)
    diag = np.sqrt(np.diag(np.diag(S)))
    gaid = np.linalg.inv(diag)
    corl = gaid * S * gaid
    print(corl)

我希望看到[[1. 0.25 0.9 ], [0.25 1. 0.5 ], [0.9 0.5 1. ]],但得到的却是[[1. 0. 0.], [0. 1. 0.], [0. 0. 1.]]。我显然在做一些愚蠢的事情,但只是不知道是什么,所以所有的建议感激地收到-谢谢!

jhiyze9q

jhiyze9q1#

你现在可能已经弄明白了,但是你必须使用@运算符来进行numpy中的矩阵乘法。运算符 * 用于逐元素乘法。所以呢

corl = gaid @ S @ gaid

给出了你正在寻找的答案。

0qx6xfy6

0qx6xfy62#

这只是为了将来,如果其他人想要一个完整的答案,从相关性转换到协方差,以及所问的问题,从协方差转换到相关性。让我们使用下面的一些测试数据:

import numpy as np

# the correlation matrix
r = np.array([
      [1, -0.48, -0.42, -0.31, -0.37], 
      [-0.48, 1, 0.42, 0.55, 0.61],
      [-0.42, 0.42, 1, 0.35, 0.45],
      [-0.31, 0.55, 0.35, 1, 0.55],
      [-0.37, 0.61, 0.45, 0.55, 1]
      ])

# the std deviations
stdev = np.array([[1.86, 1.81, 0.87, 3.28, 4.18]])

以下函数将相关矩阵转换为协方差矩阵:

# cor to cov
def cor2cov(c, s):
    """
    Return a covariance matrix given a correlation matrix 
    and standard deviations.
    : c = covariance matrix
    : s = standard deviation
    """
    D = np.diag(s)
    return D * c * D
    
a = cor2cov(c=r, s=stdev)
print(a)

下面的函数将协方差矩阵转换为相关矩阵

# cov to cor
def cov2cor(c):
    """
    Return a correlation matrix given a covariance matrix. 
    : c = covariance matrix
    """
    D = 1 / np.sqrt(np.diag(c)) # takes the inverse of sqrt of diag.
    return D * c * D

# print(cov2cor(a))
print(cov2cor(c=a))

相关问题