Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中编写错误函数以馈送scipy.optimize.least_squares_Python_Python 2.7_Numpy_Scipy_Curve Fitting - Fatal编程技术网

在python中编写错误函数以馈送scipy.optimize.least_squares

在python中编写错误函数以馈送scipy.optimize.least_squares,python,python-2.7,numpy,scipy,curve-fitting,Python,Python 2.7,Numpy,Scipy,Curve Fitting,我正在尝试将一些数据拟合到一个非线性函数,并想使用模型函数,看看是否可以得到比我已有的更好的拟合。当我试图弄清楚事情的时候,我提出了更多的问题。我有: 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.

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

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

因此,我随后尝试编写自己的错误函数,使用最小二乘法()而不是曲线拟合(),这是我在前面的代码中添加的

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
文件“fit_experience.py”,第46行,在
最小二乘法(误差(猜测,经验率),猜测,参数=(经验率))
文件“/usr/lib/python2.7/dist packages/scipy/optimize/_lsq/least_squares.py”,第769行,最小二乘法
f0=乐趣(x0)
文件“/usr/lib/python2.7/dist packages/scipy/optimize/_lsq/least_squares.py”,第764行,用fun_包装
返回np.至少1d(乐趣(x,*args,**kwargs))
TypeError:“numpy.ndarray”对象不可调用
有人知道吗

  • 为什么curve_fit()即使猜测参数已经非常接近数据,也会失败
  • 为什么调用最小二乘法(error(guess,exp\u rate),guess,args=(exp\u rate))时会出现这种错误
  • 为什么我调用最小二乘法(error,guess,args=(exp\u rate)),它会提高 TypeError:error()正好接受2个参数(给定39个)

    • 我认为答案是:

    • 为什么curve_fit()即使猜测参数已经非常接近数据,也会失败
    • 我不确定。它可能不是“失败”,而是“多次迭代后放弃”。你看过结果了吗

      我还建议,因为你的图实际上(而且合理地)在对数尺度上,你也可以在对数尺度上拟合。也就是说,让model函数返回模型的日志,然后拟合
      log(exp\u rate)

    • 为什么调用最小二乘法(error(guess,exp\u rate),guess,args=(exp\u rate))时会出现这种错误
    • 这是因为
      least_squares()
      希望第一个参数是返回残差的函数,而不是计算残差的。因此,使用
      最小二乘法(误差,猜测…
      而不是
      最小二乘法(误差(猜测,预测率),猜测…)

    • 为什么如果我调用最小二乘法(error,guess,args=(exp_rate)),它会引发TypeError:error()正好接受2个参数(给定39个参数)
    • 这是因为Python中有一种很容易被愚弄的说法,即“tuple with 1 element”。
      args=(exp\u rate)
      被解释为一个包含
      exp\u rate
      组件的元组(可能有39个数据点),而不是“一个包含一个元素的元组,第一个元素是
      exp\u rate
      。您需要添加一个尾随逗号(这是真正定义元组的东西,而不是括号):
      args=(exp\u rate,)


      希望这能有所帮助。

      我想答案是:

    • 为什么curve_fit()即使猜测参数已经非常接近数据,也会失败
    • 我不确定。它可能不是“失败”而是“多次迭代后放弃”。你看过结果了吗

      我还建议,因为您的绘图实际上(而且合理地)在对数刻度上,所以您也可以在对数刻度上拟合。也就是说,让您的模型函数返回模型的日志,然后拟合
      log(exp\u rate)

    • 为什么调用最小二乘法(error(guess,exp\u rate),guess,args=(exp\u rate))时会出现这种错误
    • 这是因为
      least_squares()
      希望第一个参数是返回残差的函数,而不是计算出的残差。因此,使用
      least_squares(error,guess…
      不是
      least_squares(error(guess,exp_rate),guess…)

    • 为什么如果我调用最小二乘法(error,guess,args=(exp_rate)),它会引发TypeError:error()正好接受2个参数(给定39个参数)
    • 这是因为Python中有一种很容易被愚弄的说法,即“tuple with 1 element”。
      args=(exp\u rate)
      被解释为包含
      exp\u rate
      组件的tuple(可能是39个数据点),而不是“包含一个元素的tuple,其中第一个元素是
      exp\u rate
      。您需要添加一个尾随逗号(真正定义元组的是逗号,而不是括号):
      args=(exp\u rate,)


      希望这能有所帮助。

      这些问题很多,而且还有很多非常基本的python内容。在进入scipy(包括与数学相关的调试)之前,请确保先掌握这些。只有两个提示:
      least_squares(error(guess,exp_rate))
      计算函数并传递其结果,而
      least_squares(error)
      将传递函数本身
      args=(exp\u rate)
      args=(exp\u rate,)
      不同!这是很多问题,还有很多非常基本的python内容。在进入scipy(包括与数学相关的调试)之前,请确保先掌握这些。只有两个提示:
      least_squares(error(guess,exp_rate))
      计算函数并传递其结果,而
      least_squares(error)
      将传递函数本身
      args=(exp\u rate)
      args=(exp\u rate,)
      不同!那很有用,谢谢!你完全正确,我试着拟合日志(经验率),现在曲线拟合工作非常顺利。我还相应地修改了错误函数,使其返回Orbach_Raman(温度,a,b,c,d)-np.log10(速率),但与曲线拟合()相比,这对最初的猜测更为合理,拟合更差。@MNewville这是一个很好的答案,我的专业赞扬。@JamesPhillips谢谢,非常感谢。从那时起,我看到了你的许多精彩评论和回答