最小二乘法拟合直线

问题描述:

已知变量(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 i  
y ¯ =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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值