#一元线性回归模型如下。
整体回归函数中y和x的关系是线性的,也是非线性的。 线性回归模型的“线性”有两种解释。
)1)变量是线性的,y的条件平均是x的线性函数
)2)参数是线性的,y的条件平均是参数的线性函数
线性回归模型主要是指相对于参数呈“线性”。 因为如果相对于参数是线性的,则可以用同样的方法估计参数。
#参数估计——最小二乘法假设针对一元线性回归模型,从总体获得了n组观察值(X1,Y1 )、(X2,Y2 )、(Xn,Yn )。 可以用无数条曲线拟合平面上的这n个点。 要求样本回归函数尽可能好地拟合该值。 总的来看,这条直线位于样本数据中心是最合理的。 用于选择最佳拟合曲线的准则可以确定为总拟合误差最小,也就是说,总残差最小。 可以从以下三个标准中选择。
)1)用“残差和最小”确定直线位置是一种方法。 但是,很快就发现“残差和”的计算存在相互抵消的问题。
)2)用“残差的绝对值和最小”来确定直线的位置也是一种方法。 但是,绝对值的计算很麻烦。
(3)最小二乘法的原则是用“残差平方和最小”确定直线位置。 最小二乘法除了容易计算外,得到的推算量也具有优良的特性。 该方法对异常值非常敏感。
最常用的是普通的最小二乘法(Ordinary Least Square,OLS )。 选择的回归模型应确保所有观察值的残差平方和最小。 (q为残差平方和) )。
样本回归模型:
残差平方和:
把这条直线用q确定为最小,即确定,当成变量,把它们看作q的函数,就变成了求极值的问题,可以通过求导数得到。 求出对q2个评价对象参数的偏导数:
解得:
###最小二乘法c实现# include iostream # include fstream # includevectorusingnamespacestd;
class LeastSquare{
双精度a,b;
公共:
leastsquare(constvectordoublex,const vectordouble y ) )。
{
double t1=0,t2=0,t3=0,t4=0;
for(intI=0; ix.size (; I )
{
t1 =x[i]x[i];
t2 =x[i];
t3 =x[i]y[i];
t4 =y[i];
}
a=(T3X.size(-T2T4)/)/(t1x.size )- t2t2);
//b=(T4-at2 )/x.size );
b=(T1T4-T2T3 )/)/(t1x.size )- t2*t2 );
}
双精度(const双精度) const{return a*x b; }void print () const (cout lt ); lt; ' y='lt; lt; alt; lt; ' x 'lt; lt; blt; lt; 'n '; };
intmain(intargc,char *argv[] ) ) ) ) ) ) ) ) ) int main ) ) ) int main ) ) ) int argc,char *argv[] ) ) ) ) ) ) ) int
{
if(argc!=2)
{
cout“usage : datafile.txt”endl;
返回- 1;
}
else
{
vectordouble x;
ifstreamin(argv[1];
for (双精度; ind; )
x.push_back(d );
int sz=x.size (;
vectordoubley(x.Begin )、sz/2和x.end );
x.resize(SZ/2;
lastsquarels(x,y );
ls.print (;
插座; lt; “Input x:n”; double x0; wile(cingt; gt; x0 ) {coutlt; lt; ' y='lt; lt; ls.Gety(x0 ) lt; lt; endl; 插座; lt; “Input x:n”; } }