最小二乘法的計算方法(回歸直線法)


 

我們有一條曲線,怎么畫出線性回歸曲線呢?

第一   先把n個數據測量值畫在坐標紙上,如果呈現一種直線趨勢,才可以進行最小二乘法(直線回歸法)。

  

第二  然后就是計算這些n個數據點的橫坐標和縱坐標的各自平均值,利用如下計算公式:

  

 

 

 第三  接着計算所有點的橫坐標求和結果,以及所有點的縱坐標求和結果,如下圖所示:

  

 

 

 

 第四  然后是計算每個數據點橫坐標的平方,然后求和,以及計算每個點橫坐標乘以縱坐標的乘積,然后求和,如下圖所示:

  

第五  最后就是利用兩個公式,把將要求的直線方程中的截距a和斜率b這兩個參數代入上面的公式計算出來,如下圖所示:

  

 

 

 第六  求出了a和b這兩個參數之后,就可以得到直線方程:y=ax+b。這個時候還要利用這個方程,先取兩個點,

這兩個點要求橫坐標x1和x2距離比較遠,這樣誤差會比較小(太近的兩個點,誤差比較大),

然后分別代入剛求出來的直線方程y=ax+b,求出對應的y1和y2,然后把(x1,y1)和(x2,y2)描點在坐標紙上,

這樣就可以利用兩點畫出一條最終的回歸直線了。

  

 

方法分享結束:那么這些計算方法對不對呢?我們怎么驗證查看呢?這個才是關鍵,如果方法是錯的,我們的結果將沒有意義!

驗證步驟1:首先創建一個空白 Excel文件

驗證步驟2:在Excel里面錄入一些待驗證使用的數據

  

驗證步驟3:鼠標選中這些數據,右鍵菜單  快速分析

  

 

驗證步驟4:選擇圖表、散點圖

   

 

驗證步驟5:鼠標點擊圖表中出現的五個點中的任意一個,在點被選中的狀態下,右鍵菜單,添加趨勢線

  

 

 驗證步驟6:最后看到我們的方法計算的結果 與 Excel自動計算的結果 是一樣的(驗證完成)

   

 

C#測試

 

        /// <summary>
        /// 計算結果
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCalculationResults_Click(object sender, EventArgs e)
        {
            double a = 0.0;
            double b = 0.0;

            double RCA = 0.0;
            double RCB = 0.0;
            double residualSS = 0.0;
            double regressionSS = 0.0;

            double[] dx = new double[5];
            double[] dy = new double[5];
            double[] dr = new double[5];

            foreach (Control ctl in this.Controls)
            {
                if (ctl is TextBox && ctl.Name != "textBox1")
                {

                    try
                    {
                        int i = Convert.ToInt32(ctl.Name.Substring(ctl.Name.LastIndexOf("_") + 1))-1;
                        dx[i] = Convert.ToDouble(ctl.Text.Substring(0,ctl.Text.LastIndexOf(",")));
                        dy[i] = Convert.ToDouble(ctl.Text.Substring(ctl.Text.LastIndexOf(",") + 1));
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("轉換出錯:" + ex.Message);
                        return;
                    }

                }
            }

            this.textBox1.Text = $"===========最小二乘法線性回歸 ab值===============" + "\r\n";
            dr = FitLine.MultiLine(dx, dy, 5, 1);
            this.textBox1.AppendText($"a={dr[0]},  b={dr[1]} " + "\r\n");

            double maxErr = 0.0;
            double rSquared = 0.0;
            FitLineTwo.CalcRegress(dx, dy, 5, out a, out b, out maxErr, out rSquared);
            this.textBox1.AppendText($"========最小二乘法線性回歸 ab值 + MaxErr + R² ======" + "\r\n");
            this.textBox1.AppendText($"a={a},  b={b} " + "\r\n");
            this.textBox1.AppendText($"maxErr={maxErr},  R²={rSquared} " + "\r\n");

        }

 

 

歡迎大家進入我們的群一起交流,學習

 


免責聲明!

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



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