首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最小二乘函数和4参数物流函数不工作

最小二乘函数和4参数物流函数不工作
EN

Stack Overflow用户
提问于 2017-10-10 19:52:04
回答 1查看 3.2K关注 0票数 0

python相对较新,主要用于绘图。我目前正试图确定一条最佳拟合线使用4参数logistic (4PL)方程和曲线拟合从枕木。有一两个站点显示了4PL是如何工作的,但无法让它们为我的数据工作。示例,但类似的4PL数据如下:

代码语言:javascript
运行
复制
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import scipy.optimize as optimization

xdata = [2.3, 2.3, 2, 2, 1.7, 1.7, 1, 1, 0.000001, 0.000001, -1, -1]
ydata = [0.32, 0.3, 0.55, 0.60, 0.88, 0.92, 1.27, 1.21, 1.15, 1.12, 1.1, 1.1]
def fourPL(x, A, B, C, D):
    return ((A-D)/(1.0+((x/C)**(B))) + D)
guess = [0, -0.5, 0.5, 1]
params, params_covariance = optimization.curve_fit(fourPL, xdata, ydata, 
guess)
params

提供警告(也是测试数据中的指数警告,但不是真实的):

代码语言:javascript
运行
复制
OptimizeWarning: Covariance of the parameters could not be estimated
category=OptimizeWarning)

而params则返回了我最初的猜测。我试过各种最初的猜测。

最好的拟合线是在绘图时绘制的,但不是曲线,不低于x=0(我找不到底片会扰乱4PL模型的原因)。4PL拟合图

我不知道我是不是对方程做错了什么,或者曲线拟合函数是如何工作的,或者两者都是。我有一个类似的问题,使用最小二乘而不是曲线拟合。我已经尝试了一系列的变化,基于类似的方程式拟合等,但已经被困了一段时间,任何帮助我指出正确的方向将是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-12 19:06:11

我很惊讶你没有收到任何警告或者没有和我们分享它们。我不能用科学的方法来分析这个任务,只是一些关于技术方面的评论:

观察

在运行您的代码时,您应该发出如下警告:

代码语言:javascript
运行
复制
RuntimeWarning: invalid value encountered in power
  return ((A-D)/(1.0+((x/C)**(B))) + D)

不要忽视这个!

调试

向函数fourPL添加一些打印,可能是函数的所有不同组件,然后查看发生了什么。

示例:

代码语言:javascript
运行
复制
def fourPL(x, A, B, C, D):
    print('1: ', (A-D))
    print('2: ', (x/C))
    print('3: ', (1.0+((x/C)**(B))))

    return ((A-D)/(1.0+((x/C)**(B))) + D)

...
params, params_covariance = optimization.curve_fit(fourPL, xdata, ydata, guess, maxfev=1)
# maxfev=1 -> let's just check 1 or few it's

输出:

代码语言:javascript
运行
复制
1:  -1.0
2:  [  4.60000000e+00   4.60000000e+00   4.00000000e+00   4.00000000e+00
   3.40000000e+00   3.40000000e+00   2.00000000e+00   2.00000000e+00
   2.00000000e-06   2.00000000e-06  -2.00000000e+00  -2.00000000e+00]
RuntimeWarning: invalid value encountered in power
  print('3: ', (1.0+((x/C)**(B))))
3:  [   1.4662524     1.4662524     1.5           1.5           1.54232614
    1.54232614    1.70710678    1.70710678  708.10678119  708.10678119
           nan           nan]

那就够停了。nans和infs是坏的!

理论

现在是理论的时候了,我不会那么做的。但是通常你现在应该考虑一下基本的理论,以及为什么会出现这些问题。

,你对这些假设有什么遗漏吗?

修理(不检查理论)

不检查理论,只是看看在30秒内发现的一些示例:嗯,负x值是个问题吗?

让我们移动x(最小值;硬编码1在这里):

代码语言:javascript
运行
复制
xdata = np.array([2.3, 2.3, 2, 2, 1.7, 1.7, 1, 1, 0.000001, 0.000001, -1, -1]) + 1

完整代码:

代码语言:javascript
运行
复制
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import scipy.optimize as optimization

xdata = np.array([2.3, 2.3, 2, 2, 1.7, 1.7, 1, 1, 0.000001, 0.000001, -1, -1]) + 1
ydata = np.array([0.32, 0.3, 0.55, 0.60, 0.88, 0.92, 1.27, 1.21, 1.15, 1.12, 1.1, 1.1])

def fourPL(x, A, B, C, D):
    return ((A-D)/(1.0+((x/C)**(B))) + D)

guess = [0, -0.5, 0.5, 1]
params, params_covariance = optimization.curve_fit(fourPL, xdata, ydata, guess)#, maxfev=1)

x_min, x_max = np.amin(xdata), np.amax(xdata)
xs = np.linspace(x_min, x_max, 1000)
plt.scatter(xdata, ydata)
plt.plot(xs, fourPL(xs, *params))
plt.show()

输出:

代码语言:javascript
运行
复制
RuntimeWarning: divide by zero encountered in power
  return ((A-D)/(1.0+((x/C)**(B))) + D)

看起来不错,但现在是的另一个理论课的时候了:我们的线性移位对我们的结果做了什么?我又忽略了这件事。

所以只有一个警告和一个漂亮的输出。

如果要删除最后一个警告,请在xdata中添加一些小的epsilon,使其没有0:

代码语言:javascript
运行
复制
xdata = np.array([2.3, 2.3, 2, 2, 1.7, 1.7, 1, 1, 0.000001, 0.000001, -1, -1]) + 1 + 1e-10

在没有任何警告的情况下实现同样的目标。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46674870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档