最小二乘法的计算方法(回归直线法)
我们有一条曲线,怎么画出线性回归曲线呢?
第一 先把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");
}
欢迎大家进入我们的群一起交流,学习


浙公网安备 33010602011771号