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

相关文章

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona