用最小二乘法線性擬合


 先上代碼:

 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    }

 算法解釋:

  曲線擬合的常用方法:

    偏差絕對值之和最小:

    

    偏差絕對值最大的最小:

    

    偏差平方和最小:

    

  其中使偏差平方和最小的方法稱為最小二乘法

  以直線擬合為例。設xy之間的函數關系為:

    

  上式中有兩個待定參數,a代表截距,b代表斜率。對於等精度測量所得到的N組數據(xiyi),i=1,2……,N,xi值被認為是准確的,所有的誤差只聯系着yi;

  用最小二乘法估計參數時,要求觀測值yi的偏差的加權平方和為最小。對於等精度觀測值的直線擬合來說,可使下式的值最小:

    

  令上式等於D,並對a,b分別求一階偏導數:

    

  再求二階偏導數:

    

  顯然二階偏導數均為非負數。令一階偏導數為0:

    

  解得:

    

  相關系數r:

    最小二乘法處理數據除給出a、b外,常常還給出相關系數r,r定義為:

    

(完)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM