优化SEIR传染病预测模型,包含真实值与预测值,写一份代码
时间: 2024-02-26 08:52:05 浏览: 94
以下是一个基于Python的SEIR传染病预测模型,并使用梯度下降算法优化模型参数,并且展示真实值与预测值之间的差异的代码示例:
```python
import numpy as np
from scipy.integrate import odeint
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
# SEIR模型
def SEIR(y, t, beta, gamma, sigma, N):
S, E, I, R = y
dSdt = -beta * S * I / N
dEdt = beta * S * I / N - sigma * E
dIdt = sigma * E - gamma * I
dRdt = gamma * I
return dSdt, dEdt, dIdt, dRdt
# 优化模型参数
def fit_SEIR(y0, t, N, y_true):
# 初始参数值
beta, gamma, sigma = 0.2, 0.1, 0.1
# 使用梯度下降算法优化参数
alpha = 0.01
for i in range(100):
# 计算预测值
y_pred = odeint(SEIR, y0, t, args=(beta, gamma, sigma, N))
# 求解梯度
d_beta = np.mean(2 * (y_pred[:, 2] - y_true) * y_pred[:, 0] * y_pred[:, 2] / N)
d_gamma = np.mean(2 * (y_pred[:, 3] - y_true) * y_pred[:, 2])
d_sigma = np.mean(2 * (y_pred[:, 1] - y_true) * y_pred[:, 0] * y_pred[:, 2] / N)
# 更新参数
beta -= alpha * d_beta
gamma -= alpha * d_gamma
sigma -= alpha * d_sigma
# 返回优化后的参数和预测值
y_pred = odeint(SEIR, y0, t, args=(beta, gamma, sigma, N))
return beta, gamma, sigma, y_pred
# 模拟疫情传播
N = 1000000
t = np.linspace(0, 100, 1000)
y0 = [N-100, 100, 0, 0]
beta_true, gamma_true, sigma_true = 0.3, 0.1, 0.2
y_true = odeint(SEIR, y0, t, args=(beta_true, gamma_true, sigma_true, N))[:, 2]
# 优化模型
beta_pred, gamma_pred, sigma_pred, y_pred = fit_SEIR(y0, t, N, y_true)
# 展示结果
plt.plot(t, y_true, label='True')
plt.plot(t, y_pred[:, 2], label='Predict')
plt.legend()
plt.show()
# 计算均方根误差
mse = mean_squared_error(y_true, y_pred[:, 2])
print('MSE:', mse)
```
在上面的代码中,我们首先定义了一个SEIR模型,它接收四个状态变量S、E、I、R和四个参数beta、gamma、sigma、N,然后返回每个状态变量的微分方程。接下来,我们使用梯度下降算法来优化模型参数,其中包括beta、gamma、sigma三个参数。在每个迭代中,我们计算预测值,并计算预测值与真实值之间的误差梯度,然后更新参数。最后,我们使用优化后的参数来重新计算预测值,并展示真实值与预测值之间的差异,并计算均方根误差作为评估指标。
阅读全文