您的位置:首页 > 编程语言 > C语言/C++

最小二乘法及其c++实现

2014-05-06 19:18 162 查看
设经验方程是y=F(x),方程中含有一些待定系数an,给出真实值{(xi,yi)|i=1,2,...n},将这些x,y值代入方程然后作差,可以描述误差:yi-F(xi),为了考虑整体的误差,可以取平方和,之所以要平方是考虑到误差可正可负直接相加可以相互抵消,所以记误差为:
e=∑(yi-F(xi))2
 
如果经验方程是线性的,形如y=ax+b,就是线性回归。按上面的分析,误差函数为:
  e=∑(yi-axi-b)2
各偏导为:
de/da=2∑((yi-axi-b)(-xi)=0
de/db=-2∑(yi-axi-b)=0
于是得到关于a,b的线性方程组:
(∑xi2)a+(∑xi)b=∑yixi
      (∑xi)a+nb=∑yi
设A=∑xi2,B=∑xi,C=∑yixi,D=∑yi,则方程化为:
Aa+Bb=C
Ba+nb=D
解出a,b得:
a=(Cn-BD)/(An-BB)b=(AD-CB)/(An-BB) 
这就是我们要进行的算法。
void Min2Method(float &b_interrupt,float &k_slope,int X[],int Y[],int nCount)
{
//b_interrupt截距,k_slope斜率,nCount点数
int i;
float SumX, SumY, SumXY, SumX2;
SumX=0;
SumX2=0;
for(i=0;i<nCount;i++)
{
SumX+=X[i];
SumX2+=(X[i]*X[i]);
}
SumY=0;
for(i=0;i<nCount;i++)
{
SumY+=Y[i];
}
SumXY=0;
for(i=0;i<nCount;i++)
{
SumXY+=(X[i]*Y[i]);
}
b_interrupt=((SumX2*SumY-SumX*SumXY)/(nCount*SumX2-SumX*SumX));
k_slope=((nCount*SumXY-SumX*SumY)/(nCount*SumX2-SumX*SumX));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息