线性回归之最小二乘法简要解析

线性回归之最⼩⼆乘法简要解析
最⼩⼆乘法(⼜称最⼩平⽅法)是⼀种技术。它通过的平⽅和寻数据的最佳匹配。利⽤最⼩⼆乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平⽅和为最⼩。最⼩⼆乘法还可⽤于。其他⼀些优化问题也可通过最⼩化或最⼤化⽤最⼩⼆乘法来表达。
最⼩⼆乘法也是⼀种优化⽅法,求得⽬标函数的最优值。并且也可以⽤于曲线拟合,来解决回归问题。难怪《统计学习⽅法》中提到,回归学习最常⽤的损失函数是平⽅损失函数,在此情况下,回归问题可以著名的最⼩⼆乘法来解决。看来最⼩⼆乘法果然是机器学习领域做有名和有效的算法之⼀。
最⼩⼆乘法
我们以最简单的⼀元线性模型来解释最⼩⼆乘法。什么是⼀元线性模型呢?监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,⽀持向量机等),如果预测的变量
是连续的,我们称其为回归。回归分析中,如果只包括⼀个⾃变量和⼀个因变量,且⼆者的关系可⽤⼀条直线近似表⽰,这种回归分析称为⼀元线性回归分析。如果回归分析中包括两个或两个以上的⾃变量,且因变量和⾃变量之间是线性关系,则称为多元线性回归分析。对于⼆维空间线性是⼀条直线;对于三维空间线性是⼀个平⾯,对于多维空间线性是⼀个超平⾯...
对于⼀元线性回归模型,假设从总体中获取了n组观察值(X1,Y1),(X2,Y2),…,(Xn,Yn)。对于平⾯中的这n个点,可以使⽤⽆数条曲线来拟合。要求样本回归函数尽可能好地拟合这组值。综合起来看,这条直线处于样本数据的中⼼位置最合理。选择最佳拟合曲线的标准可以确定为:使总的拟合误差(即总残差)达到最⼩。有以下三个标准可以选择:(1)⽤“残差和最⼩”确定直线位置是⼀个途径。但很快发现计算“残差和”存在相互抵消的问题。
(2)⽤“残差绝对值和最⼩”确定直线位置也是⼀个途径。但绝对值的计算⽐较⿇烦.
(3)最⼩⼆乘法的原则是以“残差平⽅和最⼩”确定直线位置。⽤最⼩⼆乘法除了计算⽐较⽅便外,得到的估计量还具有优良特性。这种⽅法对异常值⾮常敏感。
最常⽤的是普通最⼩⼆乘法(Ordinary Least Square,OLS):所选择的回归模型应该使所有观察值的残差平⽅和达到最⼩。(Q为残差平⽅和)-即采⽤平⽅损失函数。
样本回归模型:
其中e i为样本(X i, Y i)的误差
平⽅损失函数:
磨砂玻璃
则通过Q最⼩确定这条直线,即确定,以为变量,把它们看作是Q的函数,就变成了⼀个求极值的问题,可以通过求导数得到。求Q对两个待估参数的偏导数:
给刘翔的一封信
根据数学知识我们知道,函数的极值点为偏导为0的点。
解得:
这就是最⼩⼆乘法的解法,就是求得平⽅损失函数的极值点。
/*
最⼩⼆乘法C++实现
参数1为输⼊⽂件
输⼊: x
输出:预测的y
*/
#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)
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);  // 求得β1
b = (t1*t4 - t2*t3) / (t1*x.size() - t2*t2);        // 求得β2    }
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[])
{
if(argc != 2)
{
cout<<"Usage: "<<endl;
return -1;
}
else
{
vector<double> x;
ifstream in(argv[1]);
for(double d; in>>d; )t10a
x.push_back(d);
int sz = x.size();
vector<double> y(x.begin()+sz/2, x.end());
LeastSquare ls(x, y);
ls.print();
cout<<"Input x:\n";
double x0;
while(cin>>x0)
性反转{
cout<<"y = "<&Y(x0)<<endl;
cout<<"Input x:\n";
}
}
}

本文发布于:2024-09-23 11:14:33,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/403290.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:回归   线性   函数   乘法   数据   模型   分析
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议