为什么我得到一条最适合指数衰减曲线的直线
Why am i getting a straight line for exponential decay curve best-fit
大家好,
我试图在 Python 中拟合双指数衰减函数的曲线。我使用的代码如下。我不确定为什么我得到一条适合的直线。我欢迎对我的代码提供任何帮助和建议,这将有很大帮助。
xData = np.array(xData)
yData = np.array(yData)
def double_exp(x, a1, t1, a2, t2):
return a1*np.exp(-x/t1) + a2*np.exp(-(x-0.1) / t2)
mod=Model(double_exp)
result=mod.fit(yData,x=xData,a1=0.7,t1=0.5,a2=0.3,t2=10)
result.plot()
plt.grid()
plt.xlabel('Time')
plt.ylabel('Fluoresence Lifetime')
xData 和 yData 列表的示例数据值为
[![xData is \[2.50783699e-09 5.01567398e-09 7.52351097e-09 1.00313480e-08
1.25391849e-08 1.50470219e-08 1.75548589e-08 2.00626959e-08
2.25705329e-08... etc\]
yData is \[ 1025. 1032. 1101. 1138. 1205. 1086. 1692. 13515. 59434. 82067.64293. 52266. 43993. 35335. 30066. 29989. 33773. 30521. 26468. 26338.27233. 26276. 24109....etc\]][1]][1]
我向所有阅读这篇文章的人道歉,因为我在这里的回答有点超出了 Whosebug 的规范。这更像是一个长评论而不是答案,这与 poster 在过去几个月中提出了许多关于使用 lmfit 库的类似问题有关。
@Angela Mary 你得到的可能是一条直线,因为你的初始值不够接近,无法细化。
使用 lmfit 时,您绝对必须为要优化的所有参数提供切合实际的初始值。在任何情况下都不能忽视这一点。如果您不确定您的初始值是否合理,请在 尝试拟合之前 绘制数据和具有初始参数值的模型。进行拟合时,您是在断言您知道初始值是近似数据的合理值。
一个推论:当你给它不合理的初始值时,它找不到好的解决方案并不是算法或库的错误。这应该是意料之中的。
适配后,请务必打印并阅读适配报告。这包含主要结果。结果拟合图可能很有用——正如他们所说,一张图片胜过一千个单词。但是拟合结果包含拟合结果的table,一个table的数字抵得上一千张图片。让我重复一遍:总是打印出来并实际阅读适合的报告。不要 post 对不包含此报告的 lmfit 结果提出问题。
Whosebug 的重点在于编码。问题应该强调如何使用库,而不是它给出的结果。这意味着您不太可能得到关于为什么模型与特定数据不匹配的非常有意义的答案。提出有关如何做事的问题。
由于论坛是关于编码的,因此请务必提供一个最小的完整示例来说明问题。如果“最小的、完整的例子”这个短语对你来说很陌生,那么考虑一下你的第一个家庭作业。 post 此处编写的代码需要完整且可由其他人运行。需要包括输出报告。如果你得到一个异常 运行 代码,post 完整的回溯。不要编辑结果:post 他们一字不差。这些不是建议或“如果您认为合适”。这些是要求。
如果您正在拟合数据(或对数据进行任何其他计算),则将该数据包含在代码本身或作为现成的数据文件。既然你的例子已经做成一个最小的完整例子了,数据就不需要很大了。
xData = np.array(xData)
yData = np.array(yData)
def double_exp(x, a1, t1, a2, t2):
return a1*np.exp(-x/t1) + a2*np.exp(-(x-0.1) / t2)
mod=Model(double_exp)
result=mod.fit(yData,x=xData,a1=0.7,t1=0.5,a2=0.3,t2=10)
result.plot()
plt.grid()
plt.xlabel('Time')
plt.ylabel('Fluoresence Lifetime')
xData 和 yData 列表的示例数据值为
[![xData is \[2.50783699e-09 5.01567398e-09 7.52351097e-09 1.00313480e-08
1.25391849e-08 1.50470219e-08 1.75548589e-08 2.00626959e-08
2.25705329e-08... etc\]
yData is \[ 1025. 1032. 1101. 1138. 1205. 1086. 1692. 13515. 59434. 82067.64293. 52266. 43993. 35335. 30066. 29989. 33773. 30521. 26468. 26338.27233. 26276. 24109....etc\]][1]][1]
我向所有阅读这篇文章的人道歉,因为我在这里的回答有点超出了 Whosebug 的规范。这更像是一个长评论而不是答案,这与 poster 在过去几个月中提出了许多关于使用 lmfit 库的类似问题有关。
@Angela Mary 你得到的可能是一条直线,因为你的初始值不够接近,无法细化。
使用 lmfit 时,您绝对必须为要优化的所有参数提供切合实际的初始值。在任何情况下都不能忽视这一点。如果您不确定您的初始值是否合理,请在 尝试拟合之前 绘制数据和具有初始参数值的模型。进行拟合时,您是在断言您知道初始值是近似数据的合理值。
一个推论:当你给它不合理的初始值时,它找不到好的解决方案并不是算法或库的错误。这应该是意料之中的。
适配后,请务必打印并阅读适配报告。这包含主要结果。结果拟合图可能很有用——正如他们所说,一张图片胜过一千个单词。但是拟合结果包含拟合结果的table,一个table的数字抵得上一千张图片。让我重复一遍:总是打印出来并实际阅读适合的报告。不要 post 对不包含此报告的 lmfit 结果提出问题。
Whosebug 的重点在于编码。问题应该强调如何使用库,而不是它给出的结果。这意味着您不太可能得到关于为什么模型与特定数据不匹配的非常有意义的答案。提出有关如何做事的问题。
由于论坛是关于编码的,因此请务必提供一个最小的完整示例来说明问题。如果“最小的、完整的例子”这个短语对你来说很陌生,那么考虑一下你的第一个家庭作业。 post 此处编写的代码需要完整且可由其他人运行。需要包括输出报告。如果你得到一个异常 运行 代码,post 完整的回溯。不要编辑结果:post 他们一字不差。这些不是建议或“如果您认为合适”。这些是要求。
如果您正在拟合数据(或对数据进行任何其他计算),则将该数据包含在代码本身或作为现成的数据文件。既然你的例子已经做成一个最小的完整例子了,数据就不需要很大了。