首页 > 解决方案 > Python,曲线拟合

问题描述

我想拟合一系列高斯函数,我事先不知道需要多少。这是我目前的解决方案。

def gauss_recursive(x,max_value,pos,std):
    if len(pos)==1:
        return gauss(x,max_value,pos,std)
    else:
        return gauss_recursive(x,max_value[:-1],pos[:-1],std[:-1])+gauss(x,max_value[-1],pos[-1],std[-1])

def gauss(x,max_value,pos,std):
    from numpy import exp
    return max_value*exp(-(x-pos)*(x-pos)/std/std)

我知道位置、标准和最大值。因此,即使在许多高斯函数的情况下,拟合也会收敛。但是,我需要曲线拟合才能将列表或元组传递给我的函数。当我启动它时,它会自动将它放入许多单个参数:

fit_para,err = curve_fit(gauss_recursive,x,y,p0=[[1,5,7],[11,15,14],[2.5,2.5,2.5]])

这会导致以下错误:

TypeError: gauss_recursive() takes 4 positional arguments but 10 were given

当我将 p0 作为元组而不是列表传递时,也会发生相同的效果。

有没有办法绕过这个问题?如果是怎么办?

这是解决方案:

def gauss_recursive(x,*args):
    laenge=int(len(args)/3)
    if laenge==1:
        return gauss(x,args[0],args[1],args[2])
    elif laenge>1:
        from numpy import ones
        dummy=ones(len(args))
        dummy[laenge-1]=0
        dummy[2*laenge-1]=0
        dummy[-1]=0
        dummy2=[args[i] for i in range(laenge*3) if dummy[i]==1]
        return gauss_recursive(x,*dummy2)+gauss(x,args[laenge-1],args[2*laenge-1],args[-1])
    else:
        return -1

标签: pythonlistrecursioncurve-fitting

解决方案


推荐阅读