【问题标题】:My use of Scipy curve_fit does not seem to work well我对 Scipy curve_fit 的使用似乎效果不佳
【发布时间】:2015-01-21 18:13:09
【问题描述】:

我正在尝试使用 Scipy curve_fit 将我的数据拟合到高斯。不幸的是,curve_fit 返回 1,1,1。

Kp4=fnamer4[615:645]
xk=np.arange(0,1024,1)[615:645]

def func(x, a, x0, sigma):
return a*np.exp(-(x-x0)**2/(2*sigma**2))
popt, pcov = curve_fit(func, xk, Kp4)
print (popt)
Kp4_fit= func(xk, popt[0], popt[1], popt[2])
plt.plot(xk, Kp4_fit, 'r',xk, Kp4, 'bs')

Kp4 等于

>>> Kp4
array([23, 27, 20, 26, 22, 22, 26, 29, 32, 19, 34, 26, 29, 24, 32, 41, 27,
   39, 33, 30, 30, 30, 26, 39, 30, 21, 17, 16, 17, 14])

打印弹窗的输出是[ 1. 1. 1.] 我之前在很多不同的数据上尝试过curve_fit,效果很好。也许问题是curve_fit不能拟合高斯函数的数据?! 谢谢你的帮助。

我用于 curve_fit 的概念基于以下链接中的示例: http://python4esac.github.io/fitting/examples1d.html

【问题讨论】:

    标签: python numpy scipy curve-fitting gaussian


    【解决方案1】:

    您必须为 popt 传递一个初始猜测,否则拟合以 [1,1,1] 作为初始猜测开始,这对您的数据集来说非常糟糕!

    以下为我提供了合理的结果:

    popt, pcov = curve_fit(func, xk, Kp4, p0=[20,630,5])
    

    最初的猜测可能是[np.mean(Kp4), np.mean(xk),5*(max(xk)-min(xk))/len(xk)],有一个大致的起点。

    别忘了在最后加上plt.show() 或类似的东西。

    【讨论】:

    • 如果答案对您有用,请将其标记为已解决,如here 所述。因此,其他用户将认识到 a) 问题已解决,b) 解决方案是什么样的。谢谢!
    • 感谢您的帮助 jaklden
    猜你喜欢
    • 2018-06-07
    • 2017-09-22
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2018-12-08
    • 2020-11-09
    相关资源
    最近更新 更多