原创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)
}