先上代碼:
1 /// <summary> 2 /// 最小二乘法線性擬合 3 /// </summary> 4 /// <param name="x">橫坐標集合</param> 5 /// <param name="y">縱坐標集合</param> 6 /// <param name="slope">返回擬合直線的斜率</param> 7 /// <param name="intercept">返回擬合直線的截距</param> 8 /// <param name="r_square">返回相關系數R²</param> 9 static void LinearFitting(double[] x, double[] y, out double slope, out double intercept, out double r_square) 10 { 11 int length = x.Length; 12 double xmean = 0.0; 13 double ymean = 0.0; 14 for (int i = 0; i < length; i++) 15 { 16 xmean += x[i]; 17 ymean += y[i]; 18 } 19 xmean /= length; 20 ymean /= length; 21 22 double sumx2 = 0.0; 23 double sumy2 = 0.0; 24 double sumxy = 0.0; 25 for (int i = 0; i < length; i++) 26 { 27 sumx2 += (x[i] - xmean) * (x[i] - xmean); 28 sumy2 += (y[i] - ymean) * (y[i] - ymean); 29 sumxy += (y[i] - ymean) * (x[i] - xmean); 30 } 31 slope = sumxy / sumx2; 32 intercept = ymean - slope * xmean; 33 r_square = sumxy * sumxy / (sumx2 * sumy2);
34 }
算法解釋:
曲線擬合的常用方法:
偏差絕對值之和最小:
偏差絕對值最大的最小:
偏差平方和最小:
其中使偏差平方和最小的方法稱為最小二乘法。
以直線擬合為例。設x和y之間的函數關系為:
上式中有兩個待定參數,a代表截距,b代表斜率。對於等精度測量所得到的N組數據(xi,yi),i=1,2……,N,xi值被認為是准確的,所有的誤差只聯系着yi;
用最小二乘法估計參數時,要求觀測值yi的偏差的加權平方和為最小。對於等精度觀測值的直線擬合來說,可使下式的值最小:
令上式等於D,並對a,b分別求一階偏導數:
再求二階偏導數:
顯然二階偏導數均為非負數。令一階偏導數為0:
解得:
相關系數r:
最小二乘法處理數據除給出a、b外,常常還給出相關系數r,r定義為:
(完)