【问题标题】:Improper input: N=3 must not exceed M=1 (error trying to fit a gaussian function)输入不当:N=3 不得超过 M=1(试图拟合高斯函数时出错)
【发布时间】:2018-02-06 20:52:59
【问题描述】:

我对 python 和曲线拟合很陌生,目前我正在尝试用高斯拟合下图

我正在关注this tutorial,我的代码如下所示

import numpy as np
import matplotlib.pyplot as plt
from pylab import genfromtxt
from matplotlib import pyplot
from numpy import sqrt, pi, exp, linspace,loadtxt
from lmfit import Model

def gaussian(x,amp,cen,wid):
    "1-d gaussian: gaussian(x,amp,cen,wid)"
    return (amp/(sqrt(2*pi)*wid))*exp(-(x-cen)**2/(2*wid**2))


filelist=[]
time=[0.00,-1.33,-2.67,-4.00,-5.33,-6.67,1.13,2.67,4.00,5.33,6.67]
index=0
offset=0

filelist.append('0.asc')

for i in range(1,6):
    filelist.append("-%s00.asc" %(i))

for i in range(1,6):
    filelist.append("+%s00.asc" %(i))

sfgpeaks=[]


for fname in filelist:
    data=np.genfromtxt(fname,delimiter=',',unpack=True,skip_footer=20)
    SFGX=data[0,500:530]
    SFGY=data[1,500:530]
    SFGpeakY=np.max(SFGY)
    sfgpeaks.append(SFGpeakY)

    gmodel = Model(gaussian)
    result = gmodel.fit(SFGpeakY, x=time[index], amp=5,cen=5,wid=3)

    plt.plot(time[index],sfgpeaks[index],'ro')
    plt.plot(time[index],result.init_fit, 'k--',label="Gaussian Fit")

    plt.xticks(time)
    index=index+1

print(pump2SHGX)
pyplot.title("Time Delay-SFG peak")
plt.xlabel("Timedelay[ps]")
plt.ylabel("Counts[arb.unit]")
plt.savefig("796and804nmtimesfg")
plt.legend(bbox_to_anchor=(1.0,0.5))
plt.show()

但是,当我尝试将我拥有的数据(时间延迟和上图的 Y 值)添加到高斯参数中时,我遇到了错误。 我得到的错误是这个

TypeError:输入不正确:N=3 不得超过 M=1

这个错误是因为我试图从一个数组中插入一个值到参数中吗??

非常感谢任何帮助。

【问题讨论】:

  • 请添加回溯 - 哪里出现错误?
  • 抱歉,这是“阅读错误信息”问题之一。您想将三个参数拟合到一个单点。注意SFGpeakY=np.max(SFGY) 只是一个值,因此M=1
  • 我的印象是你要拟合的数据是由所有文件组成的,所以你需要先做这个数据集,并且拟合一定不能在那个循环里面。
  • 感谢您的评论!当我在循环外进行拟合时,它起作用了!

标签: python curve-fitting


【解决方案1】:

你有

 result = gmodel.fit(SFGpeakY, x=time[index], amp=5,cen=5,wid=3)

将 1 个值作为 x 传递,将 1 个值作为数据传递。然后在该 1 点评估模型。错误消息是适合抱怨您有 3 个变量和 1 个值。

您可能希望将数据数组SFGYx 设置为SFGX 相匹配,

 result = gmodel.fit(SFGY, x=SFGX, amp=5,cen=5,wid=3)

虽然我不清楚您附加的图中使用了哪些数据。

另外:您可能希望根据数据为ampcenwid 提供初始值。你的SFGpeakY 可能是amp 的一个不错的猜测,SFGX.mean()SFGX.std() 可能是不错的猜测,或者cenwid

另外:您绘制result.init_fit 标记为“高斯拟合”。 result.init_fit 将是使用参数初始值评估的模型。 result.best_fit 中与优化参数的最佳匹配。

【讨论】:

  • 感谢您的回答!我在循环外进行了拟合,错误消失了。我将 Y 设置为数组 sfgpeaks,将 x 设置为数组时间。然而,卡方值太大了,这意味着数据甚至不适合模型。可能需要重新考虑我的数据输入。
  • 除非您发布实际运行的代码,否则很难知道您做了什么。您的原始代码中有很多额外的不完全关于消息的内容。将其分解为一个最小的示例(这也会对您有所帮助)。此外,您应该查看并包含拟合报告 (print(result.fit_report())),该报告将显示拟合统计数据和细化的参数值和不确定性。
猜你喜欢
  • 2016-07-17
  • 2021-03-22
  • 2020-12-05
  • 1970-01-01
  • 2018-03-26
  • 2021-01-05
  • 2023-03-10
  • 2012-07-15
  • 1970-01-01
相关资源
最近更新 更多