2012-02-21 48 views
12

scipy lib中的leastsq方法适合某些数据的曲线。而这种方法意味着在这个数据中Y值取决于一些X参数。并计算曲线与Y轴(DY)的数据点scipy最小二乘法中的正交回归拟合

但是,如果我需要计算两个轴的最小距离(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 

我最近tryed 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() 

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

+1

SciPy的确实有“正交距离回归”模块 - 是你需要什么? http://docs.scipy.org/doc/scipy/reference/odr.html – 2012-02-21 12:35:25

+0

是的,它似乎解决了这个问题,但是当我尝试它时,它返回的结果与leastsq方法相同。我遵循了文档中给出的例子,并且它并不按需要工作。你有一些工作的例子吗? – Vladimir 2012-02-22 04:41:13

+0

当我尝试它时,我发现结果是相似的,但并不完全相同 - 我认为这只是意味着额外的计算对适合度没有太大影响。 – 2012-02-22 12:33:15

回答

5

我已经找到了解决办法。 Scipy Odrpack正常运作,但它需要一个良好的初步猜测,以获得正确的结果。所以我把这个过程分成了两个步骤。

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

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

它的工作得很好,速度可以接受。

谢谢你们,你们的意见指引我正确的解决方案

+1

我知道这是一个旧的帖子,但你可能会在这里发布你的代码片段。我试图做一个隐式的ODR,但我不知道如何在scipy中设置它。 – Barbarossa 2013-12-06 19:12:11

+1

@Barbarossa你可能会喜欢[this code snippet](http://blog.rtwilson.com/orthogonal-distance-regression-in-python/)。 – gerrit 2016-08-09 20:54:03

+0

@gerrit感谢您的信息。 – Barbarossa 2016-08-09 20:55:42

0

如果/当您能够反转由p描述的函数时,您可能只包括m -Func中的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,那么你想返回什么样的值?并不总是有解决方案。

+0

如果点x,y低于ym,那么它应该返回到ym的最小距离。 ** sqrt((m-x)^ 2 +(ym-y)^ 2)/ 2 **。为什么这是一个问题? – Vladimir 2012-02-21 12:33:10

+0

如果你有一个函数y = f(x),这意味着任何x都有一个y值。 Bot对于任何输入y都没有总是x的值。并非所有功能都是可逆的。 例如y = x^2以及任何有x = -2的点 – 2012-02-21 12:39:18

+0

哦,我现在看到了,是的,你是对的。但是,一些软件如何构建这个总体最小平方(戴明回归)适合任何输入数据的任何函数。 python – Vladimir 2012-02-21 12:47:48

6

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

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

+0

哦,是的,我试了一下,它的工作方式与leastsq相同,返回的结果相同 – Vladimir 2012-02-22 04:03:37

+4

完全相同的结果?我觉得不太可能。你能否更新你的文章来显示一个可运行的例子'scipy.odr',给你错误的结果? – 2012-02-22 11:43:43