Оцените коэффициент корреляции Пирсона из потока данных

Есть ли способ оценить корреляцию двух переменных, если данные получены порциями без сохранения полученных пар?

Например, получаем пары:

  1. [(x1, y1), (x2, y2), (x3, y3)]

  2. [(x4, y4)]

  3. [(x5, y5), (x6, y6)]

и мы должны оценить корреляцию между x1: 6 и y1: 6.

Неоптимальное решение:

Хотя это определение работает:  Корреляция

это неоптимально, поскольку, если у нас есть большие значения в потоке, квадраты значений легко переполнятся.


person Ramon    schedule 03.12.2020    source источник


Ответы (1)


Да, это можно вычислить постепенно. Этот метод представляет собой небольшое обобщение алгоритма Велфорда, см., Например,

Вы поддерживаете ряд переменных, обновляя их каждый раз, когда поступают данные. На каждом этапе это средние значения и т. Д. Данных, которые наблюдались до сих пор.

Инициализация:

int n = 0; // number of points
double mx = 0.0; // mean of x's
double my = 0.0; // mean of y's
double vx = 0.0; // variance of x's
double vy = 0.0; // variance of y's
double cxy = 0.0; // covariance of x and y

Обновление (новые значения x, y в)

  n += 1;
double f = 1.0/n;
double dx = x - mx;
double dy = y - my;
  mx += f*dx;
  my += f*dy;
  vx = (1.0-f)*(vx + f*dx*dx);
  vy = (1.0-f)*(vy + f*dy*dy);
  cxy= (1.0-f)*(cxy+ f*dx*dy);

В терминах этих переменных мы имеем

rxy = cxy/sqrt( vx*vy)

Обратите внимание, что vx и vy будут равны нулю только после одной пары, как было видно.

Не удивляйтесь, если поток оценок для rxy будет зашумленным. Оценки корреляции, как правило, таковы.

person dmuir    schedule 03.12.2020