我试图拟合这种形式的非线性回归(两相指数衰减)。
SpanFast=(Y0-高原)* PercentFast * .01
SpanSlow=(Y0-高原)* (100-PercentFast) * .01
Y=Plateau + SpanFast * exp(-KFast * X) + SpanSlow * exp(-KSlow * X)
当我使用scipy.optimize.curve_fit在python中进行计算时,我得到的结果与图形垫棱镜不同。我认为这是因为我没有约束: KFast>KSlow>0。但是在蟒蛇身上是怎么做到的呢?如何基于另一个参数KFast>KSlow约束参数。
import scipy.optimize as op
def phaseDecay(x, Y0, Plateau, PercentFast, KFast, KSlow):
"""
Exponential two phase decay
Parameters:
-----------
"""
SpanFast = (Y0-Plateau)*PercentFast*0.01
SpanSlow = (Y0-Plateau)*(100-PercentFast)*0.01
Y = Plateau+SpanFast*np.exp(-KFast*x)+SpanSlow*np.exp(-KSlow*x)
return Y
popt, pcov = op.curve_fit(
phaseDecay,
df["x"],
df["y"],
)
给予:
PARAMETERS:
Y0 100.000000000216
Plateau 69.27241846348228
PercentFast 1.0
KFast 1.0
KSlow 1.0
然而棱镜
Y0 100.0
Plateau 63.58
PercentFast 72.23
KFast 0.001626
KSlow 0.0001125
数据:
0 0 100.000000
1 1320 75.323025
2 4500 71.880123
3 7800 70.038842
4 18660 66.408841
5 0 100.000000
6 1500 73.127293
7 4140 68.821849
8 7320 65.775435
9 18540 62.800071
10 0 100.000000
11 1740 75.241496
12 3960 68.779365
13 7440 67.843209
14 18360 65.229471
发布于 2022-07-05 09:02:15
如果您将目标函数转换为平方差之和,然后使用支持线性不等式的方法(如SLSQP ),则可以使用SciPy来完成这一任务。
我是这样做的:
import scipy.optimize as op
import numpy as np
def phaseDecay(x, xdata, ydata):
"""
Exponential two phase decay
Parameters:
-----------
"""
Y0, Plateau, PercentFast, KFast, KSlow = x
SpanFast = (Y0-Plateau)*PercentFast*0.01
SpanSlow = (Y0-Plateau)*(100-PercentFast)*0.01
Y = Plateau+SpanFast*np.exp(-KFast*xdata)+SpanSlow*np.exp(-KSlow*xdata)
return np.sum((Y - ydata)**2.0)
def constraints(x):
return x[-2] - x[-1]
data = np.loadtxt('data_phase_decay.txt')
X0, Y0 = data[:, 1:].T
lb = np.zeros((5, )) + 1e-5
ub = np.array([100.0, 100.0, 100.0, 0.01, 0.01])
x0 = (ub + lb)/2.0
bounds = zip(lb, ub)
# Tell SLSQP that KSlow < KFast
cons = ({'type': 'ineq', 'fun': constraints})
res = op.minimize(phaseDecay, x0, method='SLSQP', constraints=cons,
args=(X0, Y0))
print(res)
我得到了以下信息:
fun : 30.45577816182897
jac : array([-2.44140625e-04, 1.53160095e-03, -2.43663788e-04,
0.00000000e+00, -2.11278069e+01, 0.00000000e+00])
message: 'Optimization terminated successfully.'
nfev : 247
nit : 27
njev : 27
status : 0
success: True
x : array([9.99999153e+01, 6.46585138e+01, 6.27658587e+01,
2.33870123e-02, 2.02987854e-04])
Y0 = 99.999915
Plateau = 64.658514
PercentFast = 62.765859
KFast = 0.023387
KSlow = 0.000203
https://stackoverflow.com/questions/72853710
复制相似问题