对比分析了几种常见的神经网络《BP、RBF(径向基)、GRNN(广义回归)、PNN(概率)》,并在文末附代码,想要训练测试数据可以留言。
1. BP神经网络:
BP神经网络是一种多层的前馈神经网络,有导师学习的神经网络。其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:输入向量应为n个特征。
BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。
其中神经元,或称神经单元/神经节点,是神经网络基本的计算单元,其计算函数称为激活函数(activation function),用于在神经网络中引入非线性因素,可选择的激活函数有:Sigmoid函数、双曲正切函数(tanh)、ReLu函数(Rectified Linear Units),softmax等。
训练一个神经网络的全流程:
1.初始化神经网络,对每个神经元的w和b赋予随机值;
2.输入训练样本集合,对于每个样本,将输入给到神经网络的输入层,进行一次正向传播得到输出层各个神经元的输出值;
3.求出输出层的误差,再通过反向传播算法,向后求出每一层(的每个神经元)的误差;
4.通过误差可以得出每个神经元的?C/?w、?C/?b,再乘上负的学习率(-η),就得到了Δw、Δb,将每个神经元的w和b更新为 w+Δw、b+Δb;
完成训练之后,一般情况下我们都能得到一个损失比较小的神经网络。
下面是RBF,GRNN,PNN神经网络,相比最经典BP神经网络(Backpropagation neural networks,误差是反向传播,而输入到输出是前向传播的,相对这种有导师学习的神经网络,它的原理相对简单,但是它的参数比较多,需要调整的空间比较大。比如权值和阈值的确定困难。),这三个神经网络的参数只有一个spread, 因此要十分注意spread的选择。
2. RBF(径向基)神经网络:
通过对比来了解RBF神经网络。与 BP 神经网络的区别在于训练过程——其参数初始化具有一定方法,并非随机,隐含层的末尾使用了径向基函数,它的输出经过加权和得到。
径向基函数(Radial Basis Function,RBF)神经网络是一种三层网络.其学习过程和BP算法类似,二者的主要区别在于:
(1)隐藏层的激活函数不同,BP算法的激活函数是sigmod函数,RBF的激活函数是高斯基函数;
(2)BP算法是全局的逼近,每次学习都要进行所有网络连接的权重迭代更新,RBF是一种局部逼近,其输入层到输层是非线性映射,但其隐藏层到输出层是线性映射的.且输入层到隐藏层直接求和,不需要参数迭代。
RBF神经网络是一种性能优良的前馈型神经网络,RBF网络可以任意精度逼近任意的非线性函数,且具有全局逼近能力,从根本上解决了BP网络的局部最优问题,而且拓扑结构紧凑,结构参数可实现分离学习,收敛速度快。
RBF网络的优点:
① 它具有唯一最佳逼近的特性,且无局部极小问题存在。
② RBF神经网络具有较强的输入和输出映射功能,并且理论证明在前向网络中RBF网络是完成映射功能的最优网络。
③ 网络连接权值与输出呈线性关系。
④ 分类能力好。
⑤ 学习过程收敛速度快。
总结:RBF网络和BP网络一样能以任意精度逼近任何非线性函数。但由于它们使用的激励函数不同,其逼近性能也不相同。Poggio和Girosi已经证明,RBF网络是连续函数的最佳逼近,而BP网络不是。BP网络使用的Sigmoid函数具有全局特性,它在输入值的很大范围内每个节点都对输出值产生影响,并且激励函数在输入值的很大范围内相互重叠,因而相互影响,因此BP网络训练过程很长。此外,由于BP算法的固有特性,BP网络容易陷入局部极小的问题不可能从根本上避免,并且BP网络隐层节点数目的确定依赖于经验和试凑,很难得到最优网络。采用局部激励函数的RBF网络在很大程度上克服了上述缺点,RBF不仅有良好的泛化能力,而且对于每个输入值,只有很少几个节点具有非零激励值,因此只需很少部分节点及权值改变。学习速度可以比通常的BP算法提高上千倍,容易适应新数据,其隐层节点的数目也在训练过程中确定,并且其收敛性也较BP网络易于保证,因此可以得到最优解。
3. GRNN神经网络(函数逼近)
输入层和隐含层与 RBF 神经网络一致,这里的 直接由输出矩阵代替,并在隐含层与输出层之间和激活函数进行点乘。
**(尤其适合解决曲线拟合问题)**广义回归神经网络是径向基神经网络的一种,径向基神经元和线性神经元可以建立广义回归神经网络,它是径RBF网络的一种变化形式,经常用于函数逼近。在某些方面比RBF网络更具优势。GRNN具有很强的非线性映射能力和学习速度,比RBF具有更强的优势,网络最后普收敛于样本量集聚较多的优化回归,样本数据少时,预测效果很好,网络还可以处理不稳定数据。
4. PNN神经网络(模式分类)
径向基神经元和竞争神经元还可以组成概率神经网络。PNN也是RBF的一种变化形式,结构简单训练快捷,特别适合于模式分类问题的解决。
输入层和隐含层与RBF神经网络一致,不同点是最后的输出环节使用了一个竞争函数。概率神经网络(Probabilistic Neural Network)的网络结构类似于RBF神经网络,但不同的是,PNN是一个前向传播的网络,不需要反向传播优化参数。这是因为PNN结合了贝叶斯决策,来判断测试样本的类别。
与传统BP 网络相比较,PNN 网络具有如下主要优点 :
(1) 训练快速,其训练时间仅仅略大于读取数据的时间。
(2) 无论分类问题多么复杂,只要有足够多的训练数据,可以保证获得贝叶斯准则下的最优解。
(3) 允许增加或减少训练数据而无需重新进行长时间的训练。
总结:概率神经网络一般有以下四层:输入层、模式层、求和层和输出层。有的资料中也把模式层称为隐含层,把求和层叫做竞争层。其中,输入层负责将特征向量传入网络,输入层个数是样本特征的个数。模式层通过连接权值与输入层连接。计算输入特征向量与训练集中各个模式的匹配程度,也就是相似度,将其距离送入高斯函数得到模式层的输出。模式层的神经元的个数是输入样本矢量的个数,也就是有多少个样本,该层就有多少个神经元。求和层,就是负责将各个类的模式层单元连接起来,这一层的神经元个数是样本的类别数目。输出层的话,就负责输出求和层中得分最高的那一类。(在分类问题上,有优势)
总结这三种网络,由上图可以得出他们的主要区别是在输出层,即RBF、GRNN、PNN的各自的输出层分别是Linear Layer、Special Linear Layer、Competitive Layer,即在编写代码的时候,只要注意改变他们在输出层代码的区别。
程序:
BP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | %% I. 清空环境变量 clear all clc %% II. 训练集/测试集产生 %% % 1. 导入数据 load 实验二过氧化值因素.mat load 实验二过氧化值结果.mat %% % 2. 随机产生训练集和测试集 % temp = randperm(size(NIR,1)); % 训练集——50个样本 P_train = gyn((1:50),:)'; T_train = gyr((1:50),:)'; % 测试集——10个样本 P_test = gyn((51:end),:)'; T_test = gyr((51:end),:)'; N = size(P_test,2); %% III. 数据归一化 [p_train, ps_input] = mapminmax(P_train,0,1); p_test = mapminmax('apply',P_test,ps_input); [t_train, ps_output] = mapminmax(T_train,0,1); %% IV. BP神经网络创建、训练及仿真测试 %% % 1. 创建网络 net = newff(p_train,t_train,5); %% % 2. 设置训练参数 net.trainParam.epochs = 1000; net.trainParam.goal = 1e-13; net.trainParam.lr = 0.000001; %% % 3. 训练网络 net = train(net,p_train,t_train); %% % 4. 仿真测试 t_sim = sim(net,p_test); %% % 5. 数据反归一化 T_sim = mapminmax('reverse',t_sim,ps_output); %% V. 性能评价 %% % 1. 相对误差error error = abs(T_sim - T_test)./T_test; %% % 2. 决定系数R^2 R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2)); %% % 3. 结果对比 result = [T_test' T_sim' error'] %% VI. 绘图 figure plot(1:N,T_test,'b:*',1:N,T_sim,'r-o') legend('真实值','预测值') xlabel('预测样本') ylabel('辛烷值') string = {'测试集辛烷值含量预测结果对比';['R^2=' num2str(R2)]}; title(string) |
RBF:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | %% I. 清空环境变量 clear all clc %% II. 训练集/测试集产生 %% % 1. 导入数据 load 实验二过氧化值因素.mat load 实验二过氧化值结果.mat %% % 2. 随机产生训练集和测试集 % temp = randperm(size(gyn,1)); % 训练集——50个样本 P_train = gyn((1:45),:)'; T_train = gyr((1:45),:)'; % 测试集——10个样本 P_test = gyn((46:end),:)'; T_test = gyr((46:end),:)'; N = size(P_test,2); %% III. RBF神经网络创建及仿真测试 %% % 1. 创建网络 net = newrbe(P_train,T_train,99000); %% % 2. 仿真测试 T_sim = sim(net,P_test); %% IV. 性能评价 %% % 1. 相对误差error error = abs(T_sim - T_test)./T_test; %% % 2. 决定系数R^2 R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2)); %% % 3. 结果对比 result = [T_test' T_sim' error'] %% V. 绘图 figure plot(1:N,T_test,'b:*',1:N,T_sim,'r-o') legend('真实值','预测值') xlabel('预测样本') ylabel('辛烷值') string = {'测试集辛烷值含量预测结果对比';['R^2=' num2str(R2)]}; title(string) |
GRNN、PNN:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | %% I. 清空环境变量 clear all clc %% II. 训练集/测试集产生 %% % 1. 导入数据 load iris_data.mat %% % 2 随机产生训练集和测试集 P_train = []; T_train = []; P_test = []; T_test = []; for i = 1:3 temp_input = features((i-1)*50+1:i*50,:); temp_output = classes((i-1)*50+1:i*50,:); n = randperm(50); % 训练集——120个样本 P_train = [P_train temp_input(n(1:40),:)']; T_train = [T_train temp_output(n(1:40),:)']; % 测试集——30个样本 P_test = [P_test temp_input(n(41:50),:)']; T_test = [T_test temp_output(n(41:50),:)']; end %% III. 模型建立 result_grnn = []; result_pnn = []; time_grnn = []; time_pnn = []; for i = 1:4 for j = i:4 p_train = P_train(i:j,:); p_test = P_test(i:j,:); %% % 1. GRNN创建及仿真测试 t = cputime; % 创建网络 net_grnn = newgrnn(p_train,T_train); % 仿真测试 t_sim_grnn = sim(net_grnn,p_test); T_sim_grnn = round(t_sim_grnn); t = cputime - t; time_grnn = [time_grnn t]; result_grnn = [result_grnn T_sim_grnn']; %% % 2. PNN创建及仿真测试 t = cputime; Tc_train = ind2vec(T_train); % 创建网络 net_pnn = newpnn(p_train,Tc_train); % 仿真测试 Tc_test = ind2vec(T_test); t_sim_pnn = sim(net_pnn,p_test); T_sim_pnn = vec2ind(t_sim_pnn); t = cputime - t; time_pnn = [time_pnn t]; result_pnn = [result_pnn T_sim_pnn']; end end %% IV. 性能评价 %% % 1. 正确率accuracy accuracy_grnn = []; accuracy_pnn = []; time = []; for i = 1:10 accuracy_1 = length(find(result_grnn(:,i) == T_test'))/length(T_test); accuracy_2 = length(find(result_pnn(:,i) == T_test'))/length(T_test); accuracy_grnn = [accuracy_grnn accuracy_1]; accuracy_pnn = [accuracy_pnn accuracy_2]; end %% % 2. 结果对比 result = [T_test' result_grnn result_pnn] accuracy = [accuracy_grnn;accuracy_pnn] time = [time_grnn;time_pnn] %% V. 绘图 figure(1) plot(1:30,T_test,'bo',1:30,result_grnn(:,4),'r-*',1:30,result_pnn(:,4),'k:^') grid on xlabel('测试集样本编号') ylabel('测试集样本类别') string = {'测试集预测结果对比(GRNN vs PNN)';['正确率:' num2str(accuracy_grnn(4)*100) '%(GRNN) vs ' num2str(accuracy_pnn(4)*100) '%(PNN)']}; title(string) legend('真实值','GRNN预测值','PNN预测值') figure(2) plot(1:10,accuracy(1,:),'r-*',1:10,accuracy(2,:),'b:o') grid on xlabel('模型编号') ylabel('测试集正确率') title('10个模型的测试集正确率对比(GRNN vs PNN)') legend('GRNN','PNN') figure(3) plot(1:10,time(1,:),'r-*',1:10,time(2,:),'b:o') grid on xlabel('模型编号') ylabel('运行时间(s)') title('10个模型的运行时间对比(GRNN vs PNN)') legend('GRNN','PNN') |