最小二乘法的计算方法(回归直线法)
我们有一条曲线,怎么画出线性回归曲线呢?
第一 先把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#测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | /// <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" ); } |
欢迎大家进入我们的群一起交流,学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?