使用 scipy 的逻辑增长曲线不太正确

计算科学 Python scipy 微分方程
2021-12-22 09:54:37

我正在尝试使用 Python 的Scipy包将简单的逻辑增长模型拟合到虚拟数据。代码如下所示,以及我得到的输出。正确的输出如下所示。我不太确定这里出了什么问题。

import scipy.optimize as optim
from scipy.integrate import odeint
import numpy as np
import pandas as pd

N0 = 0.37
parsic = [.25, 12.9]

df_yeast = pd.DataFrame({'cd': [9.6, 18.3, 29., 47.2, 71.1, 119.1, 174.6, 257.3, 350.7, 441., 513.3, 559.7, 594.8, 629.4, 640.8, 651.1, 655.9, 659.6], 'td': np.arange(18)})

def logistic_de(t, N, r, K):
    return r*N*(1 - N/K)

def logistic_solution(t, r, K):
    return odeint(logistic_de, N0, t, (r, K), tfirst=True).ravel()

params, _ = optim.curve_fit(logistic_solution, df_yeast['td'], df_yeast['cd'], p0=parsic)

N1 = odeint(logistic_de, N0, np.linspace(0, 20, 10000), (params[0], params[1]), tfirst=True)

plt.plot(np.linspace(0, 20, 10000), N1)
plt.scatter(df_yeast['td'], df_yeast['cd'])
plt.ylabel('num yeast')
plt.xlabel('time')

我的输出: 在此处输入图像描述

正确的输出: 在此处输入图像描述

1个回答

重复您在交叉帖子中得到的答案https://stackoverflow.com/questions/69292456/logistic-growth-curve-using-scipy-is-not-quite-right

Logistic 曲线在其对称性方面相当严格。将初始值强制为某个规定的常数有效地消除了可用于拟合过程的曲线族中的自由度。

因此包含N0在参数集中,不要忘记将其解包以进行绘图计算,您将获得一个拟合的解决方案,看起来像您的第二个带参数的图表r=0.5476140280399281, K=662.6552616132678, N0=9.10156146739931

代码的变化是

parsic = [.25, 12.9, N0]
...
def logistic_solution(t, r, K, N0):
    return odeint(logistic_de, N0, t, (r, K), tfirst=True, atol=1e-6, rtol=1e-9).ravel()
...
t = np.linspace(0, 20, 1000)
N1 = logistic_solution(t, *params)
plt.plot(t, N1)