【发布时间】: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