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

