从数据流中估计皮尔逊相关系数

问题描述

如果数据是以区块形式接收的而不是存储收到的数据对,是否有办法估计两个变量之间的相关性?

例如,我们收到以下对:

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

  2. [(x4,y4)]

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

我们必须估计x1:6和y1:6之间的相关性。

非最优解:

即使此定义有效:

它不是最优的,因为如果流上的值很大,平方的值很容易溢出。


解决方案

是,可以递增计算。该方法是Welford算法的一个小推广,见here, for example

您维护许多变量,每次数据传入时都会更新它们。在每个阶段,这些是到目前为止看到的数据的平均值

初始化:

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 in)

  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的估计流是嘈杂的,不要感到惊讶。对相关性的估计往往是如此。

相关文章