scipy最小二乘法中的正交回归拟合

时间:2012-02-21 11:36:02

标签: python scipy regression least-squares

scipy lib中的leastsq方法适合某些数据的曲线。并且此方法意味着在此数据中Y值取决于某些X参数。并计算曲线与Y轴(dy)中数据点之间的最小距离

但是如果我需要计算两个轴的最小距离(dy和dx)

有没有办法实现这个计算?

以下是使用一个轴计算时的代码示例:

import numpy as np
from scipy.optimize import leastsq

xData = [some data...]
yData = [some data...]

def mFunc(p, x, y):
    return y - (p[0]*x**p[1])  # is takes into account only y axis

plsq, pcov = leastsq(mFunc, [1,1], args=(xData,yData))
print plsq

我最近尝试过scipy.odr库,它只返回线性函数的正确结果。对于y = a * x ^ b等其他函数,它返回错误的结果。这就是我使用它的方式:

def f(p, x):      
    return p[0]*x**p[1]

myModel = Model(f)
myData = Data(xData, yData)
myOdr = ODR(myData, myModel , beta0=[1,1])
myOdr.set_job(fit_type=0) #if set fit_type=2, returns the same as leastsq
out = myOdr.run()
out.pprint()

这会返回错误的结果,不需要,并且在某些输入数据中甚至不接近真实。 可能是,有一些特殊的使用方法,我做错了什么?

3 个答案:

答案 0 :(得分:7)

scipy.odr实现了正交距离回归。请参阅docstring中的基本使用说明:

https://github.com/scipy/scipy/blob/master/scipy/odr/odrpack.py#L27

答案 1 :(得分:6)

我找到了解决方案。 Scipy Odrpack正常工作,但需要对正确结果进行初步猜测。所以我将这个过程分为两个步骤。

第一步:使用纵坐标最小二乘法找到初始猜测。

第二步:将ODR中的这些初始猜测替换为beta0参数。

它以可接受的速度运行良好。

谢谢你们,你的建议指导我找到正确的解决方案

答案 2 :(得分:0)

如果/当你能够反转p描述的函数时,你可能只在mFunc中包含x-pinverted(y),我猜为sqrt(a ^ 2 + b ^ 2),所以(伪代码)

return sqrt( (y - (p[0]*x**p[1]))^2 + (x - (pinverted(y))^2)

例如

y=kx+m   p=[m,k]    
pinv=[-m/k,1/k]

return sqrt( (y - (p[0]+x*p[1]))^2 + (x - (pinv[0]+y*pinv[1]))^2)

但你要求的是在某些情况下有问题。例如,如果多项式(或x ^ j)曲线在y(m)处具有最小ym并且您具有低于ym的点x,y,那么您想要返回什么样的值?并不总是有解决方案。