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 ^{} 来计算标准稀疏矩阵,然后使用乘法来获得相关矩阵。
我相信这种方法比其他提到的方法更快、更健壮。此外,它还保持了输入矩阵的稀疏性。
只使用numpy:
相关问题 更多 >
编程相关推荐