从数据流中估计 Pearson 相关系数

Estimate Pearson correlation coefficient from stream of data

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

例如,我们收到对:

  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 的估计流有噪声,请不要感到惊讶。相关性估计往往如此。