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 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 函数来绘制散点图,每个簇使用不同的颜色表示。

以下是相关的画图代码:

# 可视化聚类结果
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 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. 直方图:

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

在这里插入图片描述

更多内容可以点击下方名片详细了解,让小鹿学长带你冲刺美赛夺奖之路!
敬请期待我们的努力所做出的工作!记得关注 鹿鹿学长呀!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/367554.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端工程化之:webpack1-13(内置插件)

目录 一、内置插件 1.DefinePlugin 2.BannerPlugin 3.ProvidePlugin 一、内置插件 所有的 webpack 内置插件都作为 webpack 的静态属性存在的&#xff0c;使用下面的方式即可创建一个插件对象&#xff1a; const webpack require("webpack")new webpack.插件…

影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)

电影院订票选座小程序目录 目录 基于微信小程序的电影院购票系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能实现 2、管理员功能实现 &#xff08;1&#xff09;影院信息管理 &#xff08;2&#xff09;电影信息管理 &#xff08;3&#xff09;已…

电源芯片并联使用-AMS1117

自记&#xff1a; 电源芯片可不可以并联使用&#xff1a; 1.按照正规大厂Rohm的技术文档介绍&#xff0c;直接并联的两个LDO&#xff0c;只要其输出电压有很小的差异&#xff0c;就会造成电流分配的很大差异。 至于你长期使用没有发现问题&#xff0c;那可能是总电流的余量留…

蓝桥杯---煤球数目

有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 代码 pu…

Ingress

文章目录 环境准备什么是 Ingress认识 Ingress 资源Ingress 控制器(controller)Ingress 规则pathType 路径类型多重匹配Ingress 类TLS生成证书创建密钥 环境准备 下面的 yaml 文件内容&#xff0c;是使用 sts 创建两个 web 服务&#xff0c;并配置对应的 servcie。web 服务的首…

【JavaScript】前端攻击

前端攻击 1. CSRF的基本概念、缩写、全称 CSRF&#xff08;Cross-site request forgery&#xff09;&#xff1a;跨站请求伪造。 从上图可以看出&#xff0c;要完成一次CSRF攻击&#xff0c;受害者必须满足两个必要的条件&#xff1a; 登录受信任网站A&#xff0c;并在本地生…

【疑问】为什么声明和定义要分离

前言 我们在学习的时候接触过一个话&#xff1a;编写自定义函数的时候 要做到声明和定义分离 那么为什么呢 今天就来简单的了解一下 疑问&#xff1a;错误的发生 下面给出两个源文件和一个头文件以及报错信息 text.cc文件 #include"head.h"int main() {int a 1…

深入理解指针(3)

⽬录 1. 字符指针变量 2. 数组指针变量 3. ⼆维数组传参的本质 4. 函数指针变量 5. 函数指针数组 6. 转移表 1. 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; ⼀般使⽤: int main() {char ch w;char *pc &ch;*pc w;return 0; } 还有…

C++类和对象入门(二)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、类的作用域 类定义了一个新的作用域&#xff0c;类的所有成员都在类的作用域中。在类体外定义成员时&#xff0c;需要…

云服务器安全组、防火墙、端口问题,结合telnet解决项目部署无法访问

无论是运维还是后台亲自操刀在云服务器上部署项目&#xff0c;往往会遇到项目部署上去了&#xff0c;也确定项目正常运行&#xff0c;但还是没法访问的问题。 如果没有经验的小伙伴&#xff0c;很容易陷入疑惑的状态&#xff0c;无从下手解决。 其实这涉及到云平台安全组、服…

idea创建sping项目

一、环境 window10 IDEA 2022.2.3 maven-3.8.6 二、创建sping项目 1、新建Maven项目 File -> New -> Project 然后如下图选中Maven Archetype&#xff0c;在Archetype&#xff0c;选中maven-archetype-webapp&#xff0c;点击Create 2、配置maven 默认是使用IDEA内置…

《Pandas 简易速速上手小册》第9章:Pandas 数据可视化(2024 最新版)

文章目录 9.1 Pandas 内置可视化工具9.1.1 基础知识9.1.2 重点案例&#xff1a;销售数据分析9.1.3 拓展案例一&#xff1a;产品评价统计9.1.4 拓展案例二&#xff1a;员工满意度分布 9.2 与 Matplotlib 和 Seaborn 集成9.2.1 基础知识9.2.2 重点案例&#xff1a;销售趋势分析9.…

性能测试常用术语

之前在性能测试过程中&#xff0c;对于某些其中的术语一知半解&#xff0c;导致踩了很多坑。这篇博客&#xff0c;就常见的一些性能测试术语进行一次浅析。。。 负载 对被测系统不断施加压力&#xff0c;直到性能指标超过预期或某项资源使用达到饱和&#xff0c;以验证系统的处…

Linux Zip解压缩命令

Zip 用法 $ zip [-选项] [-b 路径] [-t 日期] [-n 后缀名] [压缩文件列表] [-xi 列表] 默认操作是添加或替换压缩文件列表中的压缩文件条目&#xff0c;压缩文件列表可以包括特殊名称 -&#xff0c;压缩标准输入数据 Zip 是一个创建和管理 zip 文件的压缩工具 Unzip 是一个用…

关于java的异常处理

关于java的异常处理 我们在上一篇文章中&#xff0c;对java中的异常有了一个初步的了解&#xff0c;本篇文章我们来了解一下异常的处理机制&#xff0c;如何抛出异常&#xff0c;如何捕捉异常&#x1f600; 关于java的异常 一、异常类型等级 二、关键字 trycatchfinallythr…

Opencv——图片卷积

图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二…

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤&#xff1a; 开机&#xff0c;指示灯亮起后(需要灯闪烁3下后)&#xff0c;需在3s内&#xff08;超过3s则会正常启动&#xff09;&#xff0c;按一下按键&#xff08;注&#xff1a;切…

算法41:掉落的方块(力扣699题)----线段树

题目&#xff1a;https://leetcode.cn/problems/falling-squares/description/ 在二维平面上的 x 轴上&#xff0c;放置着一些方块。 给你一个二维整数数组 positions &#xff0c;其中 positions[i] [lefti, sideLengthi] 表示&#xff1a;第 i 个方块边长为 sideLengthi &…

【蓝桥杯冲冲冲】[NOIP2001 普及组] 装箱问题

蓝桥杯备赛 | 洛谷做题打卡day26 文章目录 蓝桥杯备赛 | 洛谷做题打卡day26题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 [NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V&#xff0c;同时有 n n n 个物品&#xff0c;每…