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