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

 

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

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

        }

 

 

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

 

posted on 2021-05-14 13:27  funiyi816  阅读(8698)  评论(0编辑  收藏  举报

导航