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

Vla*_*mir 13 python regression scipy 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
Run Code Online (Sandbox Code Playgroud)

我最近尝试了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()
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ern 7

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

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

  • 结果完全相同?我发现这不太可能.你能更新你的帖子,用`scipy.odr`显示一个可运行的例子,给你错误的结果吗? (4认同)

Vla*_*mir 7

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

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

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

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

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

  • 我知道这是一篇旧帖子,但您能否在此处发布您的代码片段。我正在尝试进行隐式 ODR,但我不确定如何在 scipy 中进行设置。 (3认同)
  • 这并不是一个真正的答案。您也应该/可以共享代码。 (2认同)