python-curve_fit似乎无法拟合高斯和
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-curve_fit似乎无法拟合高斯和,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2120字,纯文字阅读大概需要4分钟。
内容图文
![python-curve_fit似乎无法拟合高斯和](/upload/InfoBanner/zyjiaocheng/663/ac1f3e7cd67d4e4886c1415370519adc.jpg)
在这里,我定义了一个函数,用于返回任意数量的高斯分布之和:
import numpy
from numpy import *
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def GaussSum(x,*p):
n=len(p)/3
A=p[:n]
w=p[n:2*n]
c=p[2*n:3*n]
return sum([ A[i]*exp(-(x-c[i])**2./(2.*(w[i])**2.))/(2*pi*w[i]**2)**0.5 for i in range(n)])
然后,我继续为给定的参数集生成x和y数据,并要求curve_fit使该数据与匹配生成集的初始参数拟合.我尝试了许多不同的设置,包括单个和多个高斯.
params = [1.,1.,-3.]; #parameters for a single gaussian
#params=[1.,1.,1.,2.,-3.,0.]; #parameters for the sum of two gaussians
xdata=arange(-6,6,0.01)
ydata = array([GaussSum(x,*params) for x in xdata])
popt,pcov = curve_fit(GaussSum,xdata,ydata,p0=params)
print popt
print pcov
每个参数集都给我带来不适合的情况,即使我应该已经在解决方案上开始适合它. (在以上单个高斯中):
[ 52.18242366 5549.66965192 15678.51803797]
inf
我知道该函数本身可以正常运行,因为我已经对其进行了绘制并验证了其有效性.
解决方法:
这里的问题是curve_fit期望您正在优化的函数采用输入向量,并返回输出向量.如所写,函数GaussSum接受单个输入或输入向量(即numpy.array),但无论哪种方式,它都会返回单个标量输出.然后,curve_fit函数无法找到良好的最佳拟合.
为了弄清楚发生了什么,在使用numpy(或任何外部库)时总是建议始终显式使用名称空间,如以下工作版本所示:
import numpy
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def GaussSum(x,*p):
n=len(p)/3
A=p[:n]
w=p[n:2*n]
c=p[2*n:3*n]
y = sum([ A[i]*numpy.exp(-(x-c[i])**2./(2.*(w[i])**2.))/(2*numpy.pi*w[i]**2)**0.5 for i in range(n)])
return y
params = [1.,1.,-3.]; #parameters for a single gaussian
#params=[1.,1.,1.,2.,-3.,0.]; #parameters for the sum of two gaussians
xdata=numpy.arange(-6,6,0.01)
ydata = numpy.array([GaussSum(x,*params) for x in xdata])
popt,pcov = curve_fit(GaussSum,xdata,ydata,p0=params)
具体来说,您是在隐式调用numpy.sum,这将聚合numpy.array并返回单个值,而您需要使用内置的python sum,它将numpy.array的本地列表聚合到一个numpy.array.
内容总结
以上是互联网集市为您收集整理的python-curve_fit似乎无法拟合高斯和全部内容,希望文章能够帮你解决python-curve_fit似乎无法拟合高斯和所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。