从数据流中估计 Pearson 相关系数
Estimate Pearson correlation coefficient from stream of data
如果数据以块而不存储接收到的数据对的方式接收,是否有方法估计两个变量的相关性?
例如,我们收到对:
[(x1, y1), (x2, y2), (x3, y3)]
[(x4, y4)]
[(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 的估计流有噪声,请不要感到惊讶。相关性估计往往如此。
如果数据以块而不存储接收到的数据对的方式接收,是否有方法估计两个变量的相关性?
例如,我们收到对:
[(x1, y1), (x2, y2), (x3, y3)]
[(x4, y4)]
[(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 的估计流有噪声,请不要感到惊讶。相关性估计往往如此。