Python 多参数模型中的拟合参数不是按新月顺序计算的
我为这个有点混乱的标题道歉 我试图将一组特定的数据()拟合到由三个sigmoidal函数组成的模型中,如下所述Python 多参数模型中的拟合参数不是按新月顺序计算的,python,scipy,curve-fitting,data-analysis,sigmoid,Python,Scipy,Curve Fitting,Data Analysis,Sigmoid,我为这个有点混乱的标题道歉 我试图将一组特定的数据()拟合到由三个sigmoidal函数组成的模型中,如下所述 def sigmoid(p,x): x01,c1,k1,x02,c2,k2,x03,c3,k3,y0=p y = (c1 / (1 + np.exp(-k1*(x-x01)))) + (c2 / (1 + np.exp(-k2*(x-x02))))+(c3 / (1 + np.exp(-k3*(x-x03)))) + y0 return y #model f
def sigmoid(p,x):
x01,c1,k1,x02,c2,k2,x03,c3,k3,y0=p
y = (c1 / (1 + np.exp(-k1*(x-x01)))) + (c2 / (1 + np.exp(-k2*(x-x02))))+(c3 / (1 + np.exp(-k3*(x-x03)))) + y0
return y
#model for curve with 3 sigmoidal transitions, where:
# y0 = y initial value
# x0, x02, x03 = the x-value of the sigmoid's midpoint
# c1, c2, c3 = the curve's maximum value
# k1, k2, k3= the logistic growth rate or steepness of the curve
当我运行完整脚本(下面提供)时,我得到以下示例作为结果:
如图所示,c、x0和k的值不是新月顺序(即:c2的值小于c3,因此c3的值小于c1)。有人能解释一下为什么会发生这种情况,以及我如何解决这个问题吗?我确实需要参数相对于x的新月顺序(c1>c2>c3),因为我稍后会将它们存储在变量中以用作统计实体
在某些情况下,我还得到了c、k和x0的负值,如下图所示
是否有任何方法可以解决此问题,以便始终获得拟合参数的正值?还是我没有正确地进行装配
下面是我正在运行的代码示例:
import numpy as np
import pandas as pd
import scipy.optimize
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def sigmoid(p,x):
x01,c1,k1,x02,c2,k2,x03,c3,k3,y0=p
y = (c1 / (1 + np.exp(-k1*(x-x01)))) + (c2 / (1 + np.exp(-k2*(x-x02))))+(c3 / (1 + np.exp(-k3*(x-x03)))) + y0
return y
#model for curve with 3 sigmoidal transitions, where:
# y0 = y intitial value,
# x0, x02, x03 = the x-value of the sigmoid's midpoint,
# c1, c2, c3 = the curve's maximum value
# k1, k2, k3= the logistic growth rate or steepness of the curve
def residuals(p,x,y):
return y - sigmoid(p,x)
url=r'/Users/user/Downloads/RawDataEclipse (1).xlsx'
for i in range(12):
#data raw
df = pd.read_excel(url, sheet_name=i,sep='\s*,\s*') # we use index_col=0 to indicate that first row in the dataset is the index column
#df.rename(columns={ df.columns[1]: "Time_1", df.columns[3]: "Time_2"}) #rename columns which have the same name
x1=np.array(df['Time'], dtype=float)
y1=np.array(df['Intensity330'], dtype=float)
x2=np.array(df['Time.1'], dtype=float)
y2=np.array(df['Intensity330'], dtype=float)
x3=np.array(df['Time.2'], dtype=float)
y3=np.array(df['Intensity490\'Time'], dtype=float)
p_guess=(0,0,0,0,0,0,0,0,0,0)
#fits
p1, cov1, infodict1, mesg1, ier1 = scipy.optimize.leastsq(residuals,p_guess,args=(x1,y1),full_output=1)
p2, cov2, infodict2, mesg2, ier2 = scipy.optimize.leastsq(residuals,p_guess,args=(x2,y2),full_output=1)
p3, cov3, infodict3, mesg3, ier2 = scipy.optimize.leastsq(residuals,p_guess,args=(x3,y3),full_output=1)
x011,c11,k11,x021,c21,k21,x031,c31,k31,y01=p1
x012,c12,k12,x022,c22,k22,x032,c32,k32,y02=p2
x013,c13,k13,x023,c23,k23,x033,c33,k33,y03=p3
print('''\
DATA FIT 330 a.u.:
x0 step 1= {x011}
x0 step 2= {x021}
x0 step 3= {x031}
y0= {y01}
c step 1= {c11}
c step 2= {c21}
c step 3= {c31}
k step 1 = {k11}
k step 2 = {k21}
k step 3 = {k31}
'''.format(x011=x011,c11=c11,k11=k11,x021=x021,c21=c21,k21=k21,x031=x031,c31=c31,k31=k31,y01=y01))
print('''\
DATA FIT 350 a.u.:
x0 step 1= {x012}
x0 step 2= {x022}
x0 step 3= {x032}
y0= {y02}
c step 1= {c12}
c step 2= {c22}
c step 3= {c32}
k step 1 = {k12}
k step 2 = {k22}
k step 3 = {k32}
'''.format(x012=x012,c12=c12,k12=k12,x022=x022,c22=c22,k22=k22,x032=x032,c32=c32,k32=k32,y02=y02))
print('''\
DATA FIT 490 a.u.:
x0 step 1= {x013}
x0 step 2= {x023}
x0 step 3= {x033}
y0= {y03}
c step 1= {c13}
c step 2= {c23}
c step 3= {c33}
k step 1 = {k13}
k step 2 = {k23}
k step 3 = {k33}
'''.format(x013=x013,c13=c13,k13=k13,x023=x023,c23=c23,k23=k23,x033=x033,c33=c33,k33=k33,y03=y03))
pxp1=sigmoid(p1,x1)
pxp2=sigmoid(p2,x2)
pxp3=sigmoid(p3,x3)
#Plot the results
plt.plot(x1, y1, '.', label='data i330')
plt.plot(x1, pxp1, label='fit i330')
plt.plot(x2, y2, 'v', label='data i350')
plt.plot(x2, pxp2, label='fit i350')
plt.plot(x3, y3, '^', label='data i490')
plt.plot(x3, pxp3, label='fit i490')
plt.xlabel('Time (min)')
plt.ylabel('Intrinsic Fluorescence (a.u.)')
plt.grid(True)
plt.legend()
plt.show()
请你发布一个指向数据文件的链接好吗?这是指向该文件的链接。现在,在post@JamesPhillipsIs的第一行中也可以找到数据的链接。使用3个S形函数之和进行拟合有很强的理由吗?似乎在所提供的数据上只有一个跃迁,而且所获得的负值表明所有参数都不相关。。。我想测试一个更简单的函数(可能基于),我已经尝试过并且只有一个和两个转换的脚本。问题是,当脚本只考虑一个转换时,匹配性根本不好。如果你仔细观察,你会发现,实际上,大多数数据在绘制时,显示了两个过渡。这在曲线的第一部分特别明显,因为没有观察到对数增长前后具有S形函数特征的直线(步长=0)。这是拟合3个sigmoidal函数的主要论点,因为该模型最适合@xdze2。您试图从数据中提取什么?大步的位置?然后,我将只在台阶附近使用一个S形函数。还是你只是需要一个合适的发型?那么样条曲线拟合就可以了。我可以请你发布一个数据文件的链接吗?这是该文件的链接。现在,在post@JamesPhillipsIs的第一行中也可以找到数据的链接。使用3个S形函数之和进行拟合有很强的理由吗?似乎在所提供的数据上只有一个跃迁,而且所获得的负值表明所有参数都不相关。。。我想测试一个更简单的函数(可能基于),我已经尝试过并且只有一个和两个转换的脚本。问题是,当脚本只考虑一个转换时,匹配性根本不好。如果你仔细观察,你会发现,实际上,大多数数据在绘制时,显示了两个过渡。这在曲线的第一部分特别明显,因为没有观察到对数增长前后具有S形函数特征的直线(步长=0)。这是拟合3个sigmoidal函数的主要论点,因为该模型最适合@xdze2。您试图从数据中提取什么?大步的位置?然后,我将只在台阶附近使用一个S形函数。还是你只是需要一个合适的发型?那么样条曲线拟合就可以了。我