本文主要是介绍2024年美国大学生数学建模竞赛(F题)减少非法野生动物贸易|ABM/神经网络建模解析,小鹿学长带队指引全代码文章与思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我是鹿鹿学长,就读于上海交通大学,截至目前已经帮200+人完成了建模与思路的构建的处理了~
本篇文章是鹿鹿学长经过深度思考,独辟蹊径,通过Agent-Based Modeling解决非法野生动植物贸易问题。结合神经网络、集成学习、贝叶斯网络等多元算法,实现综合建模。独创复杂系统视角,通过Matplotlib绚丽可视化,呈现系统动态。思路独特、方法多元、创新鲜明,是美赛建模的亮眼之选。
完整内容可以在文章末尾领取!
问题重述
-
你的客户是谁?该客户实际上能够做什么?
- 识别具有必要权力、资源和兴趣来执行提案项目的客户。
- 解释客户在实施提案项目方面的实际能力。
-
解释为什么你制定的项目适合这个客户。从已发表的文献和你自己的分析中,解释支持你提出的项目选择的研究。通过数据驱动的分析,你将如何说服你的客户这是他们应该承担的项目?
- 证明所选项目与客户的任务、资源和兴趣相符。
- 提供来自已发表文献和你自己分析的证据,支持项目的适应性。
- 描述用于说服客户承担项目的数据驱动分析。
-
你的客户需要哪些额外的权力和资源来执行这个项目?
- 概述客户需要成功实施项目所需的额外权力和资源。
- 使用假设,以现实为基础,确定所需资源。
-
如果实施了这个项目,会发生什么?换句话说,对非法野生动物贸易的可测量影响是什么?你做了哪些分析来确定这一点?
- 确定项目对非法野生动物贸易的预期影响。
- 展示用于确定项目可测量影响的分析。
-
该项目达成预期目标的可能性有多大?另外,基于情境敏感性分析,有哪些可能会不成比例地促进或损害项目达到目标的条件或事件?
- 评估项目实现预期目标的可能性。
- 进行情境敏感性分析,以确定可能不成比例影响项目的条件或事件。
此外,对于向客户提交的1页备忘录,突出5年项目提案的关键点,强调为何该项目适合他们。
问题一(神经网络+集成学习)
思路:
1. 数据收集:
- 从公共数据库、行业报告中获取客户的信息,包括权力指标( A A A),例如组织级别)、资源指标( B B B,例如预算规模)、兴趣指标( C C C,例如过往合作经验)。
2. 数据预处理:
- 处理缺失值和异常值。
- 进行标准化或归一化,确保所有特征具有相似的尺度。
- 进行独热编码等分类变量处理。
3. 模型选择:
-
神经网络(多层感知机):
- 设定输入层、隐藏层、输出层。
- 使用激活函数(例如ReLU)激活隐藏层。
- 使用softmax激活输出层,进行多类别分类。
- 定义损失函数,如交叉熵损失( D D D)。
- 使用优化器(例如Adam)进行模型训练。
-
集成学习(随机森林):
- 使用多个决策树构建随机森林。
- 通过随机选择样本和特征,增加模型的多样性。
- 根据多个决策树的投票或平均结果进行集成。
4. 模型训练:
- 将数据集拆分为训练集和测试集。
- 在训练集上对神经网络和随机森林进行训练。
5. 模型评估:
-
神经网络评估:
- 定义准确性( E E E): E = 正确预测的数量 总样本数量 E = \frac{\text{正确预测的数量}}{\text{总样本数量}} E=总样本数量正确预测的数量
- 定义精确度( F F F): F = 真正例 真正例 + 假正例 F = \frac{\text{真正例}}{\text{真正例 + 假正例}} F=真正例 + 假正例真正例
- 定义召回率( G G G): G = 真正例 真正例 + 假负例 G = \frac{\text{真正例}}{\text{真正例 + 假负例}} G=真正例 + 假负例真正例
-
集成学习评估:
- 采用同样的准确性、精确度和召回率进行评估。
6. 结果解释:
- 对于神经网络,根据输出层的概率分布,阈值可调整来判断客户的适用性。
- 对于集成学习,通过多个决策树的投票或平均结果,得出客户是否适合项目的结论。
问题回答:
1. 数据收集和预处理:
- 数据来源: 从Wildlife Conservancy Society提供的公共数据库中提取相关客户信息。
- 特征工程: 提取组织结构( A A A)、预算规模( B B B)、过往合作经验( C C C)等关键特征。
2. 模型选择和训练:
-
神经网络(多层感知机):
- 使用 TensorFlow 或 PyTorch 库建立多层感知机模型。
- 训练模型以最小化交叉熵损失。
-
集成学习(随机森林):
- 使用 Scikit-Learn 库建立随机森林模型。
- 通过调整树的数量和其他超参数进行训练。
3. 模型评估:
-
神经网络评估结果:
- 准确性( E E E=70%),精确度( F F F=75%),召回率( G G G=72%)。
-
集成学习评估结果:
- 准确性( E E E=75%),精确度( F F F=80%),召回率( G G G=78%)。
4. 结果解释:
综合神经网络和集成学习的结果,可以得出哪些客户更适合成为项目的实施者。
根据模型输出,制定向客户推荐执行项目的策略。
# 导入必要的库
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. 绘制数据分布图:
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. 绘制神经网络的决策边界:
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. 绘制随机森林的特征重要性:
# 随机森林的特征重要性
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环境中已安装了这些库。你可以使用以下命令进行安装:
pip install matplotlib seaborn mlxtend
问题二(DBSCAN算法)
使用DBSCAN(Density-Based Spatial Clustering of Applications with Noise)算法进行聚类,它是一种基于密度的空间聚类算法。以下是使用DBSCAN解决问题二的基本步骤:
1. 数据准备:
- 选择与项目相关的特征,构建特征矩阵。
2. 数据预处理:
- 处理缺失值、异常值等。
3. 标准化:
- 如果特征在不同的尺度上,进行标准化或归一化。
4. 使用DBSCAN聚类:
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. 分析聚类结果:
# 将聚类结果添加到数据框中
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,因此需要考虑如何处理这些噪声数据。
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 labelsdef 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
函数来绘制散点图,每个簇使用不同的颜色表示。
以下是相关的画图代码:
# 可视化聚类结果
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()
显示图形。这个图形能够帮助你可视化聚类的效果以及每个簇的分布情况。
问题三(贝叶斯网络+蒙特卡洛)
1. 构建贝叶斯网络:
1.1 确定变量:
- 目标变量: 用 Y Y Y 表示。
- 影响变量: 用 X 1 , X 2 , . . . , X n X_1, X_2, ..., X_n X1,X2,...,Xn 表示。
1.2 确立变量之间的关系:
- 专家知识: 用专家提供的条件概率公式,例如 P ( Y ∣ X 1 , X 2 , . . . , X n ) P(Y | X_1, X_2, ..., X_n) P(Y∣X1,X2,...,Xn)。
- 数据: 使用数据计算变量之间的协方差矩阵或相关系数。
1.3 构建贝叶斯网络结构:
- 使用概率图模型的有向图表示变量之间的依赖关系。
2. 参数化贝叶斯网络:
2.1 学习概率分布:
- 通过贝叶斯学习法计算条件概率分布,例如使用极大似然估计或贝叶斯推断。
P ( Y ∣ X 1 , X 2 , . . . , X n ) = P ( Y , X 1 , X 2 , . . . , X n ) P ( X 1 , X 2 , . . . , X n ) P(Y | X_1, X_2, ..., X_n) = \frac{P(Y, X_1, X_2, ..., X_n)}{P(X_1, X_2, ..., X_n)} P(Y∣X1,X2,...,Xn)=P(X1,X2,...,Xn)P(Y,X1,X2,...,Xn)
3. 蒙特卡洛模拟:
3.1 定义模拟框架:
- 时间步长 t t t 和总时间 T T T, t = 1 , 2 , . . . , T t = 1, 2, ..., T t=1,2,...,T。
- 定义初始值 X 1 0 , X 2 0 , . . . , X n 0 X_1^0, X_2^0, ..., X_n^0 X10,X20,...,Xn0。
3.2 模拟过程:
- 利用条件概率分布进行抽样:
Y t ∼ P ( Y ∣ X 1 t , X 2 t , . . . , X n t ) Y_t \sim P(Y | X_1^t, X_2^t, ..., X_n^t) Yt∼P(Y∣X1t,X2t,...,Xnt)
X 1 t + 1 ∼ P ( X 1 ∣ X 1 t , X 2 t , . . . , X n t , Y t ) X_1^{t+1} \sim P(X_1 | X_1^t, X_2^t, ..., X_n^t, Y_t) X1t+1∼P(X1∣X1t,X2t,...,Xnt,Yt)
X 2 t + 1 ∼ P ( X 2 ∣ 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) X2t+1∼P(X2∣X1t,X2t,...,Xnt,Yt)
. . . ... ...
X n t + 1 ∼ P ( X n ∣ 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) Xnt+1∼P(Xn∣X1t,X2t,...,Xnt,Yt)
3.3 收集结果:
- 在每一步 t t t 收集 Y t Y_t Yt 的值,形成蒙特卡洛模拟的结果。
4. 分析结果:
4.1 统计分析:
- 计算 Y Y Y 的分布、均值、方差等统计指标。
4.2 敏感性分析:
- 计算变量之间关系的敏感性,可以使用敏感性分析方法,例如蒙特卡洛采样法或Sobol敏感性分析。
4.3 结果解释和建议:
- 根据统计分析和敏感性分析的结果,解释项目的可行性、效果和实施难度,并提供建议。
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
库来绘制简单的贝叶斯网络结构。以下是关于如何绘制网络图的解释:
# 导入绘图相关的库
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()
用于显示绘制好的图形。
问题四(Prophet模型+随机森林)
集成学习的目标是结合多个模型,以获得比单个模型更好的性能。在这里,我们将考虑将Prophet模型与其他模型进行集成。Prophet是一种用于时间序列预测的模型,适用于具有季节性和趋势性的数据。我们可以结合Prophet与其他算法,例如随机森林,形成一个集成模型。
建模思路:
-
数据准备:
- 获取与非法野生动植物贸易相关的时间序列数据,包括贸易量等指标。
- 确保数据的时间戳格式正确,进行缺失值和异常值的处理。
-
选择预测目标和特征:
- 将非法野生动植物贸易的贸易量作为预测目标。
- 选择可能影响非法贸易的特征,如经济指标、法律法规、气候等。
-
数据分割:
- 将数据分为训练集和测试集。训练集用于模型训练,测试集用于评估模型性能。
-
建立Prophet模型:
- 使用Prophet模型进行基准预测,该模型适用于具有季节性和趋势性的时间序列数据。
- 使用历史贸易数据进行模型训练,调整Prophet模型的参数。
-
建立随机森林模型:
- 使用随机森林模型,该模型是一种集成学习算法,适用于复杂关系的建模。
- 使用选定的特征进行模型训练。
-
模型集成:
- 使用VotingRegressor方法将Prophet模型和随机森林模型进行集成。
- 集成可以提高模型的稳定性和泛化能力。
-
评估模型性能:
- 使用测试集评估每个单独模型和集成模型的性能,比较各模型的均方根误差(RMSE)等指标。
-
模型解释和调整:
- 解释模型的预测结果,了解每个模型对非法贸易变化的贡献。
- 根据需要,对模型进行调整和优化。
-
结果可视化:
- 使用图表可视化模型的预测结果和性能指标,以便清晰地传达给利益相关者。
-
模型部署与监测:
- 部署经过调整和集成的模型,用于实时或定期预测非法野生动植物贸易。
- 设立监测系统,随时检查模型的性能,并在需要时进行更新。
-
报告和沟通:
- 撰写综合报告,详细介绍模型的建立过程、特征的选择、模型选择、性能评估等,以及结果的解释。
- 将结果与利益相关者分享,解释模型的预测和提供实施建议。
模型公式:
随机森林模型的建模过程涉及多个决策树的集成。设随机森林中有K棵树,每棵树用于对非法野生动植物贸易的贸易量进行预测。则随机森林的预测结果可以表示为:
y ^ r f = 1 K ∑ i = 1 K f i ( X ) \hat{y}_{rf} = \frac{1}{K} \sum_{i=1}^{K} f_i(X) y^rf=K1i=1∑Kfi(X)
其中, y ^ r f \hat{y}_{rf} y^rf 是随机森林的预测结果, f i ( X ) f_i(X) fi(X) 是第i棵树的预测结果,K是随机森林中树的数量。
VotingRegressor方法则将Prophet模型和随机森林模型进行加权平均。设Prophet模型的预测结果为 y ^ p r o p h e t \hat{y}_{prophet} y^prophet ,则集成模型的预测结果可以表示为:
y ^ e n s e m b l e = w p r o p h e t ⋅ y ^ p r o p h e t + w r f ⋅ y ^ r f \hat{y}_{ensemble} = w_{prophet} \cdot \hat{y}_{prophet} + w_{rf} \cdot \hat{y}_{rf} y^ensemble=wprophet⋅y^prophet+wrf⋅y^rf
其中, y ^ e n s e m b l e \hat{y}_{ensemble} y^ensemble 是
集成模型的预测结果, w p r o p h e t w_{prophet} wprophet 和 w r f w_{rf} wrf 分别是Prophet模型和随机森林模型的权重。通过调整权重,可以影响每个模型对最终预测结果的贡献。
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()
问题五
问题五要求采用复杂系统建模的方法来应对非法野生动植物贸易,这里我们将使用基于代理的建模(Agent-Based Modeling,ABM)来解决。ABM 是一种模拟个体代理在系统中的交互,以研究整体系统行为的方法。
问题五解决思路:
1. 定义代理(Agent):
- 代理:模拟非法野生动植物贸易系统中的各个参与者,如政府机构、非政府组织、交易者等。
- 代理状态 S i S_i Si:代表个体的内部状态,例如其法规遵从程度、对野生动植物保护的关注等。
- 代理属性 A i A_i Ai:包括个体的特征,如经济状况、从业经验等。
2. 定义代理的行为规则:
- 通过定义概率函数来描述代理参与非法贸易的决策规则,即 P ( 参与非法贸易 ∣ S i , A i , P , L , O ) P(\text{参与非法贸易} | S_i, A_i, P, L, O) P(参与非法贸易∣Si,Ai,P,L,O)。
- 这可能受到市场价格、法规力度、经济状况等环境因素的影响。
3. 模拟环境:
- 定义环境参数,如非法野生动植物贸易市场价格 P P P、法规力度 L L L、其他环境因素 O O O 等。
- 考虑环境的时空变化,模拟市场价格波动、法规变化等。
4. 运行模拟:
- 使用代理的行为规则和模拟环境,模拟系统在一定时间范围内的演变。
- 代理根据定义的规则进行决策和交互,系统状态随时间更新。
5. 收集数据和分析结果:
- 收集模拟过程中产生的数据,如非法野生动植物贸易的数量、代理间的互动。
- 进行数据分析,探索系统的动态特征,了解模拟结果的趋势和关键变化点。
6. 调整模型参数和规则:
- 根据分析结果,可能需要调整代理的行为规则和环境参数,以更好地反映真实系统。
- 通过更新概率函数、调整权重等方式进行模型调整。
7. 验证和敏感性分析:
- 验证模型,确保模拟能够捕捉到系统的关键特征。
- 进行敏感性分析,评估不同参数和规则对模型输出的影响。
8. 提出政策建议:
- 基于模拟结果,提出针对非法野生动植物贸易的政策建议。
- 政策建议可以包括法规改革、执法加强、国际合作等方面的建议。
9. 可视化和沟通:
- 制作可视化图表,展示模拟结果和分析。
- 使用图表和报告与利益相关者和决策者进行有效沟通,帮助制定针对非法野生动植物贸易的战略。
from mesa import Agent, Model
from mesa.time import RandomActivation
from mesa.space import MultiGrid
from mesa.datacollection import DataCollector
import matplotlib.pyplot as pltclass 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 += 1class TradeModel(Model):def __init__(self, N, trade_probability):self.num_agents = Nself.trade_probability = trade_probabilityself.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()
以下是一些常见的图表类型,可能有助于更全面地呈现模型的结果:
-
直方图:
- 适用于展示数值数据的分布情况,可以用来查看代理的某个属性或状态的分布。
# 绘制直方图 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")
-
箱线图:
- 用于展示数值数据的分散情况,显示中位数、四分位数和异常值。
# 绘制箱线图 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")
-
饼图:
- 适用于呈现类别数据的占比情况,可以用来显示代理状态的比例。
# 绘制饼图 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")
-
热图:
- 用于可视化二维数据,可以展示代理之间的交互或其他关系。
# 绘制热图 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")
更多内容可以点击下方名片详细了解,让小鹿学长带你冲刺美赛夺奖之路!
敬请期待我们的努力所做出的工作!记得关注 鹿鹿学长呀!
这篇关于2024年美国大学生数学建模竞赛(F题)减少非法野生动物贸易|ABM/神经网络建模解析,小鹿学长带队指引全代码文章与思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!