使用Scipy拟合逻辑斯蒂增长曲线结果不符合预期的问题求助
问题原因
- 初始参数K的猜测值严重偏离合理范围:逻辑斯蒂模型中K代表环境容纳量,需大于等于观测到的种群最大值,你设置的初始K为12.9,但观测数据中酵母最大数量已经达到659.6,偏差过大导致拟合算法收敛到错误结果。
- 初始种群数量N0不匹配观测起点:你设置N0为0.37,但观测序列的第一个点t=0对应的酵母数量为9.6,微分方程初始条件和观测数据起始值不一致,进一步干扰拟合效果。
- 原代码缺失
matplotlib.pyplot导入语句,直接调用plt会触发名称错误。
修正后代码
import scipy.optimize as optim from scipy.integrate import odeint import numpy as np import pandas as pd import matplotlib.pyplot as plt # 初始值匹配t=0的观测数据 N0 = 9.6 # K的初始值调整为略大于观测最大值,r保持合理的增长速率猜测 parsic = [0.5, 700] 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') plt.show()
效果说明
调整后拟合得到的参数符合逻辑斯蒂增长的规律,曲线会贴合观测点,和预期输出一致。
内容的提问来源于stack exchange,提问作者An Ignorant Wanderer
相关产品推荐
相关产品推荐

