一元线性回归模型和最小二乘法

目录

导言

 

一元线性回归模型

参数估计(最小二乘法)

最小二乘法c++实现


导言

监督学习中,预测的变量是离散的,则称分类   otherwise  连续的变量称回归。

回归中只包含一个自变量和因变量,二者为线性关系,则为一元线性模型。

如果自变量大于等于两个,则为多元(线性模型)。

 

一元线性回归模型

扫描二维码关注公众号,回复: 8529634 查看本文章

 总体回归函数中Y与X的关系可是线性的,也可是非线性的。对线性回归模型的“线性”有两种解释:
      (1)就变量而言是线性的,Y的条件均值是 X的线性函数
     (2)就参数而言是线性的,Y的条件均值是参数的线性函数
线性回归模型主要指就参数而言是“线性”,因为只要对参数而言是线性的,都可以用类似的方法估计其参数。
 

参数估计(最小二乘法)

平面上n个点,找到一个一元线性函数来拟合它们,使得总的拟合误差(总残差最小),三个标准可以选择:

     (1)用“残差和最小”确定直线位置是一个途径。但很快发现计算“残差和”存在相互抵消的问题。
        (2)用“残差绝对值和最小”确定直线位置也是一个途径。但绝对值的计算比较麻烦。
        (3)最小二乘法的原则是以“残差平方和最小”确定直线位置。用最小二乘法除了计算比较方便外,得到的估计量还具有优良特性。这种方法对异常值非常敏感。
 

最小二乘法(Least Square)使残差平方和达到最小。

样本regression  模型

    \LARGE Y_i=\hat{\beta_1}+\hat{\beta_2} X_i+e_i       

      即      \LARGE e_i=Y_i-\hat{\beta_1}-\hat{\beta_2} X_i

残差平方和函数Q

 \LARGE \boldsymbol{Q}=\sum_{i=1}^{n} e_i^2=\sum_{i=1}^{n} \left (Y_i-\hat{Y}_i \right )^2=\sum_{i=1}^{n} \left (Y_i-\hat{\beta_1}-\hat{\beta_2X_i}\right )^2

为使Q  最小, 需要对Q求导,Q对两个待估参数的偏导数为

\LARGE \frac{\partial Q}{\partial \beta_1}=2\sum_{i=1}^{n}(Y_i-\hat{\beta_1}-\hat{\beta_2 }X_i)(-1)=0

\LARGE \frac{\partial Q}{\partial \beta_2}=2\sum_{i=1}^{n}(Y_i-\hat{\beta_1}-\hat{\beta_2 }X_i)(-X_i)=0

解得

\LARGE \hat{\beta }_1 = \frac{\sum X_i^2 \sum Y_i-\sum X_i\sum X_iY_i }{n\sum X_i^2- (\sum X_i)^2}

\LARGE \hat{\beta }_2 = \frac{n\sum X_iY_i-\sum X_i\sum Y_i }{n\sum X_i^2- (\sum X_i)^2}

最小二乘法c++实现

#include<iostream>
#include<fstream>
#include<vector>

using namespace std;

class LeastSquare{

double a,b;
public:
        LeastSquare(const vector<double> &x,const vector<double>& y){
            double t1=0,t2=0,t3=0,t4=0;
            for(int i=0;i<x.size();++i)
            {
    
			    t1 += x[i]*x[i];

			    t2 += x[i];

			    t3 += x[i]*y[i];

			    t4 += y[i];
            }

 	    	a = (t3*x.size() - t2*t4) / (t1*x.size() - t2*t2);
		    b = (t1*t4 - t2*t3) / (t1*x.size() - t2*t2);
        }
    
        double getY(const double x) const
        {
            return a*x+b;
        }


        void print() const
        {

	    	cout<<"y = "<<a<<"x + "<<b<<"\n";

	    }

};



int main(int argc,char *argv[])
{
    vector<double> x;
    ifstream in(argv[1]);
    for(double d; in>>d)
            x.push_back(d);
    int len=x.size();

    vector<double> y(x.begin()+len/2,x.end());
    x.resize(len/2);
    LeastSquare ls(x,y);
    ls.print();
    
    cout<<"Input x=:\n";
    double x0;
    while(cin>>x0)
        {
            cout<<"y = "<<ls.getY(x0)<<endl;
            cout<<"Input x:\n";
        }
    return 0;
}




发布了128 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Bluenapa/article/details/102406245