python中稀疏矩阵的相关系数?

2024-05-16 11:25:03 发布

您现在位置:Python中文网/ 问答频道 /正文

有人知道如何从python中的一个非常大的稀疏矩阵计算相关矩阵吗?基本上,我正在寻找类似numpy.corrcoef的东西,它将在一个scipy稀疏矩阵上工作。


Tags: numpy矩阵scipycorrcoef
3条回答

从协方差矩阵可以相当直接地计算相关系数,如下所示:

import numpy as np
from scipy import sparse

def sparse_corrcoef(A, B=None):

    if B is not None:
        A = sparse.vstack((A, B), format='csr')

    A = A.astype(np.float64)
    n = A.shape[1]

    # Compute the covariance matrix
    rowsum = A.sum(1)
    centering = rowsum.dot(rowsum.T.conjugate()) / n
    C = (A.dot(A.T.conjugate()) - centering) / (n - 1)

    # The correlation coefficients are given by
    # C_{i,j} / sqrt(C_{i} * C_{j})
    d = np.diag(C)
    coeffs = C / np.sqrt(np.outer(d, d))

    return coeffs

检查它是否正常工作:

# some smallish sparse random matrices
a = sparse.rand(100, 100000, density=0.1, format='csr')
b = sparse.rand(100, 100000, density=0.1, format='csr')

coeffs1 = sparse_corrcoef(a, b)
coeffs2 = np.corrcoef(a.todense(), b.todense())

print(np.allclose(coeffs1, coeffs2))
# True

请注意:

计算协方差矩阵C所需的内存量将在很大程度上取决于A(和B的稀疏结构,如果给定的话)。例如,如果A是一个(m, n)矩阵,只包含一列非零值,那么C将是一个(n, n)矩阵,包含所有非零值。如果n很大,那么就内存消耗而言,这可能是一个非常坏的消息。

不幸的是,Alt's answer没有适合我。给np.sqrt函数的值,其中大部分为负,因此得到的协方差值为nan。

我也不能使用ali_m's answer,因为我的矩阵太大,无法在内存中容纳centering = rowsum.dot(rowsum.T.conjugate()) / n矩阵(矩阵的维数是:3.5*10^6 x 33)

相反,我使用scikit-learn's ^{}来计算标准稀疏矩阵,然后使用乘法来获得相关矩阵。

from sklearn.preprocessing import StandardScaler

def compute_sparse_correlation_matrix(A):
    scaler = StandardScaler(with_mean=False)
    scaled_A = scaler.fit_transform(A)  # Assuming A is a CSR or CSC matrix
    corr_matrix = (1/scaled_A.shape[0]) * (scaled_A.T @ scaled_A)
    return corr_matrix

我相信这种方法比其他提到的方法更快、更健壮。此外,它还保持了输入矩阵的稀疏性。

只使用numpy:

import numpy as np    
C=((A.T*A -(sum(A).T*sum(A)/N))/(N-1)).todense()
V=np.sqrt(np.mat(np.diag(C)).T*np.mat(np.diag(C)))
COV = np.divide(C,V+1e-119)

相关问题 更多 >