14

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

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

4

3 回答 3

8

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

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

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

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

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

于 2012-02-24T05:37:16.367 回答
8

scipy.odr实现正交距离回归。请参阅文档字符串文档中的基本使用说明。

于 2012-02-21T17:06:29.637 回答
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,并且您的点 x,y 低于 ym,您想要返回什么样的值?并不总是有解决方案。

于 2012-02-21T12:00:09.533 回答