Python scipy.optimize.curve“U拟合设置a”;固定的;参数

Python scipy.optimize.curve“U拟合设置a”;固定的;参数,python,numpy,scipy,curve-fitting,Python,Numpy,Scipy,Curve Fitting,我用高斯函数来近似数据中的峰值。这对于强峰很有效,但对于弱峰则更困难。然而,我认为固定一个参数(比如高斯宽度)会有帮助。我知道我可以设置初始“估计”,但有没有一种方法可以在不更改拟合函数的情况下轻松定义单个参数?希望这会有所帮助。必须使用hax。曲线拟合对于所需的条件非常严格 import numpy as np from numpy import random import scipy as sp from scipy.optimize import curve_fit import matp

我用高斯函数来近似数据中的峰值。这对于强峰很有效,但对于弱峰则更困难。然而,我认为固定一个参数(比如高斯宽度)会有帮助。我知道我可以设置初始“估计”,但有没有一种方法可以在不更改拟合函数的情况下轻松定义单个参数?

希望这会有所帮助。必须使用hax。曲线拟合对于所需的条件非常严格

import numpy as np
from numpy import random
import scipy as sp
from scipy.optimize import curve_fit
import matplotlib.pyplot as pl

def exp1(t,a1,tau1):
    #A1*exp(-t/t1)
    val=0.
    val=(a1*np.exp(-t/tau1))*np.heaviside(t,0)
    return val

def wrapper(t,*args):

    global hold
    global p0
    wrapperName='exp1(t,'
    for i in range(0, len(hold)):
        if hold[i]:
            wrapperName+=str(p0[i])
        else:
            if i%2==0:
                wrapperName+='args['+str(i)+']'
            else:
                wrapperName+='args'+str(i)+']'
        if i<len(hold):
            wrapperName+=','
    wrapperName+=')'

    return eval(wrapperName)

p0=np.array([1.5,500.])
hold=np.array([0,1])
p1=np.delete(p0,1)

timepoints = np.arange(0.,2000.,20.)
y=exp1(timepoints,1,1000)+np.random.normal(0, .1, size=len(timepoints))

popt, pcov = curve_fit(exp1, timepoints, y, p0=p0)
print 'unheld parameters:', popt, pcov

popt, pcov = curve_fit(wrapper, timepoints, y, p0=p1)
for i in range(0, len(hold)):
    if hold[i]:
        popt=np.insert(popt,i,p0[i])
yfit=exp1(timepoints,popt[0],popt[1])
pl.plot(timepoints,y,timepoints,yfit)
pl.show()
print 'hold parameters:', popt, pcov
将numpy导入为np
从numpy导入随机
将scipy作为sp导入
从scipy.optimize导入曲线\u拟合
将matplotlib.pyplot作为pl导入
def exp1(t、a1、tau1):
#A1*exp(-t/t1)
val=0。
val=(a1*np.exp(-t/tau1))*np.heaviside(t,0)
返回值
def包装(t,*参数):
全球控股
全局p0
wrapperName='exp1(t,'
对于范围(0,len(hold))中的i:
如果保持[i]:
wrapperName+=str(p0[i])
其他:
如果i%2==0:
包装器名称+='args['+str(i)+']
其他:
包装器名称+='args'+str(i)+']'

如果我希望这是有帮助的。我必须使用hax。曲线拟合对它的要求非常严格

import numpy as np
from numpy import random
import scipy as sp
from scipy.optimize import curve_fit
import matplotlib.pyplot as pl

def exp1(t,a1,tau1):
    #A1*exp(-t/t1)
    val=0.
    val=(a1*np.exp(-t/tau1))*np.heaviside(t,0)
    return val

def wrapper(t,*args):

    global hold
    global p0
    wrapperName='exp1(t,'
    for i in range(0, len(hold)):
        if hold[i]:
            wrapperName+=str(p0[i])
        else:
            if i%2==0:
                wrapperName+='args['+str(i)+']'
            else:
                wrapperName+='args'+str(i)+']'
        if i<len(hold):
            wrapperName+=','
    wrapperName+=')'

    return eval(wrapperName)

p0=np.array([1.5,500.])
hold=np.array([0,1])
p1=np.delete(p0,1)

timepoints = np.arange(0.,2000.,20.)
y=exp1(timepoints,1,1000)+np.random.normal(0, .1, size=len(timepoints))

popt, pcov = curve_fit(exp1, timepoints, y, p0=p0)
print 'unheld parameters:', popt, pcov

popt, pcov = curve_fit(wrapper, timepoints, y, p0=p1)
for i in range(0, len(hold)):
    if hold[i]:
        popt=np.insert(popt,i,p0[i])
yfit=exp1(timepoints,popt[0],popt[1])
pl.plot(timepoints,y,timepoints,yfit)
pl.show()
print 'hold parameters:', popt, pcov
将numpy导入为np
从numpy导入随机
将scipy作为sp导入
从scipy.optimize导入曲线\u拟合
将matplotlib.pyplot作为pl导入
def exp1(t、a1、tau1):
#A1*exp(-t/t1)
val=0。
val=(a1*np.exp(-t/tau1))*np.heaviside(t,0)
返回值
def包装(t,*参数):
全球控股
全局p0
wrapperName='exp1(t,'
对于范围(0,len(hold))中的i:
如果保持[i]:
wrapperName+=str(p0[i])
其他:
如果i%2==0:
包装器名称+='args['+str(i)+']
其他:
包装器名称+='args'+str(i)+']'
如果我如果您想“修复”fit函数的参数,您可以定义一个新的fit函数,该函数使用原始fit函数,但将一个参数设置为固定值:

custom_gaussian = lambda x, mu: gaussian(x, mu, 0.05)
这里有一个将a的
sigma
固定到
0.05
(而不是最佳值
0.1
)的完整示例。当然,这在这里没有真正的意义,因为算法在寻找最佳值方面没有问题。但是,您可以看到,尽管
sigma
固定,但仍然可以找到
mu

导入matplotlib.pyplot作为plt
将numpy作为np导入
导入scipy.optimize
def高斯(x,mu,sigma):
返回1/sigma/np.sqrt(2*np.pi)*np.exp(-(x-mu)**2/2/sigma**2)
#创建示例数据
x=np.linspace(0,2200)
y=高斯(x,1,0.1)+np.random.rand(*x.shape)-0.5
plt.绘图(x,y,label=“样本数据”)
#使用原始拟合函数拟合
popt,u=scipy.optimize.curve_u拟合(高斯,x,y)
plt.plot(x,高斯(x,*popt),label=“高斯”)
#具有固定“sigma”的自定义拟合函数的拟合`
自定义_高斯=λx,μ:高斯(x,μ,0.05)
popt,u=scipy.optimize.curve_fit(自定义_高斯,x,y)
plt.plot(x,自定义高斯(x,*popt),label=“自定义高斯”)
plt.legend()
plt.show()

如果要“修复”拟合函数的参数,可以定义一个新的拟合函数,该函数使用原始拟合函数,但将一个参数设置为固定值:

custom_gaussian = lambda x, mu: gaussian(x, mu, 0.05)
这里有一个将a的
sigma
固定到
0.05
(而不是最佳值
0.1
)的完整示例。当然,这在这里没有真正的意义,因为算法在寻找最佳值方面没有问题。但是,您可以看到,尽管
sigma
固定,但仍然可以找到
mu

导入matplotlib.pyplot作为plt
将numpy作为np导入
导入scipy.optimize
def高斯(x,mu,sigma):
返回1/sigma/np.sqrt(2*np.pi)*np.exp(-(x-mu)**2/2/sigma**2)
#创建示例数据
x=np.linspace(0,2200)
y=高斯(x,1,0.1)+np.random.rand(*x.shape)-0.5
plt.绘图(x,y,label=“样本数据”)
#使用原始拟合函数拟合
popt,u=scipy.optimize.curve_u拟合(高斯,x,y)
plt.plot(x,高斯(x,*popt),label=“高斯”)
#具有固定“sigma”的自定义拟合函数的拟合`
自定义_高斯=λx,μ:高斯(x,μ,0.05)
popt,u=scipy.optimize.curve_fit(自定义_高斯,x,y)
plt.plot(x,自定义高斯(x,*popt),label=“自定义高斯”)
plt.legend()
plt.show()

到目前为止您尝试了什么?也许您可以添加一个代码示例(请参阅以获取帮助)?请添加一些数据和代码,这样会更容易为您提供帮助。编辑您正在拟合的高斯函数,使您想要保持常量的参数不再依赖于输入参数。可能帮助您到目前为止尝试了哪些方法?可能您可以添加一个代码示例(请参阅以获取帮助)?请添加一些数据和代码,这样会更容易为您提供帮助。请编辑您正在拟合的高斯函数,使您想要保持常量的参数不再依赖于输入参数。可能会有帮助