【问题标题】:Orthogonal regression fitting in scipy least squares methodscipy最小二乘法中的正交回归拟合
【发布时间】:2012-03-11 17:22:06
【问题描述】:

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()

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

【问题讨论】:

  • Scipy 确实有一个用于“正交距离回归”的模块——这是你需要的吗? docs.scipy.org/doc/scipy/reference/odr.html
  • 是的,它似乎解决了这个问题,但是当我尝试它时,它返回的结果与 leastsq 方法相同。我遵循了文档中给出的示例,但它没有按需要工作。你有一些有效的例子吗?
  • 当我尝试它时,我发现结果相似,但并不完全相同 - 我认为这只是意味着额外的计算对拟合没有太大影响。
  • 我明白了!我找到了解决方案。问题在于 odr 求解器的初始猜测不合适(beta0 参数)。

标签: python scipy regression least-squares


【解决方案1】:

scipy.odr 实现正交距离回归。基本使用说明见docstringdocumentation

【讨论】:

  • 哦,是的,我试过了,它的工作方式与 leastsq 相同,返回相同的结果
  • 完全相同的结果?我觉得不太可能。您能否更新您的帖子以显示带有 scipy.odr 的可运行示例,该示例会给出错误的结果?
【解决方案2】:

我找到了解决方案。 Scipy Odrpack 正常工作,但需要一个良好的初始猜测才能获得正确的结果。所以我把这个过程分成了两个步骤。

第一步:使用普通最小二乘法找到初始猜测。

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

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

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

【讨论】:

  • 我知道这是一篇旧帖子,但您能否在此处发布您的代码 sn-p。我正在尝试进行隐式 ODR,但我不确定如何在 scipy 中进行设置。
  • @Barbarossa 你可能会喜欢this code snippet
  • 这不是一个真正的答案。您也应该/可以共享代码。
【解决方案3】:

如果/当您能够反转 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,并且您的点 x,y 低于 ym,您希望返回什么样的值?并不总是有解决方案。

【讨论】:

  • 如果点 x,y 低于 ym,那么它应该返回到该 ym 的最小距离。 sqrt((m-x)^2 + (ym-y)^2)/2。为什么这是个问题?
  • 如果你有一个函数 y=f(x) 这意味着对于任何 x 都有一个 y 的值。对于任何输入 y,并不总是有 x 值。并非所有函数都是可逆的。例如 y=x^2 和 x=-2 的任何点
  • 哦,我现在明白了,是的,你是对的。但是一些软件如何构建这个完全最小二乘(戴明回归)拟合任何输入数据上的任何函数。在python中一定有办法做到这一点
  • 我认为戴明回归是线性的,所以反演并不复杂。所以,它类似于我给出的线性示例。你的曲线不是线性的,也不是可逆的。
猜你喜欢
  • 1970-01-01
  • 2019-03-29
  • 2017-04-04
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2016-02-08
  • 2019-09-06
  • 1970-01-01
相关资源
最近更新 更多