scipy.optimize.curve_fit无法适应曲线

时间:2016-04-25 13:38:13

标签: python optimization scipy curve

我正在尝试使用以下代码填充一些数据:

Info.plist

曲线未适合:

Data fit with straight line - should be curve

我应该怎么做才能正确拟合数据?

2 个答案:

答案 0 :(得分:3)

看起来优化器陷入局部最小值,或者可能只是目标函数的一个非常平坦的区域。通过调整curve_fit使用的参数的初始猜测,可以找到更好的拟合。例如,我使用p0=[1, 1, 1, 2.0](默认值为[1,1,1,1])得到了合理的拟合度:

plot

以下是我使用过的脚本的修改版本:

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


def func(x, a, b, c, d):
    return a + b*x - c*np.exp(-d*x)


xdata = np.array([0.03447378,  0.06894757,  0.10342136,  0.13789514,  0.17236893,
    0.20684271,  0.24131649,  0.27579028,  0.31026407,  0.34473785,
    0.37921163,  0.41368542,  0.44815921,  0.48263299])

ydata = np.array([ 2.5844 ,  2.87449,  3.01929,  3.10584,  3.18305,  3.24166,
    3.28897,  3.32979,  3.35957,  3.39193,  3.41662,  3.43956,
    3.45644,  3.47135])

p0 = [1, 1, 1, 2.0]

popt, pcov = curve_fit(func, xdata, ydata, p0=p0)
print(popt)

plt.figure()
plt.plot(xdata, ydata, 'ko', label="Original Noised Data")
plt.plot(xdata, func(xdata, *popt), 'r-', label="Fitted Curve")
plt.legend(loc='best')
plt.show()

打印输出为:

[  3.13903988   0.71827903   0.97047248  15.40936232]

答案 1 :(得分:0)

请尝试更具体地解决您遇到的问题。

我注意到的两件事会阻止您的代码按原样运行:

  • 第15行(curve_fit()调用),行尾有一个额外的右副词
  • xdata是一个python列表,所以一旦你尝试将它与func中的参数相乘,它就不会起作用,即将它变成一个numpy数组 xdata = np.array(xdata)

如果你解决了这两个问题,那么适合应该有效。

编辑:沃伦当然是对的 - 修复上述问题仍然会让你开始做错了。