问题描述:
已知变量(x,y)的一组观测数据,求一条直线能很好的拟合那些观测数据。
解决方法:
建立一元线性回归模型
Y=β 0 x+β 1 +ϵEϵ=0,Dϵ=DY
要使得一条直线能很好的拟合观测点数据,这要求该直线与数据点的偏差最小,该偏差可以用残差平方和来表示:
Q(β 0 ,β 1 )=∑ i=1 n (y i −β 0 −β 1 x i ) 2
为求 Q 的最小值,对
β 0 和 β 1 分别求偏导并令其等于 0 ,得出:
∂Q∂β 0 =−2∑ i=1 n (y i −β 0 −β 1 x i ) 2 ∂Q∂β 1 =−2∑ i=1 n (y i −β 0 −β1x i )x i
可得到如下等式:
β 0 n+β 1 ∑ i=1 n x i =∑ i=1 n x iβ 0 ∑ i=1 n +β 1 ∑ i=1 n x 2 i =∑ i=1 n x i y i
令:
x ¯ =1n ∑ i=1 n x iy ¯ =1n ∑ i=1 n y i
推出:
β 1 =∑ n i=1 x i y i −nx ¯ y ¯ ∑ n i=1 x 2 i −n(x ¯ ) 2β 0 =y ¯ −β 1 x ¯
可得到拟合的直线方程:
y=β 0 +β 1 x
代码如下:
void LineLeastSquareMethod(float* pPoint,int pointNum,float &k,float &b)
{
if (NULL==pPoint || 0==pointNum)
{
return;
}
int i;
float xMulYSum=0;//x*y的和
float xSquarSum=0;//x平方和
float xAvg=0;//x均值
float yAvg=0;//y均值
float x,y;
for (i=0;i<pointNum;i++)
{
x=pPoint[i*2];
y=pPoint[i*2+1];
xAvg+=x;
yAvg+=y;
xMulYSum+=(x*y);
xSquarSum+=(x*x);
}
xAvg/=pointNum;
yAvg/=pointNum;
k=(xMulYSum-pointNum*xAvg*yAvg)/(xSquarSum-pointNum*xAvg*xAvg);
b=yAvg-k*xAvg;
}