python - 在 Python 中加速一对多相关性计算

标签 python python-2.7 numpy scipy statistics

我想计算 Python 中向量与数组每一行之间的 Pearson 相关系数(假定为 numpy 和/或 scipy)。由于实际数据数组的大小和内存限制,将无法使用标准相关矩阵计算函数。这是我天真的实现:

import numpy as np
import scipy.stats as sps

np.random.seed(0)

def correlateOneWithMany(one, many):
    """Return Pearson's correlation coef of 'one' with each row of 'many'."""
    pr_arr = np.zeros((many.shape[0], 2), dtype=np.float64)
    pr_arr[:] = np.nan
    for row_num in np.arange(many.shape[0]):
        pr_arr[row_num, :] = sps.pearsonr(one, many[row_num, :])
    return pr_arr

obs, varz = 10 ** 3, 500
X = np.random.uniform(size=(obs, varz))

pr = correlateOneWithMany(X[0, :], X)

%timeit correlateOneWithMany(X[0, :], X)
# 10 loops, best of 3: 38.9 ms per loop

如有任何关于加快这一进程的想法,我们将不胜感激!

最佳答案

模块scipy.spatial.distance实现“相关距离”,它只是一个减去相关系数。您可以使用函数 cdist计算一对多距离,用1减去结果得到相关系数。

这是您的脚本的修改版本,其中包括使用 cdist 计算相关系数:

import numpy as np
import scipy.stats as sps
from scipy.spatial.distance import cdist

np.random.seed(0)

def correlateOneWithMany(one, many):
    """Return Pearson's correlation coef of 'one' with each row of 'many'."""
    pr_arr = np.zeros((many.shape[0], 2), dtype=np.float64)
    pr_arr[:] = np.nan
    for row_num in np.arange(many.shape[0]):
        pr_arr[row_num, :] = sps.pearsonr(one, many[row_num, :])
    return pr_arr

obs, varz = 10 ** 3, 500
X = np.random.uniform(size=(obs, varz))

pr = correlateOneWithMany(X[0, :], X)

c = 1 - cdist(X[0:1, :], X, metric='correlation')[0]

print(np.allclose(c, pr[:, 0]))

时间:

In [133]: %timeit correlateOneWithMany(X[0, :], X)
10 loops, best of 3: 37.7 ms per loop

In [134]: %timeit 1 - cdist(X[0:1, :], X, metric='correlation')[0]
1000 loops, best of 3: 1.11 ms per loop

关于python - 在 Python 中加速一对多相关性计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37579036/

相关文章:

google-app-engine - user.nickname 给出一个 URL 而不是昵称 python GAE

python - 如果 enumerate() 循环后面有一个中断,那么修改该循环内的元素是否安全?

python - Python 中的 Xpath 生成器

python - 返回鼠标Tkinter下图像像素的RGB颜色

python - 查找边界之间错误颜色的像素

python - 如何使用 numpy Python 打印 3D 矩阵中的特定列

python - 引用数据框对象的索引和列?

python - 如何在终止 Python 脚本时运行清理

Python - 保存除大属性之外的整个类对象

python - 从 Python 3.4 的列表中返回所有对