公式一 (定義式):
r = Σ((xi - x̄)(yi - ȳ)) / sqrt(Σ(xi - x̄)² Σ(yi - ȳ)²)
公式二 (計算式/單遍掃描):
r = (nΣxiyi - ΣxiΣyi) / sqrt([nΣxi² - (Σxi)²] [nΣyi² - (Σyi)²])
x̄ 和 ȳ (平均值),**必須先完整掃描一次數據求和計算平均值**,第二遍才能計算分子分母。Σxi, Σyi, Σxiyi, Σxi², Σyi² 五個累加器,**一次循環即可完成**。// 公式一:兩遍
double sumX=0, sumY=0;
for (v: data) { sumX+=v.x; sumY+=v.y; }
double avgX=sumX/n, avgY=sumY/n;
double num=0, denX=0, denY=0;
for (v: data) {
double dx=v.x-avgX, dy=v.y-avgY;
num+=dx*dy; denX+=dx*dx; denY+=dy*dy;
}
r = num / sqrt(denX*denY);
// 公式二:單遍
double Sx=0, Sy=0, Sxy=0, Sx2=0, Sy2=0;
for (v: data) {
Sx+=v.x; Sy+=v.y; Sxy+=v.x*v.y; Sx2+=v.x*v.x; Sy2+=v.y*v.y;
}
r = (n*Sxy - Sx*Sy) / sqrt((n*Sx2 - Sx*Sx) * (n*Sy2 - Sy*Sy));
公式二對大數據量、大數值**存在災難性抵消** (減去兩個接近的大數),精度損失嚴重。工程實踐中: