本项目实现了基于MNIST数据集的图像分类功能,使用五种不同的机器学习算法进行对比分析。
- 多种算法实现: 支持向量机(SVM)、决策树、K近邻、BP神经网络、CNN
- 完整评价指标: Accuracy、Precision、Recall、F1-Score、AUC、ROC曲线
- 可视化结果: 生成对比图表、混淆矩阵、HTML报告
- MNIST数据集: 自动下载和处理MNIST手写数字数据集
- 基于距离的非参数分类方法
- 通过计算测试样本与训练样本的距离进行分类
- 参数: k=5 (考虑5个最近邻)
- 基于特征分割的树形结构分类器
- 使用基尼不纯度作为分割标准
- 参数: 最大深度=10, 最小分割样本数=5
- 寻找最优分离超平面的分类方法
- 本项目使用简化实现
- 参数: C=1.0, kernel=rbf, gamma=0.1
- 多层感知器,使用反向传播算法训练
- 网络结构: 784-128-64-10
- 参数: 学习率=0.01, 训练轮数=500, 动量=0.9
- 专门用于图像处理的深度学习网络
- 本项目使用简化的CNN结构
- 适合处理28x28的图像数据
project9/
├── src/
│ ├── main.cpp # 主程序入口
│ ├── mnist_dataset.h/cpp # MNIST数据集加载和处理
│ ├── ml_algorithms.h/cpp # 传统机器学习算法实现
│ ├── neural_networks.h/cpp # 神经网络算法实现
│ ├── metrics.h/cpp # 评价指标计算
│ └── visualizer.h/cpp # 结果可视化
├── data/ # MNIST数据集存储目录
├── output/ # 结果输出目录
└── xmake.lua # 构建配置文件
- C++17 编译器
- XMake 构建工具
- 依赖库: Eigen3 (可选)
-
克隆项目到本地
-
进入项目目录:
cd project9 -
配置项目:
xmake f -m release
-
编译项目:
xmake
-
运行程序:
xmake run project9
程序会自动提示下载MNIST数据集。如果自动下载失败,请手动下载以下文件到 data/ 目录:
- train-images-idx3-ubyte.gz
- train-labels-idx1-ubyte.gz
- t10k-images-idx3-ubyte.gz
- t10k-labels-idx1-ubyte.gz
下载地址: http://yann.lecun.com/exdb/mnist/
下载后需要解压 .gz 文件:
- train-images-idx3-ubyte
- train-labels-idx1-ubyte
- t10k-images-idx3-ubyte
- t10k-labels-idx1-ubyte
程序运行后会在 output/ 目录生成以下文件:
metrics_comparison.csv: CSV格式的指标对比数据metrics_chart.txt: 文本格式的性能对比图表
confusion_matrix_[算法名].txt: 每个算法的混淆矩阵
roc_curves.txt: ROC曲线数据
report.html: 完整的HTML格式分析报告
正确预测的样本数占总样本数的比例
预测为正例中实际为正例的比例
实际正例中被正确预测的比例
精确率和召回率的调和平均数
ROC曲线下的面积,衡量分类器的整体性能
根据MNIST数据集的特性,各算法的预期性能排序大致如下:
- CNN: 在图像分类任务中通常表现最好
- BP神经网络: 多层网络具有较强的表达能力
- SVM: 在小样本情况下表现良好
- 决策树: 解释性强,性能中等
- KNN: 简单有效,但对维度敏感
- 继承
MLAlgorithm基类 - 实现
train()和predict()方法 - 在
main.cpp中添加算法实例
- 修改
MNISTDataset类 - 实现新的数据加载函数
- 确保数据格式符合算法要求
- 集成图形库 (如 OpenCV, matplotlib-cpp)
- 生成真正的图表和图像
- 添加交互式可视化
- 内存使用: MNIST数据集较大,确保有足够内存
- 训练时间: 神经网络训练可能需要较长时间
- 数据预处理: 图像数据已归一化到[0,1]范围
- 简化实现: 部分算法为教学目的进行了简化
欢迎提交问题和改进建议:
- Fork 项目
- 创建特性分支
- 提交更改
- 发起 Pull Request
本项目采用 MIT 许可证。详见 LICENSE 文件。