基于BP神经网络与AdaBoost的强分类器设计
这是一个基于MATLAB开发的高级机器学习项目,旨在通过AdaBoost(Adaptive Boosting)集成学习算法,显著提升BP神经网络在非线性分类任务中的预测性能。该项目不仅仅单一地使用神经网络,而是构建了一个分类器集成系统,通过迭代训练和权重调整,将多个“弱”BP神经网络组合成一个高精度的“强”分类器。
项目简介
该项目实现了一个完整的AdaBoost-BP算法框架。针对单一BP神经网络容易陷入局部极小值、泛化能力不稳定的问题,本项目引入AdaBoost算法思想:利用加权投票机制,通过多轮迭代训练,让后续的神经网络更加关注那些被前一轮网络错误分类的样本(难分样本)。
程序包含从模拟数据生成、数据预处理、集成算法迭代训练、强分类器构建到最终性能评估与可视化的全流程。通过该系统,用户可以直观地观察到随着弱分类器数量的增加,系统整体分类准确率的提升过程。
功能特性
- 非线性数据模拟:内置数据生成模块,自动生成需通过非线性边界划分的二维数据集(基于极坐标变换生成的两类样本),用于验证算法处理复杂分类问题的能力。
- AdaBoost集成框架:实现了标准的AdaBoost迭代流程,包括样本权重初始化、基于权重的重采样(轮盘赌算法)、分类器权重计算及样本权重更新。
- 动态BP神经网络构建:在每一轮迭代中动态创建并训练前馈神经网络(Feedforward Neural Network),作为基分类器。
- 加权组合预测:最终的预测结果并非简单平均,而是根据每个弱分类器的分类误差率计算话语权(Alpha权重),进行加权组合决策。
- 全方位可视化评估:
* 包含原始数据分布图。
* 训练过程中的误差率下降曲线。
* 测试集的分类结果散点图(区分正确与错误分类点)。
* 集成过程准确率提升曲线(展示集成学习的效果)。
* 独立的混淆矩阵热力图。
系统要求
- MATLAB R2016a 或更高版本
- Neural Network Toolbox (Deep Learning Toolbox)
使用方法
- 确保MATLAB的工作路径包含项目文件。
- 直接运行主程序脚本。
- 程序将自动执行数据生成、模型训练和测试,并在控制台输出每一轮迭代的误差率和分类器权重。
- 运行结束后,系统会弹出两个图形窗口展示详细的分析结果。
---
核心算法流程与代码实现逻辑
本项目的主程序(main.m)严格按照以下逻辑步骤实现,具体细节如下:
1. 数据生成与预处理
- 数据构造:代码首先设置随机种子以确保结果可复现。接着生成总计400个样本,分为两类。利用极坐标公式构造特征,类别1分布在半径1.0附近,类别2分布在半径0.5附近,形成非线性可分的数据结构(类似同心圆或环形分布)。
- 标签设定:为了适配AdaBoost算法公式,将两类数据的标签分别设定为 1 和 -1。
- 数据集划分:将数据随机打乱后,按7:3的比例划分为训练集(280个样本)和测试集(120个样本)。
- 归一化:使用
mapminmax 函数将训练数据归一化到 [-1, 1] 区间,并利用训练集的归一化参数对测试集进行同等处理。
2. AdaBoost-BP 初始化
- 设定弱分类器迭代次数 $K=10$。
- 设定BP神经网络隐藏层节点数为5。
- 初始化样本权重分布 $D$,初始状态下每个训练样本的权重相等($1/N$)。
3. 迭代训练弱分类器
程序进入核心循环(共 $K$ 次),每次迭代执行以下操作:
- 重采样(Resampling):基于当前的样本权重分布 $D$,使用轮盘赌算法(Roulette Wheel Selection)生成新的训练数据子集。在上一轮被误分类的样本由于权重较高,在此步骤中被选中的概率更大,从而迫使新的网络专注于学习这些难分样本。
- 网络训练:
* 使用
feedforwardnet 创建一个包含5个隐藏层节点的前馈网络。
* 配置训练参数(如学习率0.1,最大轮数100,关闭训练窗口)。
* 使用重采样后的子集对网络进行训练。
- 预测与误差计算:
* 使用训练好的网络对
原始训练集进行预测。
* 将输出结果通过
sign 函数转换为 {-1, 1} 类别标签。
* 计算当前弱分类器的加权误差率 $epsilon_k$,即所有被误分类样本的权重之和。
* 针对误差率进行边界处理(防止除零错误或误差过大),若分类器效果差于随机猜测(误差>0.5),则进行修正。
- 计算分类器权重:根据公式 $alpha_k = 0.5 times ln((1 - epsilon_k) / epsilon_k)$ 计算当前网络的权重。误差率越低,该网络在最终决策中的话语权越大。
- 更新样本权重:
* 根据公式 $D_{new} = D_{old} times exp(-alpha_k times y_{true} times y_{pred})$ 更新样本权重。
* 分类正确的样本权重降低,分类错误的样本权重增加。
* 最后对权重 $D$ 进行归一化处理,使其和为1。
4. 强分类器构建与测试
- 遍历保存的 $K$ 个弱分类器,分别对测试集进行预测。
- 采用加权投票机制:将每个弱分类器的预测结果乘以其对应的权重 $alpha_k$,然后求和。
- 通过符号函数
sign 获取最终的分类结果(大于0为第一类,小于0为第二类)。
5. 性能评估
- 计算总体准确率(Accuracy)。
- 计算混淆矩阵的四个关键指标(TP, TN, FP, FN),用于分析各类别的分类详情。
6. 结果可视化
代码会在最后生成详细的图表:
- 数据分布图:展示训练集和测试集的原始空间分布。
- 误差下降曲线:绘制每一轮迭代中弱分类器的加权误差率变化,观察模型训练状态。
- 分类结果图:在特征空间中绘制测试样本,并用不同的标记(如黑色叉号)直观标出被强分类器预测错误的样本。
- 准确率提升曲线:计算并绘制随着集成弱分类器数量(从1到 $K$)的增加,强分类器在测试集上的准确率变化趋势,验证集成学习的有效性。
- 混淆矩阵热力图:在一个单独的窗口中绘制带有颜色编码的混淆矩阵,显示具体的分类数量。
---
关键技术点分析
- mapminmax: 用于数据的归一化处理,这对神经网络的收敛速度和精度至关重要。
- feedforwardnet: MATLAB神经网络工具箱中的核心函数,用于构建标准的前馈神经网络。
- 轮盘赌选择 (Roulette Wheel Selection): 代码中通过计算累积概率
cumsum(D) 配合 rand 函数实现,这是实现AdaBoost“关注难分样本”机制的关键步骤。 - AdaBoost权重更新公式: 代码精确实现了AdaBoost的标准数学推导,利用指数损失函数动态调整样本分布。
- Sign函数应用: 由于是二分类问题(1 vs -1),代码大量使用符号函数处理神经网络的连续输出,将其转化为离散类别。