最小二乘法的实现

在这里讨论一元线性回归模型;
简单分析这个问题:
一组数据(x1,y1)、(x2,y2)、(x3,y3)、(x4,y4) … …
在平面上寻找一条直线,使样本回归函数尽可能好地拟合这组值,使总的拟合误差(即总残差)达到最小。为了计算和求导的方便,我们在这里放弃用点到拟合直线的距离和以及绝对值和的方法。采用”残差”的平方和。这里的“残差”指的是g(xi)和yi的距离。其中g(x)是拟合函数。
具体推导过程见下图:

这里写图片描述
这里写图片描述
则可以解出参数A,B的数值;

下面是具体的代码实现过程:

#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];
        }
        int n = x.size();
        a = (t3*n - t2*t4) / (t1*n - t2*t2);
        b = (t1*t4 - t2*t3) / (t1*n - 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;
    x = {1,2,3,4,5};
    int sz = x.size();
    vector<double> y = {1.9,3.8,5.8,7.8,10};
    LeastSquare ls(x, y);
    ls.print();
    cout << "Input x:\n";
    double x0;
    while (cin >> x0)
    {
        cout << "y = " << ls.getY(x0) << endl;
    }
    system("pause");
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值