【问题标题】:Dimension issue with scipy's curve_fit functionscipy的curve_fit函数的尺寸问题
【发布时间】:2016-04-24 05:02:33
【问题描述】:

我不熟悉 python 中的曲线拟合,以及一般的 python。目前,我正在尝试使用 scipy 的 curve_fit 模块来拟合 4 个光谱峰。

简而言之,我在一个包含两列的文本文件中有数据。所以我的第一步是将数据导入两个数组,一个包含 xdata,另一个包含 y 数据。然后我尝试定义我要拟合的函数(四个 voigt 峰)。最后,当我尝试运行整个过程时,出现以下错误:

raise TypeError('Improper input: N=%s must not超过 M=%s' % (n, m)) TypeError: Improper input: N=11 must not超过M=1

据我从curve_fit help 页面得知,此错误表明我必须至少拥有与拟合参数一样多的数据点,这是有道理的。问题是我的数据集中有 250 个点...

这是我的代码

import numpy as n
import pyspec as p
from scipy.optimize import curve_fit

file = open('fileName', "r") #open the file
data = n.loadtxt(file) #load the file into an array
freq = n.array(data[:, 0] - n.median(data[:, 0])) #center data on zero. 
counts = n.array(data[:, 1])
error = n.array(data[:, 1]**0.5) #get the error on the counts. Standard poisson error. 

# Define a single voigt profile
def voigt(xdata, amp, cent, FWHM, ep) :
   x = xdata
   C = cent
   F = FWHM
   A = amp
   E = ep
   vmodel = A * ((1 - E)*n.exp(-2.77259 * (n.square(x - C))/n.square(F)) + E / (1 + (4 * n.square(x - C)/F**2)))
   return[vmodel]

   #Define the four peak function

def voigt4(xdata, amp1, amp2, amp3, amp4, pos1, pos2, pos3, pos4, FWHM, ep, Bg):
   voigtp1 = voigt(xdata, amp1, pos1, FWHM, ep)
   voigtp2 = voigt(xdata, amp2, pos2, FWHM, ep)
   voigtp3 = voigt(xdata, amp3, pos3, FWHM, ep)
   voigtp4 = voigt(xdata, amp4, pos3, FWHM, ep)

   voigt4 = (voigtp1 + voigtp2 + voigtp3 + voigtp4 + Bg) # include a background term
    return[voigt4]

   # give an initial guess. The *_in params are initial guesses made by the user. 
   guess =   n.array([amp1_in, amp2_in, amp3_in, amp4_in, pos1_in, pos2_in, pos3_in, pos4_in, 500, 0.5, bkgr_in])

   fit = curve_fit(voigt4, freq, counts, guess) # try to fit

我不知道为什么会出现这个错误。

【问题讨论】:

  • 尝试删除返回语句中的括号。例如。 return vmodelreturn voigt4.
  • 我同意@WarrenWeckesser:删除您的退货声明中的括号,看看是否已经解决了问题。一般来说:如果您也发布您使用的数据,这将有助于运行代码并解决问题。
  • 这非常有效!非常感谢您的回答和建议,如果遇到其他问题,我一定会发布数据。你介意解释一下为什么括号是问题吗?

标签: python python-2.7 numpy scipy curve-fitting


【解决方案1】:

正如 cmets 中已经写的那样,您应该删除函数 voigtvoigt4 中返回语句中的括号。括号的问题是您将要返回的数组放在列表中,从而减少了返回对象的尺寸。考虑以下示例:

import numpy as np
ar = np.array([1, 2, 3, 4])

然后是命令

len(ar)

会返回 4 和

a[0]

按预期返回 1。如果你现在这样做

b = [ar] 

正如您在退货声明中所做的那样

b

[array([1, 2, 3, 4])]

b[0]

不再是单个值,而是整个原始数组:

array([1, 2, 3, 4])

这意味着你收到了类似的错误

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-269-33e961e0e4ea> in <module>()
----> 1 b[1]

IndexError: list index out of range

如果您尝试访问b[1]

因此,您收到有关维度的错误消息也就不足为奇了,因为您将多维对象简化为一维对象。

【讨论】:

  • 是的,这个答案完全是我的问题。顺便说一句,这也可能有助于解决我遇到的另一个问题。再次感谢!
  • @JulienRefour:很高兴它解决了问题!祝其他问题好运!
猜你喜欢
  • 2013-10-18
  • 2021-02-16
  • 2016-03-08
  • 2021-08-21
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多