目录
导言
监督学习中,预测的变量是离散的,则称分类 otherwise 连续的变量称回归。
回归中只包含一个自变量和因变量,二者为线性关系,则为一元线性模型。
如果自变量大于等于两个,则为多元(线性模型)。
一元线性回归模型
扫描二维码关注公众号,回复:
8529634 查看本文章
总体回归函数中Y与X的关系可是线性的,也可是非线性的。对线性回归模型的“线性”有两种解释:
(1)就变量而言是线性的,Y的条件均值是 X的线性函数
(2)就参数而言是线性的,Y的条件均值是参数的线性函数
线性回归模型主要指就参数而言是“线性”,因为只要对参数而言是线性的,都可以用类似的方法估计其参数。
参数估计(最小二乘法)
平面上n个点,找到一个一元线性函数来拟合它们,使得总的拟合误差(总残差最小),三个标准可以选择:
(1)用“残差和最小”确定直线位置是一个途径。但很快发现计算“残差和”存在相互抵消的问题。
(2)用“残差绝对值和最小”确定直线位置也是一个途径。但绝对值的计算比较麻烦。
(3)最小二乘法的原则是以“残差平方和最小”确定直线位置。用最小二乘法除了计算比较方便外,得到的估计量还具有优良特性。这种方法对异常值非常敏感。
最小二乘法(Least Square)使残差平方和达到最小。
样本regression 模型
即
残差平方和函数Q
为使Q 最小, 需要对Q求导,Q对两个待估参数的偏导数为
解得
最小二乘法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;
}