我們有一條曲線,怎么畫出線性回歸曲線呢?
第一 先把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"); }
歡迎大家進入我們的群一起交流,學習