Быстро PearsonR между 1 вектором и многими другими? - PullRequest
0 голосов
/ 12 апреля 2020

Я ищу более эффективный способ вычисления коэффициентов Пирсона между вектором состояния c длины 1000 и многими другими векторами одинаковой длины.

Мой наивный подход был бы парной корреляцией:

import numpy as np
from scipy import stats
A = np.random.rand(1,1000)
otherVectors = np.random.rand(700,1000)

for B in otherVectors:
    R,p = stats.pearsonr(A, B)

Просто я хотел бы спросить, было ли более быстрое решение.

Большое спасибо!

1 Ответ

1 голос
/ 12 апреля 2020

Рассчитайте их вручную, все сразу.

def pearsonr_many(x, ys):
    x_mean = x.mean()
    y_means = ys.mean(axis=1)

    xm, yms = x - x_mean, ys - y_means[:, newaxis]
    r = yms @ xm / np.sqrt(xm @ xm * (yms * yms).sum(axis=1))
    r = r.clip(-1, 1)

    prob = special.betainc(
        len(x) / 2 - 1,
        0.5,
        1 / (1 + r * r / (1 - r * r))
    )

    return r, prob
...