【发布时间】:2016-11-29 05:04:58
【问题描述】:
我正在尝试使用 scipy.optimize 函数 curve_fit 来使用自定义指数函数拟合一组数据点。我的代码如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def fit(x, tau, beta):
return np.exp(-1 * np.power(x / tau, beta))
def plot_e2e(times, e2es):
optimalParams, covariance = curve_fit(fit, times, e2es)
tau = optimalParams[0]
beta = optimalParams[1]
print 'Tau is:', tau
print 'Beta is:', beta
if __name__ == '__main__':
% read_e2e_data not included for proprietary reasons.
times, e2es = read_e2e_data(fileName)
plot_e2e(times, e2es)
这样做会引发以下异常(由于取出不相关的内容,行号可能会有所不同):
Traceback (most recent call last):
File ".\plot_e2e.py", line 54, in <module>
plot_e2e(times, e2es)
File ".\plot_e2e.py", line 34, in plot_e2e
optimalParams, covariance = curve_fit(fit, times, e2es)
File "C:\Anaconda\lib\site-packages\scipy\optimize\minpack.py", line 586, in curve_fit
raise RuntimeError(msg)
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 600.
如果我增加 curve_fit 的 maxfev 参数,我会得到 Tau (4.035e-303) 的虚假值。
我的时间和 e2e 向量是这样的:
time = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 11.0, 14.0, 17.0, 21.0, 25.0, 30.0, 37.0, 45.0, 54.0, 65.0, 78.0, 94.0, 113.0, 136.0, 163.0, 196.0, 236.0, 283.0, 340.0, 409.0, 491.0]
e2es = [1.0, 0.999804, 0.99964, 0.999497, 0.99937, 0.999276, 0.999139, 0.998974, 0.998566, 0.998005, 0.997225, 0.997073, 0.997793, 0.998586, 1.001542, 1.004414, 1.005311, 1.001431, 1.001016, 0.998936, 0.995649, 0.993765, 0.98663, 0.985266, 0.984635, 0.982588, 0.974413, 0.973811, 0.968772, 0.970131]
如果您对可能出现的问题有任何想法,请告诉我。我一直在尝试调试这个问题并遇到了死胡同。
【问题讨论】:
-
在搜索最优参数时,
curve_fit以它们都为 1 开始,这可能是一个非常糟糕的猜测。尝试使用p0参数,给它一个比全 1 更合适的值。即使是一个非常粗略的猜测,其中参数只有大致正确的数量级,也会产生很大的不同。例如,请参阅stackoverflow.com/questions/21420792/… -
我能够通过将函数更改为
np.exp(-1 * np.power(x * tau, beta))来收敛,这样我就不会出现不连续性。 -
@Joboman555 这些是曲线拟合的参数docs.scipy.org/doc/scipy/reference/generated/…
标签: python scipy curve-fitting