有没有更快的方法来获得相关系数?
Is there a faster way to get correlation coefficents?
我有两个大型数据集 A (100,000x10,000) 和 B (100,000x250),我想计算它们之间的 Pearson 相关性。
带有 metric='correlation'
的 scipy.spatial.distance.cdist
函数完全符合我的要求。
corr = 1 - cdist(A.T,B.T,'correlation')
但是它花费的时间大约是 numpy.corrcoef
的 5 倍,尽管我可以丢弃它的大部分,其中在其中一个数据集内计算了相关性。
corr = corrcoef(np.hstack((A,B)).T)[len(A.T):,:len(A.t)].T
有没有更好的方法来快速做到这一点?
你可以试试这个实现,我没有足够的内存来测试你的输入大小。
看起来函数实现在内部使用 python 循环 here。
def pairwise_correlation(A, B):
am = A - np.mean(A, axis=0, keepdims=True)
bm = B - np.mean(B, axis=0, keepdims=True)
return am.T @ bm / (np.sqrt(
np.sum(am**2, axis=0,
keepdims=True)).T * np.sqrt(
np.sum(bm**2, axis=0, keepdims=True)))
我有两个大型数据集 A (100,000x10,000) 和 B (100,000x250),我想计算它们之间的 Pearson 相关性。
带有 metric='correlation'
的 scipy.spatial.distance.cdist
函数完全符合我的要求。
corr = 1 - cdist(A.T,B.T,'correlation')
但是它花费的时间大约是 numpy.corrcoef
的 5 倍,尽管我可以丢弃它的大部分,其中在其中一个数据集内计算了相关性。
corr = corrcoef(np.hstack((A,B)).T)[len(A.T):,:len(A.t)].T
有没有更好的方法来快速做到这一点?
你可以试试这个实现,我没有足够的内存来测试你的输入大小。
看起来函数实现在内部使用 python 循环 here。
def pairwise_correlation(A, B):
am = A - np.mean(A, axis=0, keepdims=True)
bm = B - np.mean(B, axis=0, keepdims=True)
return am.T @ bm / (np.sqrt(
np.sum(am**2, axis=0,
keepdims=True)).T * np.sqrt(
np.sum(bm**2, axis=0, keepdims=True)))