分类预测 | Matlab实现PCA-BP主成分分析结合BP神经网络多特征分类预测
一、主要功能
该代码实现了一个基于主成分分析(PCA)进行特征降维,并结合BP神经网络进行分类预测的混合模型。其主要功能是:
- 数据预处理与降维:对原始数据进行标准化,并通过PCA提取主要特征成分,保留90%以上的原始数据信息,从而减少输入数据的维度、消除冗余、并可能提升后续模型的训练效率和性能。
- 模式识别与分类:使用降维后的主成分数据作为输入,构建并训练一个标准的BP神经网络,最终实现对数据的分类预测。
- 结果可视化与分析:提供主成分贡献率图、预测结果对比图和混淆矩阵,用于全面评估模型的性能。
二、逻辑关联
代码的逻辑流程清晰,可分为两个主要阶段:
第一阶段:PCA数据预处理与降维
- 数据读取与准备:读取数据,分离特征(
x
)和标签(y
)。 - 数据标准化:将特征和目标变量分别进行标准化(减去均值,除以标准差),使其均值为0,标准差为1。这是PCA分析前的必要步骤。
- 主成分分析(PCA):
- 计算标准化后特征的协方差矩阵。
- 使用
pcacov
函数进行主成分分析,得到主成分系数(pc
)、特征值(latent
)和贡献率(explain
)。 - 根据累计贡献率(>90%)自动确定主成分的数量(
pcNum
)。
- 主成分计算与数据重构:
- 计算主成分得分(
F
),即原始数据在新主成分方向上的投影,这就是降维后的新特征集。 - (可选步骤)代码中也演示了如何将主成分得分转换回原始变量空间的回归系数,并计算预测值
y_p
,但这部分结果在后续分类任务中并未使用。
- 计算主成分得分(
第二阶段:BP神经网络分类
5. 数据准备:将降维后的特征(F
)与原始标签(y
)重新组合成新的数据集 res
。
6. 数据集划分与预处理:与之前代码相同,打乱数据并按类别划分为70%训练集和30%测试集。对输入数据进行[0,1]
区间归一化,对标签进行one-hot编码。
7. 网络构建与训练:构建一个单隐藏层(15个节点)的BP网络,并使用训练集进行训练。
8. 预测与评估:使用训练好的网络进行预测,计算准确率,并绘制结果对比图和混淆矩阵。
三、算法步骤
-
PCA算法步骤:
- 输入:标准化后的数据矩阵
stdarr
。 - 计算协方差矩阵:
covArr = cov(stdarr)
。 - 特征分解:求解协方差矩阵的特征值和特征向量(
[pc, latent, explain] = pcacov(covArr)
)。 - 选择主成分:根据特征值累计贡献率阈值(90%)确定主成分个数
k
。 - 输出降维数据:将原始数据投影到前
k
个特征向量张成的空间中,得到降维后的数据F = stdarr * pc(:, 1:k)
。
- 输入:标准化后的数据矩阵
-
BP神经网络算法步骤:
- 前向传播:输入数据经过隐藏层、输出层计算得到预测输出。
- 误差计算:计算预测输出与真实标签之间的误差。
- 误差反向传播:将误差从输出层向输入层反向传播,并计算各层权值和偏置的梯度。
- 参数更新:使用梯度下降法(学习率0.01)更新网络的权值和偏置。
- 迭代:重复以上步骤直到达到最大训练次数(50次)或目标误差(1e-3)。
四、技术路线
数据标准化 → PCA特征提取与降维 → 构建新的数据集 → BP神经网络训练与分类 → 性能评估
技术核心在于将无监督的降维技术(PCA) 与有监督的分类模型(BP神经网络) 相结合。PCA作为前置过滤器,简化了网络的结构和输入,旨在提高模型的效率和泛化能力。
五、公式原理
-
数据标准化 (Z-score):
Xstandardized=X−μσX_{\text{standardized}} = \frac{X - \mu}{\sigma}Xstandardized=σX−μ
其中 μ\muμ 是均值,σ\sigmaσ 是标准差。 -
主成分分析 (PCA):
PCA的目标是找到一组新的正交基(主方向),使得数据在这些方向上的投影方差最大。- 协方差矩阵:C=1n−1XTXC = \frac{1}{n-1} X^T XC=n−11XTX(假设 XXX 已标准化)。
- 特征分解:Cv=λvC v = \lambda vCv=λv,其中 λ\lambdaλ 是特征值(方差),vvv 是对应的特征向量(主成分方向)。
- 降维:F=XVkF = X V_kF=XVk,其中 VkV_kVk 是由前 kkk 个最大特征值对应的特征向量组成的矩阵。
-
BP神经网络:
如前所述,基于梯度下降的误差最小化算法。
六、参数设定
模块 | 参数名 | 设定值/方法 | 说明 |
---|---|---|---|
PCA | 贡献率阈值 | 90% | 保留主成分的累计贡献率阈值 |
主成分数量 pcNum | 自动计算 | 由贡献率阈值决定 | |
数据划分 | num_size | 0.7 | 训练集占比70% |
flag_conusion | 1 | 绘制混淆矩阵 | |
BP网络 | hiddennum | 15 | 隐藏层神经元数量 |
trainParam.epochs | 50 | 最大训练次数 | |
trainParam.goal | 1e-3 | 训练目标误差 | |
trainParam.lr | 0.01 | 学习率 |
七、运行环境
软件: MATLAB (建议使用 R2018b 或更高版本,以确保 confusionchart
函数可用)。
总结:这段代码展示了一种经典的特征降维+机器学习的建模流程。通过PCA预处理,有效降低了数据的维度,简化了后续神经网络的结构,通常有助于减少过拟合风险并加快训练速度。整个流程从数据预处理、特征工程到模型训练与评估非常完整,是一个很好的多维数据分类解决方案。