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

发布于 2025-01-07 19:01:27 字数 882 浏览 1 评论 0原文

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

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

The leastsq method in scipy lib fits a curve to some data. And this method implies that in this data Y values depends on some X argument. And calculates the minimal distance between curve and the data point in the Y axis (dy)

But what if I need to calculate minimal distance in both axes (dy and dx)

Is there some ways to implement this calculation?

Here is a sample of code when using one axis calculation:

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

I recently tryed scipy.odr library and it returns the proper results only for linear function. For other functions like y=a*x^b it returns wrong results. This is how I use it:

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

This returns wrong results, not desired, and in some input data not even close to real.
May be, there is some special ways of using it, what do I do wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

梦里寻她 2025-01-14 19:01:29

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

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

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

而且它工作得很好,速度也可以接受。

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

I've found the solution. Scipy Odrpack works noramally but it needs a good initial guess for correct results. So I divided the process into two steps.

First step: find the initial guess by using ordinaty least squares method.

Second step: substitude these initial guess in ODR as beta0 parameter.

And it works very well with an acceptable speed.

Thank you guys, your advice directed me to the right solution

罪歌 2025-01-14 19:01:29

scipy.odr 实现正交距离回归。请参阅 docstring文档

scipy.odr implements the Orthogonal Distance Regression. See the instructions for basic use in the docstring and documentation.

誰認得朕 2025-01-14 19:01:29

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

If/when you are able to invert the function described by p you may just include x-pinverted(y) in mFunc, I guess as sqrt(a^2+b^2), so (pseudo code)

return sqrt( (y - (p[0]*x**p[1]))^2 + (x - (pinverted(y))^2)

for example for

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)

But what you ask for is in some cases problematic. For example, if a polynomial (or your x^j) curve has a minimum ym at y(m) and you have a point x,y lower than ym, what kind of value do you want to return? There's not always a solution.

じее 2025-01-14 19:01:29

您可以在 R 中使用 ONLS 包。

you can use the ONLS package in R.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文