IOS最小二乘法源码

原创Blog,转载请注明出处

http://blog.csdn.net/hello_hwc

关于

ax + b = y

得到一组模拟数据XY:(x1,y1)(x2,y2)...(x3,y3),求线性拟合后的最优a,b。

用最小二乘法求最优解的代码如下:

备注:这段代码没有处理垂直于X轴的情况,即X相等,使用的时候要特殊处理下X相等

Objective C代码
-(CGPoint) leastSquareMethod:(NSArray *)pointArray
{
    double SumX = 0;
    double SumY = 0;
    double SumXY = 0;
    double SumX2 = 0;
    NSInteger arrayCount = pointArray.count;
    for(int index = 0;index < arrayCount;index++)
    {
        NSValue * value = pointArray[index];
        CGPoint onePoint = value.CGPointValue;
        SumX += onePoint.x;
        SumX2 += onePoint.x * onePoint.x;
        SumY += onePoint.y;
        SumXY += onePoint.x * onePoint.y;
     }
        double b = (SumX2 * SumY - SumX*SumXY)/(arrayCount*SumX2 - SumX*SumX);
        double a = (arrayCount*SumXY - SumX*SumY)/(arrayCount*SumX2 - SumX*SumX);
        return CGPointMake(a,b);
}
Swift代码
func leastSquare(pointArray:[CGPoint])->(Double,Double){
    var SumX = 0.0
    var SumY = 0.0
    var SumXY = 0.0
    var SumX2 = 0.0
    for onePoint in pointArray{
        SumX = SumX + Double(onePoint.x)
        SumX2 = SumX2 + Double(onePoint.x * onePoint.x)
        SumY = SumY + Double(onePoint.y)
        SumXY = SumXY + Double(onePoint.x * onePoint.y)
    }
        var arrayCount = Double(pointArray.count)
        var b = (SumX2 * SumY - SumX*SumXY)/(arrayCount*SumX2 - SumX*SumX)
        var a = (arrayCount*SumXY - SumX*SumY)/(arrayCount*SumX2 - SumX*SumX)
        return (a,b) 
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值