将稀疏(包含零)协方差矩阵转换为相关矩阵的最佳方法?

计算科学 Python 稀疏矩阵 麻木的 统计数据
2021-12-18 02:27:45

我有一个100X100看起来像这样的协方差矩阵。在此处输入图像描述

一些行/列全为零,因为那些相应的元素不存在于计算协方差的样本中。我是这样做的:

    ...
    adjmats = [get_adjmat(graph) for graph in samples]                   # array of adjacency matrices
    reduced = functools.reduce(lambda x, y: np.add(x, y), adjmats)       # add all elem-wise
    adjacency = np.divide(reduced, len(adjmats))                         # divide by number: "mean"


    fig, ax = plt.subplots()

    covariance= np.cov(adjacency)                                        # getting covariance 


    def correlation_from_covariance(covariance):
        v = np.sqrt(np.diag(covariance))
        outer_v = np.outer(v, v)
        correlation = covariance / outer_v                   <<<<<<      # complains here!
        correlation[covariance == 0] = 0
        return correlation

    correlation = correlation_from_covariance(covariance)                # attempting to convert

    im = ax.imshow(correlation)

当我尝试获取相关矩阵时,我隐约知道它是协方差矩阵的标准“归一化”版本,numpy 抱怨:subunit_graph.py:218: RuntimeWarning: invalid value encountered in true_divide correlation = covariance / outer_v,但我仍然得到一个合理的相关矩阵。有人可以向我解释那里到底发生了什么true_divide吗?
非常感谢!

在此处输入图像描述

1个回答

下面的呢?

Dinv = np.diag(1.0 / np.sqrt(np.diag(cov_matrix)))
corr = Dinv @ cov_matrix @ Dinv

上面避免了除对角线值之外的任何除法,对角线值无论如何都应该是非零的。