BP神经网络

【案例】使用PCA减少BP神经网络入模变量

作者 : 老饼 发表日期 : 2023-01-18 19:33:33 更新日期 : 2024-12-06 11:50:34
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com



在BP神经网络的建模中,入模变量的信息冗余往往会增加模型的复杂性以及求解的难度

本文讲解如何使用PCA降维来减少BP神经网络的入模变量个数,以此提升BP神经网络的效果

通过本文,可以了解如何使用PCA主成份分析来减少BP神经网络的入模变量,以及具体的代码实现





     01.什么是PCA降维     




本节讲解什么是PCA和PCA降维,以及在matlab中的代码实现




     PCA与PCA降维      


在BP神经网络的建模中,入模变量个数会增加BP神经网络的训练难度,
特别是入模变量的信息存在较大冗余时,还会增加BP神经网络过拟合的可能性
因此,先去除入模变量的信息冗余,往往可以有效地提高BP神经网络的模型效果

什么是PCA主成份分析
PCA主成份分析的目的是去除变量之间的信息冗余,使得变量之间互不相关
 PCA的原理如下:
 什么是PCA主成份分析
PCA先将数据中心化,然后对坐标系进行旋转,使得在新坐标系中各个变量互不相关
变量在新坐标轴中的表示称为主成份P,它与原始变量的关系为:
 其中,A称为主成份系数
总的来说,PCA就是利用一个矩阵A,将X转换为新的一组互不相关的变量(称为主成份)
 主成份分析的使用方法
什么是PCA降维
PCA降维是一种有效压缩变量线性信息冗余的方法,它是PCA主成份分析的一种常见用途
PCA降维先用每个主成份的方差来评估主成份的信息贡献,方差越大代表主成份所包含的信息越多
然后一般只选择包含95%以上信息的变量作为所有变量的代表,从而减少变量的个数
 PCA主成份降维
总的来说,PCA降维就是先通过主成份分析,把原始变量转换为互不相关的主成份
再根据方差占比剔除信息贡献较小的主成份,从而达到降维的效果 
  备注:PCA降维虽然减少了变量的个数,但它并没有剔除X中的变量,
即使最终即使只有一个主成份变量,它也是用到了X的所有变量的





     matlab中PCA的使用     


 matlab中使用PCA的简单示例代码如下:
load acetylene.mat                      % 加载matlab自带的化学数据
X = mapminmax([x1,x2,x3]',-1,1)';       % 将x1,x2,x3进行归一化作为X
[A,P,V] = pca(X)                        % 对X进行主成份分析,A是主成份系数,P是主成份,V是主成份方差
pr = V/sum(V)                           % 计算主成份贡献,即方差占比
在matlab中进行PCA分析只需使用pca函数就可以
 pca函数返回的三个参数分别依次为:
 1. 主成份系数A                                                
  2. 主成份P                                                        
 P也可由A计算得到:P= (X-mean(X))*A    
 3. 主成份方差V                                                
 V则是P的方差:V=var(P)                
备注:V必定是从大到小排序的,因为pca函数在求A的时候就已经处理好了,使得主成份P的方差V从大到小排序








     02. PCA优化BP神经网络     




本节讲解PCA优化BP神经网络的具体流程与代码




      通过PCA优化BP神经网络     


在入模变量之间存在较大的信息冗余时,可以通过PCA降维来尝试优化模型的效果
 使用PCA优化BP神经网络是很简单的,就简单的两步:
1. 用PCA看一下入模变量的主成份方差占比                     
2. 选出包含95%以上信息的主成份进行BP神经网络的建模
 具体代码如下:
% 本代码展示如何对数据先进行PCA降维,再进行BP神经网络建模
% 本代码来自《老饼讲解-BP神经网络》www.bbbdata.com
load acetylene.mat
setdemorandstream(555);                                          % 老饼为了每次运行的结果一致设定随机种子,实际中可以去掉
X = mapminmax([x1,x2,x3]',-1,1)';                                % 将x1,x2,x3进行归一化作为X,这是为了统一量纲
[A,P,V] = pca(X);                                                % 对X进行主成份分析,A是主成份系数,P是主成份,V是主成份方差
pr = V/sum(V)                                                    % 计算主成份占比
%--------------------
% 根据主成份占比pr=[0.7486,0.2361,0.0153],选择前两个主成份进行建模
%--------------------
x = P(:,1:2)';                                                    % 选择前两个主成份进行建模
[y,PS] = mapminmax(y',-1,1);                                      % y:正庚烷制乙炔的转化率。这里对y进行归一化是为了方便看误差
net    = newff(x,y,4,{'tansig','purelin'},'trainlm');             % 构建BP神经网络
[net,tr,py] = train(net,x,y);                                     % 训练网络       
train_err   = mean(abs(py(:,tr.trainInd)-y(:,tr.trainInd)))       % 训练数据的误差
test_err    = mean(abs(py(:,tr.testInd)-y(:,tr.testInd)))         % 测试数据的误差
运行结果如下:
 PCA与BP结合的代码运行结果
在代码中,我们先用PCA算出PR,然后根据PR=[0.749,0.236,0.015],可知第3主成份作用并不大
因此只使用第1、2主成份进行建模,这样输入个数只有2个,从而隐节点也可以设得更少
减少了变量个数,一方面可以提高模型的泛化能力,另一方面降低了模型的求解难度,往往使模型精度提升






好了,以上就是使用PCA减少BP神经网络入模变量的方法了~








  End  





联系老饼