最小二乘法的计算方法(回归直线法)

 

我们有一条曲线,怎么画出线性回归曲线呢?

第一   先把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");
 
}

 

 

欢迎大家进入我们的群一起交流,学习

 

posted @   funiyi816  阅读(9099)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示