2023年第四届MathorCup大数据竞赛(A题)|坑洼道路检测和识别|数学建模完整代码+建模过程全解全析

news2024/12/15 15:30:43

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2021年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。

希望这些想法对大家的做题有一定的启发和借鉴意义。
让我们来看看MathorCup的A题!
在这里插入图片描述

问题重述:

问题1:图像特征提取和模型建立

题目要求建立一个高识别准确度、快速的模型,能够识别道路图像是正常的还是坑洼的。具体步骤包括:

  1. 解压data.zip,准备训练数据。
  2. 对图像进行预处理,如调整尺寸和数据增强。
  3. 使用深度学习模型提取图像特征。
  4. 构建一个分类模型,将特征转化为更容易分类的表示形式。
  5. 使用训练数据训练模型。

问题2:模型评估

题目要求对模型进行评估,从不同维度考察其性能。评估指标可能包括准确率、召回率、精确度、F1分数等,以及绘制ROC曲线和AUC。

问题3:测试集识别
题目求使用已经训练好的模型对未标记的测试数据集(在竞赛结束前48小时公布下载链接)中的图像进行坑洼识别。将识别结果以特定格式填写到test result.csv中,并将该文件提交以供评估。

问题一

问题一的具体建模思路通常基于深度学习方法,在这里我们使用卷积神经网络(CNN)。

  1. 数据准备

    • 将数据集划分为训练集和验证集,以用于模型训练和评估。
  2. 图像预处理

    • 调整图像大小为固定尺寸,如 224 × 224 224\times224 224×224
    • 数据增强:对训练图像进行数据增强,包括旋转、翻转、缩放和亮度调整等。
  3. 特征提取

    • 使用一个预训练的卷积神经网络(如ResNet、VGG、或MobileNet)来提取图像特征。这些模型通常包含卷积层,用于捕获图像的特征。
    • 在模型的前几层,特征图会被提取出来。
  4. 模型构建

    • 添加一个或多个全连接层,用于将提取的特征转换为最终的分类输出。
    • 使用sigmoid激活函数来输出一个0到1的值,表示道路是否坑洼。

模型的建立可以表示为以下公式:

给定一个输入图像 x x x,表示为一个 W × H × C W\times H\times C W×H×C的三维张量,其中 W W W H H H是图像的宽度和高度, C C C是通道数。卷积神经网络(CNN)将图像 x x x映射到一个输出标量 y y y,表示道路是否坑洼的概率。这个映射可以表示为:

y = σ ( f ( x ) ) y = \sigma(f(x)) y=σ(f(x))

其中:

  • f ( x ) f(x) f(x)表示卷积神经网络的前向传播过程,包括卷积、池化和全连接等层的组合,用于提取图像特征。
  • σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1 是sigmoid激活函数,将 z z z映射到0到1的范围内,表示概率。

模型的训练可以使用二元交叉熵(binary cross-entropy)损失函数来度量预测概率与实际标签之间的差异:

L ( y , y ^ ) = − ( y log ⁡ ( y ^ ) + ( 1 − y ) log ⁡ ( 1 − y ^ ) ) \mathcal{L}(y, \hat{y}) = -\left(y\log(\hat{y}) + (1 - y)\log(1 - \hat{y})\right) L(y,y^)=(ylog(y^)+(1y)log(1y^))

其中:

  • y y y 是实际标签(0表示坑洼,1表示正常道路)。
  • y ^ \hat{y} y^ 是模型的预测概率。

训练模型的目标是最小化损失函数 L \mathcal{L} L,以使预测尽可能接近实际标签。

二元交叉熵(Binary Cross-Entropy)是一种用于衡量二分类问题中模型预测与实际标签之间的差异的损失函数。它通常用于训练和评估二分类模型,例如判断一个样本属于两个类别中的哪一个。

这个损失函数的度量原理基于信息论的概念,特别是信息熵。以下是它的度量原理:

假设我们有一个二分类问题,其中样本的实际标签为 y y y,可以取0或1,而模型的预测概率为 y ^ \hat{y} y^,表示样本属于类别1的概率。

交叉熵损失的度量原理基于以下两种情况:

  1. 当实际标签 y = 1 y=1 y=1时,交叉熵损失为:

    − log ⁡ ( y ^ ) -\log(\hat{y}) log(y^)

    这表示模型预测样本属于类别1的概率越高,损失越小,反之则损失越大。这是因为实际标签为1时,我们希望模型的预测也接近1。

  2. 当实际标签 y = 0 y=0 y=0时,交叉熵损失为:

    − log ⁡ ( 1 − y ^ ) -\log(1 - \hat{y}) log(1y^)

    这表示模型预测样本属于类别0的概率越高,损失越小,反之则损失越大。这是因为实际标签为0时,我们希望模型的预测也接近0。

在训练过程中,我们会将所有样本的交叉熵损失加权求和,然后尝试最小化这个总损失。这意味着模型的目标是使其对于所有样本的预测与实际标签更加一致,以最小化总的交叉熵损失。

总的二元交叉熵损失可以表示为:

L ( y ^ , y ) = − ( y log ⁡ ( y ^ ) + ( 1 − y ) log ⁡ ( 1 − y ^ ) ) \mathcal{L}(\hat{y}, y) = -\left(y\log(\hat{y}) + (1 - y)\log(1 - \hat{y})\right) L(y^,y)=(ylog(y^)+(1y)log(1y^))

其中, L ( y ^ , y ) \mathcal{L}(\hat{y}, y) L(y^,y)表示损失, y ^ \hat{y} y^表示模型的预测概率, y y y表示实际标签。最小化这个损失将使模型尽量接近实际标签的分布,以更好地进行二分类任务。

代码:

import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd

# 加载和预处理数据
def load_and_preprocess_data():
    # 你需要编写加载和预处理数据的代码,返回X和y
    # X是图像数据,y是标签(0表示坑洼,1表示正常道路)
    # 这里使用一个假设的示例,你需要根据实际数据进行适配
    X = np.random.rand(301, 224, 224, 3)  # 示例随机生成图像数据
    y = np.random.randint(2, size=301)  # 示例随机生成标签
    return {'images': X, 'labels': y}

# 构建深度学习模型
def build_model():
    model = keras.Sequential([
        keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)),
        keras.layers.MaxPooling2D((2, 2)),
        keras.layers.Conv2D(64, (3, 3), activation='relu'),
        keras.layers.MaxPooling2D((2, 2)),
        keras.layers.Flatten(),
        keras.layers.Dense(128, activation='relu'),
        keras.layers.Dense(1, activation='sigmoid')
    ])
    model.compile(optimizer='adam',
                  loss='binary_crossentropy',  # 二元交叉熵损失
                  metrics=['accuracy'])
    return model

# 模型训练
def train_model(X_train, y_train, X_val, y_val):
    model = build_model()
    #见完整版代码

题目二

问题二的建模思路需要分为两个主要部分:模型训练和模型评估。

模型训练

  1. 数据加载与划分:首先,加载问题一中准备好的训练数据。将数据集划分为训练集( X train X_{\text{train}} Xtrain y train y_{\text{train}} ytrain)和验证集( X val X_{\text{val}} Xval y val y_{\text{val}} yval),通常采用交叉验证方法,以确保模型在不同数据子集上进行训练和评估。

  2. 模型选择:选择问题一中构建的深度学习模型,该模型已包含合适的网络结构和损失函数(二元交叉熵),用于道路坑洼的分类任务。

  3. 模型训练:使用训练集进行模型训练。迭代多个周期(epochs),使模型能够适应数据。训练过程中,模型会自动调整权重,以最小化损失函数。

  4. 超参数调优:根据需要,进行超参数调优,包括学习率、批处理大小等。这可以通过验证集上的性能来指导。你可以使用交叉验证技术来尝试不同的超参数组合。

  • 数据加载与划分:

X train , y train , X val , y val = train_test_split ( X , y , test_size = 0.2 , random_state = 42 ) X_{\text{train}}, y_{\text{train}}, X_{\text{val}}, y_{\text{val}}=\text{train\_test\_split}(X, y, \text{test\_size}=0.2,\text{random\_state}=42) Xtrain,ytrain,Xval,yval=train_test_split(X,y,test_size=0.2,random_state=42)

  • 模型选择:
    model = build_model ( ) \text{model} = \text{build\_model}() model=build_model()

  • 模型训练:

    model.fit ( X train , y train , epochs = 10 , validation_data = ( X val , y val ) \text{model.fit}(X_{\text{train}}, y_{\text{train}}, \text{epochs}=10, \text{validation\_data}=(X_{\text{val}}, y_{\text{val}}) model.fit(Xtrain,ytrain,epochs=10,validation_data=(Xval,yval)

模型评估

使用ROC曲线和AUC(Area Under the Curve)来评估模型的性能是一种常见的方法,特别适用于二分类问题。ROC曲线是一种用于可视化分类模型性能的工具,而AUC是ROC曲线下的面积,用于定量评估模型的性能。

1. 计算模型的ROC曲线

在评估模型之前,你需要使用验证集上的真正例率(True Positive Rate,召回率)和假正例率(False Positive Rate)来构建ROC曲线。这可以通过不同的分类阈值来实现。以下是ROC曲线的构建过程:

  • 为了计算ROC曲线,首先使用模型对验证集进行预测,获取每个样本的预测概率。

  • 使用不同的分类阈值(通常是0到1之间的值),将样本分为正类和负类。根据不同阈值,计算真正例率(TPR)和假正例率(FPR)。

  • 绘制TPR和FPR的曲线,即ROC曲线。

2. 计算AUC值

AUC(ROC曲线下的面积)用于量化ROC曲线的性能。AUC的值通常在0.5和1之间,越接近1表示模型性能越好。

  • 计算ROC曲线下的面积(AUC)。通常,你可以使用数值积分方法或库函数来计算AUC的值。

3. 评估模型

根据ROC曲线和AUC值进行模型评估。

  • AUC接近1表示模型具有良好的性能,可以很好地区分正类和负类样本。

  • ROC曲线越接近左上角(0,1),表示模型性能越好。

  • 如果AUC接近0.5,模型性能可能很差,类似于随机猜测。

  • 比较不同模型的AUC值,选择具有较高AUC值的模型。

  • 根据任务需求,可以根据不同的阈值来调整模型,以在召回率和精确度之间取得平衡。

import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt

# 加载和预处理数据(与问题一相同)
def load_and_preprocess_data():
    # 你需要编写加载和预处理数据的代码,返回X和y
    # X是图像数据,y是标签(0表示坑洼,1表示正常道路)
    # 这里使用一个假设的示例,你需要根据实际数据进行适配
    X = np.random.rand(301, 224, 224, 3)  # 示例随机生成图像数据
    y = np.random.randint(2, size=301)  # 示例随机生成标签
    return {'images': X, 'labels': y}

# 构建深度学习模型(与问题一相同)
def build_model():
    model = keras.Sequential([
        # 模型结构,与问题一相同
    ])
    model.compile(optimizer='adam',
                  loss='binary_crossentropy',  # 二元交叉熵损失
                  metrics=['accuracy'])
    return model

# 模型训练(与问题一相同)
def train_model(X_train, y_train, X_val, y_val):
    model = build_model()
    model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val))
    return model

# 计算ROC曲线和AUC
def calculate_roc_auc(model, X_val, y_val):
    y_pred = model.predict(X_val)
    fpr, tpr, thresholds = roc_curve(y_val, y_pred)
    roc_auc = auc(fpr, tpr)
    return fpr, tpr, roc_auc

# 绘制ROC曲线
def plot_roc_curve(fpr, tpr, roc_auc):
    plt.figure()
    plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
    plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver Operating Characteristic')
    #见完整代码

问题三

问题三要求使用已训练的模型对测试集中的坑洼图像进行识别,并将识别结果保存在一个CSV文件中。以下是问题三的具体建模思路,:

模型应用

  1. 加载已训练模型:首先,加载问题一或问题二中训练好的模型。这个模型应该是能够识别道路坑洼的模型。

  2. 加载测试数据:加载问题一中提供的测试数据集(通常以图像的形式)。

  3. 图像预处理:对测试数据进行与训练数据相同的预处理,包括图像归一化、缩放等操作。

  4. 模型预测:使用加载的模型对测试数据进行预测,得到每张图像的分类结果(0表示坑洼,1表示正常道路)。

结果保存

  1. 保存识别结果:将图像文件名与对应的分类结果(0或1)保存在CSV文件中。这个文件将作为问题三的提交文件。

模型应用

  • 加载已训练模型:

model = load_trained_model ( ) \text{model} = \text{load\_trained\_model}() model=load_trained_model()

  • 加载测试数据:

    test_data = load_test_data ( ) \text{test\_data} = \text{load\_test\_data}() test_data=load_test_data()

  • 图像预处理:

    preprocessed_test_data = preprocess_images ( test_data ) \text{preprocessed\_test\_data} = \text{preprocess\_images}(\text{test\_data}) preprocessed_test_data=preprocess_images(test_data)

  • 模型预测:

    predictions = model.predict ( preprocessed_test_data ) \text{predictions} = \text{model.predict}(\text{preprocessed\_test\_data}) predictions=model.predict(preprocessed_test_data)

结果保存

  • 保存识别结果:

    save_results_to_csv ( test_data_file_names , predictions ) \text{save\_results\_to\_csv}(\text{test\_data\_file\_names}, \text{predictions}) save_results_to_csv(test_data_file_names,predictions)

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras

# 加载已训练的模型
def load_trained_model(model_path):
    model = keras.models.load_model(model_path)
    return model

# 加载测试数据
def load_test_data(test_data_dir):
    # 你需要编写加载测试数据的代码,返回测试数据集
    # 这里使用一个假设的示例,你需要根据实际数据进行适配
    test_data = np.random.rand(1000, 224, 224, 3)  # 示例随机生成测试图像数据
    return test_data

# 图像预处理(与问题二相似)
def preprocess_images(images):
    # 你需要编写与问题二中相似的图像预处理代码
    # 包括图像归一化、缩放、通道处理等操作
    return preprocessed_images

# 模型预测
def predict_with_model(model, test_data):
    predictions = model.predict(test_data)
    # 假设模型输出概率,可以根据阈值将概率转换为类别(0或1)
    predicted_labels = (predictions >= 0.5).astype(int)
    return predicted_labels

# 保存识别结果到CSV文件
def save_results_to_csv(file_names, predicted_labels, output_csv_file):
    results_df = pd.DataFrame({'fnames': file_names, 'label': predicted_labels})
    results_df.to_csv(output_csv_file, index=False)

# 示例用法
if __name__ == '__main__':
    model_path = 'trained_model.h5'  # 已训练模型的文件路径
    test_data_dir = 'test_data'  # 测试数据集的目录
    output_csv_file = 'test_results.csv'  # 结果保存的CSV文件名

    # 加载已训练的模型
    trained_model = load_trained_model(model_path)
#见完整版代码

完整代码+思路:
2023年第四届MathorCup大数据竞赛(A题)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

普及篇|云备份和云容灾,你用对了吗?

企业常常会因为自然灾害、硬件老化故障、人为误操作等问题导致业务系统中断,该如何进行安全、高效的数据保护,这一问题引起企业越来越多的高度关注。 而对比传统的自建机房对数据进行保护,在云端利用云计算的弹性伸缩、按需扩展特点&#xff…

公众号迁移如何线上办理公证?

公众号账号迁移的作用是什么?只能变更主体吗?1.可合并多个公众号的粉丝、文章,打造超级大V2.可变更公众号主体,更改公众号名称,变更公众号类型——订阅号、服务号随意切换3.可以增加留言功能4.个人订阅号可迁移到企业名…

实现寄生组合继承

寄生组合继承是一种继承方式,它通过组合使用构造函数继承和原型继承的方式,实现了高效而且正确的继承方式。 具体实现步骤如下: ① 定义一个父类,实现其属性和方法: function Person(name) {this.name namethis.age…

Google play 应用下架、封号常见原因:8.3/10.3分发协议及恶意软件政策问题浅析

相信大多数谷歌Android开发者都遭遇过应用下架、账号被封的情况,尤其对于想通过上传马甲包、矩阵方式来获得更多收益的开发者来说,想必应用下架、拒审、账号被封已经是家常便饭了,同时也为此烦恼。 造成这种情况的原因有很多,且每…

腾讯云新用户优惠券领取方法及使用教程

腾讯云作为国内领先的云计算服务提供商,为了吸引更多的新用户,经常会推出各种优惠活动。其中,最吸引新用户的还是腾讯云优惠券,本文将详细介绍腾讯云新用户优惠券的领取方法及使用教程,助力大家轻松上云! 一…

特殊类设计(只在堆/栈上创建对象,单例模式),完整版代码+思路

目录 类不能被拷贝 类不能被继承 只在堆上创建对象 只在栈上创建对象 operator new operator delete 只能创建一个对象 设计模式 介绍 常见的设计模式 单例模式 介绍 应用 饿汉模式 介绍 实现 思路 代码 使用 懒汉模式 引入 介绍 实现 思路 代码 使用…

【Javascript】编写⼀个函数,排列任意元素个数的数字数组,按从⼩到⼤顺序输出

目录 sort方法 两个for循环 写法一: 写法二: sort方法 var list[3,6,2,8,1,7];list.sort();console.log(list);使用sort方法有局限,适合元素为个位数 var list[3,6,80,100,78,4];list.sort();console.log(list);如果元素 解决方法&#xf…

VR数字党建:红色文化展厅和爱国主义教育线上线下联动

伴随着党建思想的加深,很多政府单位都有打造VR党建展厅的想法,而党建基地也是激发爱国热情、凝聚人民力量、培养民族精神的重要场所。现如今,伴随着5G、VR等技术的成熟,VR数字党建积极推动运用VR技术,推动红色文化展厅…

linux 实时调度实现

调度入口__schedule() 主要做了几件事: deactivate_task() -> pick_next_task() -> context_switch() pick_next_task 的实现中主要两个步骤: (IN __pick_next_task)put_prev_task_balance(rq, prev, rf);for_each_class(class) {p class->pick_next_task(rq);if…

Java 将数据导出到Excel并发送到在线文档

一、需求 现将列表数据&#xff0c;导出到excel,并将文件发送到在线文档&#xff0c;摒弃了以往的直接在前端下载的老旧模式。 二、pom依赖 <!-- redission --><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-…

AI 引擎系列 1 - 从 AI 引擎工具开始(2022.1 更新)

AI 引擎系列 1 - 从 AI 引擎工具开始&#xff08;2022.1 更新&#xff09; AI 引擎系列简介 在这篇题为 Versal 自适应 SoC AI 引擎入门的文章中&#xff0c;我介绍了一些 Versal™ 自适应 SoC 器件中存在的 AI 引擎 (AIE) 阵列。本系列是全新的 AI 引擎系列博文&#xff0c;我…

LeetCode--2.两数相加

文章目录 1 题目描述2 解题思路2.1 代码实现 1 题目描述 给你两个 非空 的链表, 表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的, 并且每个节点只能存储 一位 数字 请你将两个数相加, 并以相同形式返回一个表示和的链表 你可以假设除了数字 0 之外, 这两个数都…

maya2023安装

1、解压压缩包&#xff0c;点击setup安装&#xff0c;除修改安装路径外&#xff0c;其他都是都是下一步&#xff0c;安装后最好重启系统 破解步骤 关闭杀毒&#xff0c;防止误删1.安装Autodesk软件&#xff0c;但是不要启动&#xff0c;安装完成后重启电脑 2.安装破解文件夹里…

图神经网络论文笔记(一)——北邮:基于学习解纠缠因果子结构的图神经网络去偏

作者 &#xff1a;范少华 研究方向 &#xff1a;图神经网络 论文标题 &#xff1a;基于学习解纠缠因果子结构的图神经网络去偏 论文链接 &#xff1a;https://arxiv.org/pdf/2209.14107.pdf        https://doi.org/10.48550/arXiv.2209.14107 大多数图神经网络(GNNs)通…

JAVA实现校园二手交易系统 开源

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模块2.3 商品预约管理模块2.4 商品预定管理模块2.5 商品留言板管理模块2.6 商品资讯管理模块 三、实体类设计3.1 用户表3.2 二手商品表3.3 商品预约表3.4 商品预定表3.5 留言表3.6 资讯…

软考系统架构师知识点集锦四:信息安全技术基础知识

一、考情分析 二、考点精讲 2.1信息加解密技术 2.1.1对称加密 概念:对称加密(又称为私人密钥加密/共享密钥加密) : 加密与解密使用同一密钥。特点:加密强度不高&#xff0c;但效率高;密钥分发困难。 (大量明文为了保证加密效率一般使用对称加密) 常见对称密钥加密算法:DES:…

行政快递管理高效化教程

能不能做好因公寄件管理&#xff0c;影响着企业内部运转的效率。我们知道&#xff0c;基本上每家企业的因公寄件&#xff0c;是由行政部门来统筹管理的...... 企业员工只知道&#xff0c;在公司寄快递&#xff0c;找行政。殊不知行政快递管理&#xff0c;不仅仅是“寄件”这么…

操作失误损失60亿美元,Excel还能是电脑上的常驻将军吗?

2013年&#xff0c;摩根大通交易员excel操作失误&#xff0c;造成公司损失60亿美元&#xff01;近40年来&#xff0c;excel一直是办公电脑上的常驻将军&#xff0c;甚至我们现在对表格的印象就是excel&#xff0c;为什么excel这么容易错误&#xff0c;这些年我们还是一直使用ex…

TVRNet网络PyTorch实现

文章目录 文章地址网络各层结构代码实现 文章地址 An End-to-End Traffic Visibility Regression Algorithm文章通过训练搜集得到的真实道路图像数据集&#xff08;Actual Road dense image Dataset, ARD&#xff09;&#xff0c;通过专业的能见度计和多人标注&#xff0c;获得…

C++重载 强制类型转换运算符

文章目录 1.函数调用运算符重载2.强制类型转换运算符重载2.1对运算符的认识2.2类型强制转换运算符 1.函数调用运算符重载 class Display { public:void operator()(string text){cout << text << endl;}}; class Add { public:int operator()(int v1, int v2){ret…