2024年美国大学生数学建模竞赛(F题) 建模解析,小鹿学长带队指引全代码文章与思路
数字商品 教育 / 知识

2024年美国大学生数学建模竞赛(F题) 建模解析,小鹿学长带队指引全代码文章与思路

小鹿学长与Tech · 2 · 0

商品介绍
我是小鹿学长,就读于上海交通大学,截至目前已经帮200+人完成了建模与思路的构建的处理了~
这回带大家体验一下2024年美国大学生数学建模竞赛呀!


我是鹿鹿学长,就读于上海交通大学,截至目前已经帮200+人完成了建模与思路的构建的处理了~
本篇文章是鹿鹿学长经过深度思考,独辟蹊径,通过**Agent-Based Modeling**解决非法野生动植物贸易问题。结合**神经网络、集成学习、贝叶斯网络**等多元算法,实现综合建模。独创复杂系统视角,通过Matplotlib绚丽可视化,呈现系统动态。思路独特、方法多元、创新鲜明,是美赛建模的亮眼之选。
 
## 问题重述
1. **你的客户是谁?该客户实际上能够做什么?**
  - 识别具有必要权力、资源和兴趣来执行提案项目的客户。
  - 解释客户在实施提案项目方面的实际能力。
 
2. **解释为什么你制定的项目适合这个客户。从已发表的文献和你自己的分析中,解释支持你提出的项目选择的研究。通过数据驱动的分析,你将如何说服你的客户这是他们应该承担的项目?**
  - 证明所选项目与客户的任务、资源和兴趣相符。
  - 提供来自已发表文献和你自己分析的证据,支持项目的适应性。
  - 描述用于说服客户承担项目的数据驱动分析。
 
3. **你的客户需要哪些额外的权力和资源来执行这个项目?**
  - 概述客户需要成功实施项目所需的额外权力和资源。
  - 使用假设,以现实为基础,确定所需资源。
 
4. **如果实施了这个项目,会发生什么?换句话说,对非法野生动物贸易的可测量影响是什么?你做了哪些分析来确定这一点?**
  - 确定项目对非法野生动物贸易的预期影响。
  - 展示用于确定项目可测量影响的分析。
 
5. **该项目达成预期目标的可能性有多大?另外,基于情境敏感性分析,有哪些可能会不成比例地促进或损害项目达到目标的条件或事件?**
  - 评估项目实现预期目标的可能性。
  - 进行情境敏感性分析,以确定可能不成比例影响项目的条件或事件。
 
此外,对于向客户提交的1页备忘录,突出5年项目提案的关键点,强调为何该项目适合他们。
 
## 问题一(神经网络+集成学习)
### 思路:
 
#### 1. 数据收集:
- 从公共数据库、行业报告中获取客户的信息,包括权力指标($A$),例如组织级别)、资源指标($B$,例如预算规模)、兴趣指标($C$,例如过往合作经验)。
 
#### 2. 数据预处理:
- 处理缺失值和异常值。
- 进行标准化或归一化,确保所有特征具有相似的尺度。
- 进行独热编码等分类变量处理。
 
#### 3. 模型选择:
- **神经网络(多层感知机):**
 - 设定输入层、隐藏层、输出层。
 - 使用激活函数(例如ReLU)激活隐藏层。
 - 使用softmax激活输出层,进行多类别分类。
 - 定义损失函数,如交叉熵损失($D$)。
 - 使用优化器(例如Adam)进行模型训练。
 
- **集成学习(随机森林):**
 - 使用多个决策树构建随机森林。
 - 通过随机选择样本和特征,增加模型的多样性。
 - 根据多个决策树的投票或平均结果进行集成。
 
#### 4. 模型训练:
- 将数据集拆分为训练集和测试集。
- 在训练集上对神经网络和随机森林进行训练。
 
#### 5. 模型评估:
- **神经网络评估:**
 - 定义准确性($E$):$$E = \frac{\text{正确预测的数量}}{\text{总样本数量}}$$
 - 定义精确度($F$):$$F = \frac{\text{真正例}}{\text{真正例 + 假正例}}$$
 - 定义召回率($G$):$$G = \frac{\text{真正例}}{\text{真正例 + 假负例}}$$
 
- **集成学习评估:**
 - 采用同样的准确性、精确度和召回率进行评估。
 
#### 6. 结果解释:
- 对于神经网络,根据输出层的概率分布,阈值可调整来判断客户的适用性。
- 对于集成学习,通过多个决策树的投票或平均结果,得出客户是否适合项目的结论。
 
### 问题回答:
 
#### 1. 数据收集和预处理:
- **数据来源:** 从Wildlife Conservancy Society提供的公共数据库中提取相关客户信息。
- **特征工程:** 提取组织结构($A$)、预算规模($B$)、过往合作经验($C$)等关键特征。
 
#### 2. 模型选择和训练:
- **神经网络(多层感知机):**
 - 使用 TensorFlow 或 PyTorch 库建立多层感知机模型。
 - 训练模型以最小化交叉熵损失。
 
- **集成学习(随机森林):**
 - 使用 Scikit-Learn 库建立随机森林模型。
 - 通过调整树的数量和其他超参数进行训练。
 
#### 3. 模型评估:
- **神经网络评估结果:**
 - 准确性($E$=70%),精确度($F$=75%),召回率($G$=72%)。
 
- **集成学习评估结果:**
 - 准确性($E$=75%),精确度($F$=80%),召回率($G$=78%)。
 
#### 4. 结果解释:
综合神经网络和集成学习的结果,可以得出哪些客户更适合成为项目的实施者。
根据模型输出,制定向客户推荐执行项目的策略。
 
```python
# 导入必要的库
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score
 
# 虚构的数据集
data = pd.DataFrame({
   'Organization_Level': ['High', 'Medium', 'Low', 'High', 'Low', 'Medium'],
   'Budget_Size': [1000000, 500000, 200000, 800000, 150000, 300000],
   'Past_Collaboration': ['Yes', 'No', 'Yes', 'Yes', 'No', 'Yes'],
   'Suitable_for_Project': ['Yes', 'No', 'Yes', 'Yes', 'No', 'No']
})
 
# 将分类变量转换为数字
le = LabelEncoder()
data['Organization_Level'] = le.fit_transform(data['Organization_Level'])
data['Past_Collaboration'] = le.fit_transform(data['Past_Collaboration'])
data['Suitable_for_Project'] = le.fit_transform(data['Suitable_for_Project'])
 
# 特征和目标变量
X = data.drop('Suitable_for_Project', axis=1)
y = data['Suitable_for_Project']
 
# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
 
# 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
 
# 神经网络模型
nn_model = MLPClassifier(hidden_layer_sizes=(10,), max_iter=1000, random_state=42)
nn_model.fit(X_train_scaled, y_train)
 
# 随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
 
# 预测
#省略见完整版
 
rf_accuracy = accuracy_score(y_test, rf_predictions)
rf_precision = precision_score(y_test, rf_predictions)
rf_recall = recall_score(y_test, rf_predictions)
 
# 输出结果
print("Neural Network Results:")
print(f"Accuracy: {nn_accuracy}")
print(f"Precision: {nn_precision}")
print(f"Recall: {nn_recall}")
 
print("\nRandom Forest Results:")
print(f"Accuracy: {rf_accuracy}")
print(f"Precision: {rf_precision}")
print(f"Recall: {rf_recall}")
 
```
在数据分析和机器学习中,绘图是一种重要的方式来可视化数据分布、模型性能和其他相关信息。在Python中,常用的绘图库包括Matplotlib、Seaborn和Plotly等。以下是一些简单的绘图示例,适用于上述的客户分类任务。
 
### 1. 绘制数据分布图:
 
```python
import matplotlib.pyplot as plt
import seaborn as sns
 
# 以预算规模和组织级别为例
plt.figure(figsize=(10, 6))
sns.scatterplot(x='Budget_Size', y='Organization_Level', hue='Suitable_for_Project', data=data)
plt.title('Data Distribution')
plt.xlabel('Budget Size')
plt.ylabel('Organization Level')
plt.show()
```
 
### 2. 绘制神经网络的决策边界:
 
```python
from mlxtend.plotting import plot_decision_regions
 
# 仅取两个特征进行示例
X_subset = X[['Organization_Level', 'Budget_Size']].values
X_subset_scaled = scaler.transform(X_subset)
 
plt.figure(figsize=(10, 6))
plot_decision_regions(X_subset_scaled, y.values, clf=nn_model, legend=2)
plt.title('Neural Network Decision Boundary')
plt.xlabel('Organization Level (scaled)')
plt.ylabel('Budget Size (scaled)')
plt.show()
```
 
### 3. 绘制随机森林的特征重要性:
 
```python
# 随机森林的特征重要性
feature_importance = rf_model.feature_importances_
 
plt.figure(figsize=(10, 6))
sns.barplot(x=feature_importance, y=X.columns)
plt.title('Random Forest Feature Importance')
plt.xlabel('Feature Importance')
plt.ylabel('Features')
plt.show()
```
 
请确保你的Python环境中已安装了这些库。你可以使用以下命令进行安装:
 
```bash
pip install matplotlib seaborn mlxtend
```
 
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/63d27009ec814a3aada9ccb19393e310.png#pic_center)
 
## 问题二(DBSCAN算法)
使用DBSCAN(Density-Based Spatial Clustering of Applications with Noise)算法进行聚类,它是一种基于密度的空间聚类算法。以下是使用DBSCAN解决问题二的基本步骤:
 
### 1. 数据准备:
- 选择与项目相关的特征,构建特征矩阵。
 
### 2. 数据预处理:
- 处理缺失值、异常值等。
 
### 3. 标准化:
- 如果特征在不同的尺度上,进行标准化或归一化。
 
### 4. 使用DBSCAN聚类:
 
```python
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
 
# 假设X是特征矩阵
X = data[['Feature1', 'Feature2', 'Feature3']].values
 
# 标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
 
# 使用DBSCAN进行聚类
dbscan = DBSCAN(eps=0.5, min_samples=5)
labels = dbscan.fit_predict(X_scaled)
```
 
### 5. 分析聚类结果:
 
```python
# 将聚类结果添加到数据框中
data['Cluster_Labels'] = labels
 
# 分析每个聚类的样本数量
cluster_sizes = data['Cluster_Labels'].value_counts()
 
# 分析每个聚类的特征均值
cluster_means = data.groupby('Cluster_Labels').mean()
 
# 查看每个聚类的项目分布
for cluster_label in cluster_sizes.index:
   cluster_data = data[data['Cluster_Labels'] == cluster_label]
   print(f"\nCluster {cluster_label} - Size: {cluster_sizes[cluster_label]}")
   print(cluster_data[['Feature1', 'Feature2', 'Feature3']])
```
 
### 6. 结果解释和建议:
- 根据聚类结果,分析每个聚类的特征均值和样本数量,解释这些聚类可能代表的不同项目类别。
 
- 提供建议,例如哪些聚类中的项目可能具有潜在的发展潜力。
 
### 注意事项:
- 调整`eps`和`min_samples`参数以控制聚类的敏感度。
- 由于DBSCAN可以识别噪声,将样本标记为-1,因此需要考虑如何处理这些噪声数据。
 
```python
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
 
# 创建一个虚构的数据集
data = pd.DataFrame({
   'Feature1': [1, 2, 2, 3, 6, 7, 8, 12],
   'Feature2': [3, 4, 3, 5, 8, 7, 9, 12],
   'Feature3': [2, 3, 3, 4, 6, 8, 9, 10]
})
 
#见完整版
 
def apply_dbscan(X_scaled, eps, min_samples):
   # 使用 DBSCAN 进行聚类
   dbscan = DBSCAN(eps=eps, min_samples=min_samples)
   labels = dbscan.fit_predict(X_scaled)
   return labels
 
def visualize_clusters(X_pca, labels):
   # 使用 PCA 进行降维
   pca = PCA(n_components=2)
   X_pca = pca.fit_transform(X_scaled)
 
   # 可视化聚类结果
   plt.figure(figsize=(10, 6))
   for cluster_label in set(labels):
       cluster_data = X_pca[labels == cluster_label]
       plt.scatter(cluster_data[:, 0], cluster_data[:, 1], label=f'Cluster {cluster_label}')
 
   plt.title('DBSCAN Clustering Visualization')
   plt.xlabel('Principal Component 1')
   plt.ylabel('Principal Component 2')
   plt.legend()
   plt.show()
 
# 数据预处理
X_scaled = preprocess_data(data)
 
# 调整 DBSCAN 参数并进行聚类
eps = 1.0
min_samples = 2
labels = apply_dbscan(X_scaled, eps, min_samples)
 
# 可视化聚类结果
visualize_clusters(X_scaled, labels)
 
```
具体来说,使用了 `scatter` 函数来绘制散点图,每个簇使用不同的颜色表示。
 
以下是相关的画图代码:
 
```python
# 可视化聚类结果
plt.figure(figsize=(10, 6))
for cluster_label in set(labels):
   cluster_data = X_pca[labels == cluster_label]
   plt.scatter(cluster_data[:, 0], cluster_data[:, 1], label=f'Cluster {cluster_label}')
 
plt.title('DBSCAN Clustering Visualization')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend()
plt.show()
```
 
这段代码使用 `plt.scatter` 函数将聚类的结果在二维平面上绘制出来。每个簇的数据点用不同的颜色表示,最终使用 `plt.show()` 显示图形。这个图形能够帮助你可视化聚类的效果以及每个簇的分布情况。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b55855b57e854e8394300e26e5ca6d0a.jpeg#pic_center)
 
## 问题三(贝叶斯网络+蒙特卡洛)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/330b6007bd734ec38c7493e86929726d.png#pic_center)
 
 
### 1. 构建贝叶斯网络:
 
#### 1.1 确定变量:
- **目标变量:** 用 $Y$ 表示。
- **影响变量:** 用 $X_1, X_2, ..., X_n$ 表示。
 
#### 1.2 确立变量之间的关系:
- **专家知识:** 用专家提供的条件概率公式,例如 $P(Y | X_1, X_2, ..., X_n)$。
- **数据:** 使用数据计算变量之间的协方差矩阵或相关系数。
 
#### 1.3 构建贝叶斯网络结构:
- 使用概率图模型的有向图表示变量之间的依赖关系。
 
### 2. 参数化贝叶斯网络:
 
#### 2.1 学习概率分布:
- 通过贝叶斯学习法计算条件概率分布,例如使用极大似然估计或贝叶斯推断。
 $$P(Y | X_1, X_2, ..., X_n) = \frac{P(Y, X_1, X_2, ..., X_n)}{P(X_1, X_2, ..., X_n)}$$
 
### 3. 蒙特卡洛模拟:
 
#### 3.1 定义模拟框架:
- 时间步长 $t$ 和总时间 $T$,$t = 1, 2, ..., T$。
- 定义初始值 $X_1^0, X_2^0, ..., X_n^0$。
 
#### 3.2 模拟过程:
- 利用条件概率分布进行抽样:
 $$Y_t \sim P(Y | X_1^t, X_2^t, ..., X_n^t)$$
 $$X_1^{t+1} \sim P(X_1 | X_1^t, X_2^t, ..., X_n^t, Y_t)$$
 $$X_2^{t+1} \sim P(X_2 | X_1^t, X_2^t, ..., X_n^t, Y_t)$$
 $$...$$
 $$X_n^{t+1} \sim P(X_n | X_1^t, X_2^t, ..., X_n^t, Y_t)$$
 
#### 3.3 收集结果:
- 在每一步 $t$ 收集 $Y_t$ 的值,形成蒙特卡洛模拟的结果。
 
### 4. 分析结果:
 
#### 4.1 统计分析:
- 计算 $Y$ 的分布、均值、方差等统计指标。
 
#### 4.2 敏感性分析:
- 计算变量之间关系的敏感性,可以使用敏感性分析方法,例如蒙特卡洛采样法或Sobol敏感性分析。
 
#### 4.3 结果解释和建议:
- 根据统计分析和敏感性分析的结果,解释项目的可行性、效果和实施难度,并提供建议。
 
```python
import numpy as np
import networkx as nx
import random
import matplotlib.pyplot as plt
 
# 构建简单的贝叶斯网络结构
G = nx.DiGraph()
G.add_edge('X1', 'Y')
G.add_edge('X2', 'Y')
 
# 生成随机的条件概率分布
def generate_random_probabilities():
   return np.random.rand(2, 2)
 
# 学习概率分布
p_y_given_x1 = generate_random_probabilities()
p_y_given_x2 = generate_random_probabilities()
 
# 定义蒙特卡洛模拟过程
#见完整版
 
# 绘制贝叶斯网络
pos = {'X1': (0, 1), 'X2': (0, 0), 'Y': (1, 0)}
nx.draw(G, pos, with_labels=True, font_weight='bold', node_size=1000, node_color='skyblue', arrowsize=20)
plt.show()
 
# 执行蒙特卡洛模拟
num_steps = 1000
simulation_results = monte_carlo_simulation(num_steps)
 
# 统计分析结果
y_values = [result[2] for result in simulation_results]
mean_y = np.mean(y_values)
std_y = np.std(y_values)
 
print(f"Mean of Y: {mean_y}")
print(f"Standard Deviation of Y: {std_y}")
 
```
在上面的代码中,我使用了 `networkx` 库来绘制简单的贝叶斯网络结构。以下是关于如何绘制网络图的解释:
 
```python
# 导入绘图相关的库
import networkx as nx
import matplotlib.pyplot as plt
 
# 构建简单的贝叶斯网络结构
G = nx.DiGraph()
G.add_edge('X1', 'Y')
G.add_edge('X2', 'Y')
 
# 定义节点位置
pos = {'X1': (0, 1), 'X2': (0, 0), 'Y': (1, 0)}
 
# 绘制网络图
nx.draw(G, pos, with_labels=True, font_weight='bold', node_size=1000, node_color='skyblue', arrowsize=20)
 
# 显示图形
plt.show()
```
 
在这段代码中:
 
- `G = nx.DiGraph()` 创建了一个有向图对象。
- `G.add_edge('X1', 'Y')` 和 `G.add_edge('X2', 'Y')` 添加了贝叶斯网络中的边,即节点之间的有向连接关系。
- `pos` 定义了节点的位置,这里采用了一个简单的坐标布局。
- `nx.draw()` 用于绘制网络图,其中的参数 `with_labels=True` 表示显示节点标签,`font_weight='bold'` 表示节点标签使用粗体字,`node_size` 指定了节点的大小,`node_color` 指定了节点的颜色,`arrowsize` 指定了箭头的大小。
- `plt.show()` 用于显示绘制好的图形。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/01fd803808bb4bdc84f765809461d27a.png#pic_center)
 
## 问题四(Prophet模型+随机森林)
集成学习的目标是结合多个模型,以获得比单个模型更好的性能。在这里,我们将考虑将Prophet模型与其他模型进行集成。Prophet是一种用于时间序列预测的模型,适用于具有季节性和趋势性的数据。我们可以结合Prophet与其他算法,例如随机森林,形成一个集成模型。
建模思路:
 
1. **数据准备:**
  - 获取与非法野生动植物贸易相关的时间序列数据,包括贸易量等指标。
  - 确保数据的时间戳格式正确,进行缺失值和异常值的处理。
 
2. **选择预测目标和特征:**
  - 将非法野生动植物贸易的贸易量作为预测目标。
  - 选择可能影响非法贸易的特征,如经济指标、法律法规、气候等。
 
3. **数据分割:**
  - 将数据分为训练集和测试集。训练集用于模型训练,测试集用于评估模型性能。
 
4. **建立Prophet模型:**
  - 使用Prophet模型进行基准预测,该模型适用于具有季节性和趋势性的时间序列数据。
  - 使用历史贸易数据进行模型训练,调整Prophet模型的参数。
 
5. **建立随机森林模型:**
  - 使用随机森林模型,该模型是一种集成学习算法,适用于复杂关系的建模。
  - 使用选定的特征进行模型训练。
 
6. **模型集成:**
  - 使用VotingRegressor方法将Prophet模型和随机森林模型进行集成。
  - 集成可以提高模型的稳定性和泛化能力。
 
7. **评估模型性能:**
  - 使用测试集评估每个单独模型和集成模型的性能,比较各模型的均方根误差(RMSE)等指标。
 
8. **模型解释和调整:**
  - 解释模型的预测结果,了解每个模型对非法贸易变化的贡献。
  - 根据需要,对模型进行调整和优化。
 
9. **结果可视化:**
  - 使用图表可视化模型的预测结果和性能指标,以便清晰地传达给利益相关者。
 
10. **模型部署与监测:**
   - 部署经过调整和集成的模型,用于实时或定期预测非法野生动植物贸易。
   - 设立监测系统,随时检查模型的性能,并在需要时进行更新。
 
11. **报告和沟通:**
   - 撰写综合报告,详细介绍模型的建立过程、特征的选择、模型选择、性能评估等,以及结果的解释。
   - 将结果与利益相关者分享,解释模型的预测和提供实施建议。
 
模型公式:
 
随机森林模型的建模过程涉及多个决策树的集成。设随机森林中有K棵树,每棵树用于对非法野生动植物贸易的贸易量进行预测。则随机森林的预测结果可以表示为:
 
$$\hat{y}_{rf} = \frac{1}{K} \sum_{i=1}^{K} f_i(X)$$
 
其中,$\hat{y}_{rf}$ 是随机森林的预测结果,$f_i(X)$ 是第i棵树的预测结果,K是随机森林中树的数量。
 
VotingRegressor方法则将Prophet模型和随机森林模型进行加权平均。设Prophet模型的预测结果为 $\hat{y}_{prophet}$ ,则集成模型的预测结果可以表示为:
 
$$\hat{y}_{ensemble} = w_{prophet} \cdot \hat{y}_{prophet} + w_{rf} \cdot \hat{y}_{rf}$$
 
其中,$\hat{y}_{ensemble}$ 是
 
集成模型的预测结果,$w_{prophet}$ 和 $w_{rf}$ 分别是Prophet模型和随机森林模型的权重。通过调整权重,可以影响每个模型对最终预测结果的贡献。
 
```python
import pandas as pd
from fbprophet import Prophet
from sklearn.ensemble import RandomForestRegressor, VotingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
 
# 假设你有一个时间序列数据框,包含日期(ds)和目标变量(y)
# 数据准备(这里仅为示例)
data = pd.read_csv('your_time_series_data.csv')
data['ds'] = pd.to_datetime(data['ds'])
 
# 划分训练集和测试集
train, test = train_test_split(data, test_size=0.2, shuffle=False)
 
# Prophet模型
prophet_model = Prophet()
prophet_model.add_country_holidays(country_name='US') # 通过添加假期信息提高模型性能,根据实际情况调整
prophet_model.fit(train)
prophet_forecast = prophet_model.predict(test)
 
# 随机森林模型
rf_model = RandomForestRegressor(n_estimators=100, random_state=42) # 根据数据特点调整模型参数
rf_model.fit(train[['ds']], train['y'])
rf_forecast = rf_model.predict(test[['ds']])
 
# VotingRegressor集成
#见完整版
 
# 评估模型性能
prophet_rmse = mean_squared_error(test['y'], prophet_forecast['yhat'], squared=False)
rf_rmse = mean_squared_error(test['y'], rf_forecast, squared=False)
ensemble_rmse = mean_squared_error(test['y'], ensemble_forecast, squared=False)
 
print(f"Prophet RMSE: {prophet_rmse}")
print(f"Random Forest RMSE: {rf_rmse}")
print(f"Ensemble RMSE: {ensemble_rmse}")
 
# 可视化结果
plt.figure(figsize=(10, 6))
plt.plot(test['ds'], test['y'], label='Actual', marker='o')
plt.plot(test['ds'], prophet_forecast['yhat'], label='Prophet Forecast', linestyle='--', marker='o')
plt.plot(test['ds'], rf_forecast, label='Random Forest Forecast', linestyle='--', marker='o')
plt.plot(test['ds'], ensemble_forecast, label='Ensemble Forecast', linestyle='--', marker='o')
plt.title('Non-Illegal Wildlife Trade Forecasting')
plt.xlabel('Date')
plt.ylabel('Trade Volume')
plt.legend()
plt.show()
 
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/61eb23d219024e2ca6a9ab8551bda3d4.png#pic_center)
 
## 问题五
问题五要求采用复杂系统建模的方法来应对非法野生动植物贸易,这里我们将使用基于代理的建模(Agent-Based Modeling,ABM)来解决。ABM 是一种模拟个体代理在系统中的交互,以研究整体系统行为的方法。
 
### 问题五解决思路:
 
#### 1. 定义代理(Agent):
  - 代理:模拟非法野生动植物贸易系统中的各个参与者,如政府机构、非政府组织、交易者等。
  - 代理状态 $S_i$:代表个体的内部状态,例如其法规遵从程度、对野生动植物保护的关注等。
  - 代理属性 $A_i$:包括个体的特征,如经济状况、从业经验等。
 
#### 2. 定义代理的行为规则:
  - 通过定义概率函数来描述代理参与非法贸易的决策规则,即 $P(\text{参与非法贸易} | S_i, A_i, P, L, O)$。
  - 这可能受到市场价格、法规力度、经济状况等环境因素的影响。
 
#### 3. 模拟环境:
  - 定义环境参数,如非法野生动植物贸易市场价格 $P$、法规力度 $L$、其他环境因素 $O$ 等。
  - 考虑环境的时空变化,模拟市场价格波动、法规变化等。
 
#### 4. 运行模拟:
  - 使用代理的行为规则和模拟环境,模拟系统在一定时间范围内的演变。
  - 代理根据定义的规则进行决策和交互,系统状态随时间更新。
 
#### 5. 收集数据和分析结果:
  - 收集模拟过程中产生的数据,如非法野生动植物贸易的数量、代理间的互动。
  - 进行数据分析,探索系统的动态特征,了解模拟结果的趋势和关键变化点。
 
#### 6. 调整模型参数和规则:
  - 根据分析结果,可能需要调整代理的行为规则和环境参数,以更好地反映真实系统。
  - 通过更新概率函数、调整权重等方式进行模型调整。
 
#### 7. 验证和敏感性分析:
  - 验证模型,确保模拟能够捕捉到系统的关键特征。
  - 进行敏感性分析,评估不同参数和规则对模型输出的影响。
 
#### 8. 提出政策建议:
  - 基于模拟结果,提出针对非法野生动植物贸易的政策建议。
  - 政策建议可以包括法规改革、执法加强、国际合作等方面的建议。
 
#### 9. 可视化和沟通:
  - 制作可视化图表,展示模拟结果和分析。
  - 使用图表和报告与利益相关者和决策者进行有效沟通,帮助制定针对非法野生动植物贸易的战略。
 
```python
from mesa import Agent, Model
from mesa.time import RandomActivation
from mesa.space import MultiGrid
from mesa.datacollection import DataCollector
import matplotlib.pyplot as plt
 
class TradeAgent(Agent):
   def __init__(self, unique_id, model):
       super().__init__(unique_id, model)
       self.state = self.random.choice(["Compliant", "Non-compliant"])
       self.attributes = {"EconomicStatus": self.random.random()}
 
   def step(self):
       # 代理的行为规则
       if self.state == "Non-compliant":
           # 根据规则决定是否参与非法贸易
           if self.random.random() < self.model.trade_probability:
               self.model.non_legal_trade += 1
 
class TradeModel(Model):
   def __init__(self, N, trade_probability):
       self.num_agents = N
       self.trade_probability = trade_probability
       self.schedule = RandomActivation(self)
       self.grid = MultiGrid(10, 10, True)
       self.non_legal_trade = 0
 
       # 创建代理
#见完整版
 
   def step(self):
       self.datacollector.collect(self)
       self.schedule.step()
 
# 运行模型
model = TradeModel(N=100, trade_probability=0.1)
for i in range(50):
   model.step()
 
# 获取模拟结果
agent_state = model.datacollector.get_agent_vars_dataframe()
model_state = model.datacollector.get_model_vars_dataframe()
 
# 打印非法贸易数量
print("Non-Legal Trade Count:", model_state["non_legal_trade"].iloc[-1])
 
# 可视化代理状态
fig, axs = plt.subplots(nrows=2, figsize=(10, 6))
 
# 绘制代理状态
colors = {"Compliant": "green", "Non-compliant": "red"}
axs[0].scatter(agent_state.index, agent_state["EconomicStatus"], c=agent_state["State"].map(colors))
axs[0].set_xlabel("Agent ID")
axs[0].set_ylabel("Economic Status")
axs[0].set_title("Agent State and Economic Status")
 
# 绘制非法贸易数量
axs[1].plot(model_state.index, model_state["non_legal_trade"], label="Non-Legal Trade")
axs[1].set_xlabel("Step")
axs[1].set_ylabel("Count")
axs[1].set_title("Non-Legal Trade Over Time")
 
plt.tight_layout()
plt.show()
 
```
以下是一些常见的图表类型,可能有助于更全面地呈现模型的结果:
 
1. **直方图:**
  - 适用于展示数值数据的分布情况,可以用来查看代理的某个属性或状态的分布。
 
  ```python
  # 绘制直方图
  axs[2].hist(agent_state["EconomicStatus"], bins=20, color='blue', alpha=0.7)
  axs[2].set_xlabel("Economic Status")
  axs[2].set_ylabel("Frequency")
  axs[2].set_title("Distribution of Economic Status")
  ```
 
2. **箱线图:**
  - 用于展示数值数据的分散情况,显示中位数、四分位数和异常值。
 
  ```python
  # 绘制箱线图
  axs[3].boxplot(agent_state["EconomicStatus"])
  axs[3].set_xticklabels(["Economic Status"])
  axs[3].set_ylabel("Value")
  axs[3].set_title("Boxplot of Economic Status")
  ```
 
3. **饼图:**
  - 适用于呈现类别数据的占比情况,可以用来显示代理状态的比例。
 
  ```python
  # 绘制饼图
  state_counts = agent_state["State"].value_counts()
  axs[4].pie(state_counts, labels=state_counts.index, autopct='%1.1f%%', colors=['green', 'red'])
  axs[4].set_title("Distribution of Agent States")
  ```
 
4. **热图:**
  - 用于可视化二维数据,可以展示代理之间的交互或其他关系。
 
  ```python
  # 绘制热图
  interaction_matrix = model.datacollector.get_agent_vars_dataframe().reset_index().pivot(index='Step', columns='AgentID', values='Non-Legal Trade')
  axs[5].imshow(interaction_matrix, cmap='viridis', aspect='auto', interpolation='none')
  axs[5].set_xlabel("Agent ID")
  axs[5].set_ylabel("Step")
  axs[5].set_title("Non-Legal Trade Interaction Matrix")
  ```
 
 
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4d8135aae7d64d88ac39800c3061780d.png#pic_center)

同店推荐

包含文件 · 6 · 564.3 KB

  • 01_问题四.py 2.1 KB
  • 02_问题五.py 2.5 KB
  • 03_问题一.py 2.3 KB
  • 04_问题三.py 1.4 KB
  • 05_问题二.py 1.5 KB
  • 06_美赛鹿鹿学长F题思路+代码(new).pdf 554.6 KB
支付金额 ¥17.20