2024年美国大学生数学建模竞赛(F题)减少非法野生动物贸易|ABM/神经网络建模解析,小鹿学长带队指引全代码文章与思路

本文主要是介绍2024年美国大学生数学建模竞赛(F题)减少非法野生动物贸易|ABM/神经网络建模解析,小鹿学长带队指引全代码文章与思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我是鹿鹿学长,就读于上海交通大学,截至目前已经帮200+人完成了建模与思路的构建的处理了~
本篇文章是鹿鹿学长经过深度思考,独辟蹊径,通过Agent-Based Modeling解决非法野生动植物贸易问题。结合神经网络、集成学习、贝叶斯网络等多元算法,实现综合建模。独创复杂系统视角,通过Matplotlib绚丽可视化,呈现系统动态。思路独特、方法多元、创新鲜明,是美赛建模的亮眼之选。
完整内容可以在文章末尾领取!
在这里插入图片描述

问题重述

  1. 你的客户是谁?该客户实际上能够做什么?

    • 识别具有必要权力、资源和兴趣来执行提案项目的客户。
    • 解释客户在实施提案项目方面的实际能力。
  2. 解释为什么你制定的项目适合这个客户。从已发表的文献和你自己的分析中,解释支持你提出的项目选择的研究。通过数据驱动的分析,你将如何说服你的客户这是他们应该承担的项目?

    • 证明所选项目与客户的任务、资源和兴趣相符。
    • 提供来自已发表文献和你自己分析的证据,支持项目的适应性。
    • 描述用于说服客户承担项目的数据驱动分析。
  3. 你的客户需要哪些额外的权力和资源来执行这个项目?

    • 概述客户需要成功实施项目所需的额外权力和资源。
    • 使用假设,以现实为基础,确定所需资源。
  4. 如果实施了这个项目,会发生什么?换句话说,对非法野生动物贸易的可测量影响是什么?你做了哪些分析来确定这一点?

    • 确定项目对非法野生动物贸易的预期影响。
    • 展示用于确定项目可测量影响的分析。
  5. 该项目达成预期目标的可能性有多大?另外,基于情境敏感性分析,有哪些可能会不成比例地促进或损害项目达到目标的条件或事件?

    • 评估项目实现预期目标的可能性。
    • 进行情境敏感性分析,以确定可能不成比例影响项目的条件或事件。

此外,对于向客户提交的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. 结果解释和建议:

  • 根据聚类结果,分析每个聚类的特征均值和样本数量,解释这些聚类可能代表的不同项目类别。

  • 提供建议,例如哪些聚类中的项目可能具有潜在的发展潜力。

注意事项:

  • 调整epsmin_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(YX1,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(YX1,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) YtP(YX1t,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+1P(X1X1t,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+1P(X2X1t,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+1P(XnX1t,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与其他算法,例如随机森林,形成一个集成模型。
建模思路:

  1. 数据准备:

    • 获取与非法野生动植物贸易相关的时间序列数据,包括贸易量等指标。
    • 确保数据的时间戳格式正确,进行缺失值和异常值的处理。
  2. 选择预测目标和特征:

    • 将非法野生动植物贸易的贸易量作为预测目标。
    • 选择可能影响非法贸易的特征,如经济指标、法律法规、气候等。
  3. 数据分割:

    • 将数据分为训练集和测试集。训练集用于模型训练,测试集用于评估模型性能。
  4. 建立Prophet模型:

    • 使用Prophet模型进行基准预测,该模型适用于具有季节性和趋势性的时间序列数据。
    • 使用历史贸易数据进行模型训练,调整Prophet模型的参数。
  5. 建立随机森林模型:

    • 使用随机森林模型,该模型是一种集成学习算法,适用于复杂关系的建模。
    • 使用选定的特征进行模型训练。
  6. 模型集成:

    • 使用VotingRegressor方法将Prophet模型和随机森林模型进行集成。
    • 集成可以提高模型的稳定性和泛化能力。
  7. 评估模型性能:

    • 使用测试集评估每个单独模型和集成模型的性能,比较各模型的均方根误差(RMSE)等指标。
  8. 模型解释和调整:

    • 解释模型的预测结果,了解每个模型对非法贸易变化的贡献。
    • 根据需要,对模型进行调整和优化。
  9. 结果可视化:

    • 使用图表可视化模型的预测结果和性能指标,以便清晰地传达给利益相关者。
  10. 模型部署与监测:

    • 部署经过调整和集成的模型,用于实时或定期预测非法野生动植物贸易。
    • 设立监测系统,随时检查模型的性能,并在需要时进行更新。
  11. 报告和沟通:

    • 撰写综合报告,详细介绍模型的建立过程、特征的选择、模型选择、性能评估等,以及结果的解释。
    • 将结果与利益相关者分享,解释模型的预测和提供实施建议。

模型公式:

随机森林模型的建模过程涉及多个决策树的集成。设随机森林中有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=1Kfi(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=wprophety^prophet+wrfy^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()

以下是一些常见的图表类型,可能有助于更全面地呈现模型的结果:

  1. 直方图:

    • 适用于展示数值数据的分布情况,可以用来查看代理的某个属性或状态的分布。
    # 绘制直方图
    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. 箱线图:

    • 用于展示数值数据的分散情况,显示中位数、四分位数和异常值。
    # 绘制箱线图
    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. 饼图:

    • 适用于呈现类别数据的占比情况,可以用来显示代理状态的比例。
    # 绘制饼图
    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. 热图:

    • 用于可视化二维数据,可以展示代理之间的交互或其他关系。
    # 绘制热图
    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/神经网络建模解析,小鹿学长带队指引全代码文章与思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674677

相关文章

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...