在这里讨论一元线性回归模型;
简单分析这个问题:
一组数据(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");
}