gpt4 book ai didi

python - 编写错误函数以在 python 中提供 scipy.optimize.least_squares

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:30 48 4
gpt4 key购买 nike

我正在尝试将一些数据拟合到非线性函数中,并想尝试使用模型函数,看看是否可以获得比现有函数更好的拟合。当我试图弄清楚事情的时候,我想出了更多的问题。我有:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import least_squares
from scipy.optimize import curve_fit

temperature = [ 38., 40., 42., 44., 46., 48., 50., 52., 54., 56., 58., 60., 62., 64., 66., 68., 70., 71.9, 73.81, 75.69, 77.6, 79.49, 81.38, 83.29, 85.19, 87.11, 89., 90., 91., 92., 93., 94., 95., 96., 97., 98., 99., 100. ]
exp_rate = [ 8.71171203e-01, 1.15342914e+00, 1.39178845e+00, 1.66700007e+00, 1.96267002e+00, 2.32390602e+00, 2.68542886e+00, 3.13116448e+00, 3.60152705e+00, 4.12575295e+00, 4.67617489e+00, 5.29745193e+00, 6.06796117e+00, 6.99056274e+00, 8.40124338e+00, 1.04449551e+01, 1.38236107e+01, 1.96811651e+01, 2.91545190e+01, 4.67945718e+01, 7.36377025e+01, 1.19474313e+02, 1.91938580e+02, 3.07692308e+02, 4.92610837e+02, 7.87401575e+02, 1.20738388e+03, 1.51773627e+03, 1.89049140e+03, 2.33880380e+03, 2.90892166e+03, 3.53003887e+03, 4.28065700e+03, 5.15251443e+03, 6.18043152e+03, 7.49720729e+03, 9.57524225e+03, 1.17175325e+04]

def Orbach_Raman(temperature, pre_1, U_1, C, n): # This is my model function
return np.array( (1./pre_1)*np.exp(-U_1/(temperature)) + C*(temperature**n) )

pre_1, U_1, C, n = np.array([1.17E-12, 1815, 1E-6, 3.77]) # Define the starting guess
guess = pre_1, U_1, C, n
popt_stret, pcov = curve_fit(Orbach_Raman, temperature, exp_rate, p0=guess)

但是 curve_fit() 找不到最佳参数并且它提高了

File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 680, in curve_fit
raise RuntimeError("Optimal parameters not found: " + errmsg)
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1000.

这很奇怪,因为开始的猜测已经提供了非常好的数据拟合

plt.loglog(temperature, exp_rate, '-o')
plt.loglog(temperature, Orbach_Raman(temperature, pre_1, U_1, C, n ), '-*')
plt.show()

enter image description here

然后我尝试编写自己的误差函数以使用 least_square() 而不是 curve_fit(),为此我将其添加到之前的代码中

def error(guess, rate):
pre_1, U_1, C, n = guess
return Orbach_Raman(temperature, pre_1, U_1, C, n) - rate

least_squares(error(guess, exp_rate), guess, args=(exp_rate))

出现以下错误

File "fit_experiment.py", line 46, in <module>
least_squares(error(guess, exp_rate), guess, args=(exp_rate))
File "/usr/lib/python2.7/dist-packages/scipy/optimize/_lsq/least_squares.py", line 769, in least_squares
f0 = fun_wrapped(x0)
File "/usr/lib/python2.7/dist-packages/scipy/optimize/_lsq/least_squares.py", line 764, in fun_wrapped
return np.atleast_1d(fun(x, *args, **kwargs))
TypeError: 'numpy.ndarray' object is not callable

有没有人知道

  • 为什么 curve_fit() 会失败,即使猜测参数已经给出了非常好的数据近似值?
  • 为什么调用 least_squares(error(guess, exp_rate), guess, args=(exp_rate)) 时会出现该错误?
  • 为什么如果我改为调用 least_squares(error, guess, args=(exp_rate)) ,它会引发TypeError: error() 恰好接受 2 个参数(给定 39 个)

最佳答案

我认为答案是:

  1. 为什么 curve_fit() 会失败,即使猜测参数已经给出了非常好的数据近似值?

我不确定。与其说是“多次迭代后放弃”不如说是“失败”。你看过结果了吗?

我还建议,由于您的情节实际上(并且明智地)采用对数刻度,因此您也可以适合对数刻度。也就是说,让您的模型函数返回模型的日志,并拟合 log(exp_rate)

  1. 为什么调用 least_squares(error(guess, exp_rate), guess, args=(exp_rate)) 时会出现该错误?

这是因为 least_squares() 希望第一个参数是返回残差的函数不是计算出的残差。因此,使用 least_squares(error, guess...) 而不是 least_squares(error(guess, exp_rate), guess, ...)

  1. 为什么如果我改为调用 least_squares(error, guess, args=(exp_rate)),它会引发 TypeError:error() takes exactly 2 arguments (39 given)

这是因为在 Python 中“包含 1 个元素的元组”的说法很容易被愚弄。 args=(exp_rate) 被解释为一个包含 exp_rate 组件的元组(可能有 39 个数据点),而不是“一个包含一个元素的元组,第一个元素是 exp_rate。你想要的是添加一个尾随逗号(这是真正定义元组的内容,而不是括号): args=(exp_rate, )

希望对您有所帮助。

关于python - 编写错误函数以在 python 中提供 scipy.optimize.least_squares,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50238052/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com