【发布时间】:2017-10-13 03:13:04
【问题描述】:
python 相对较新,主要用于绘图。我目前正在尝试使用 4 参数逻辑 (4PL) 方程和来自 scipy 的曲线拟合来确定最佳拟合线。有一两个网站展示了 4PL 的工作原理,但无法让它们为我的数据工作。示例,但类似的 4PL 数据如下:
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
给出警告(也是测试数据中的指数警告,但不是真实的):
OptimizeWarning: Covariance of the parameters could not be estimated
category=OptimizeWarning)
参数返回我最初的猜测。我尝试了各种初步猜测。
在绘图时绘制了最佳拟合线,但它不是曲线并且不低于 x = 0(我找不到底片会与 4PL 模型混淆的原因)。 4PL fit plotted
我不确定我是否对方程做错了,或者曲线拟合函数如何工作,或两者兼而有之。我有一个使用最小二乘法而不是曲线拟合的类似问题。我已经尝试了一系列基于适合等式的类似方程的变化,但已经卡住了一段时间,任何帮助我指向正确方向的帮助将不胜感激。
【问题讨论】:
-
您好,欢迎您!请提供minimal, complete, and verifyable example(即带有玩具数据的完整代码)以增加获得有用答案的机会。人们只想简单地复制和粘贴您的代码以重现错误并摆弄可能的解决方案。也看看here。我昨天发布的这个答案可能会给你一些想法,尽管逻辑函数应该很适合
curve_fit。 -
我从图中看到,对于图中的每个 X 值,您都有多个数据点。它可能会简化您对这些值进行平均的初始工作,从而在您开始时为您提供一个较小的数据集。一旦您使用较小的数据集获得了良好的工作解决方案,然后切换回使用较大的完整数据集。这可能是一种快速简便且易于执行的测试。
-
感谢您的建议,编辑后有一个简单、可复制的示例。还玩弄了示例数据,似乎卡在了同一个地方。和以前一样。
标签: python scipy curve-fitting