首页 文章

使用scipy的curve_fit函数进行维度问题

提问于
浏览
3

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

简而言之,我在一个包含两列的文本文件中有数据 . 所以我的第一步是将数据导入两个数组,一个包含xdata,另一个包含y数据 . 然后我试着定义我要适合的功能(四个voigt峰值) . 最后,当我试图运行整个事情时,我收到以下错误:

引发TypeError('输入错误:N =%s不得超过M =%s'%(n,m))TypeError:输入不正确:N = 11不得超过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

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

1 回答

  • 1

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

    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] .

    因此,当您将多维对象缩减为一维对象时,收到有关尺寸的错误消息并不是一个大惊喜 .

相关问题