注:下有视频讲解,可供参考
单层前馈神经网络(SLFN)以其良好的学习能力在许多领域得到了广泛的应用,然而传统的学习算法,如BP等固有的一些缺点,成为制约其发展的主要瓶颈,前馈神经网络大多采用梯度下降法,该方法存在以下几个方面的缺点和不足:
1、训练速度慢。由于梯度下降法需要多次迭代,从而达到修正权值和阈值的目的,因此训练过程耗时较长;
2、容易陷入局部极小值,无法到达全局最小;
3、学习率的选择敏感,学习率对神经网络的性能影响较大,必须选择合适的才能达到较为理想的效果,太小则算法的收敛速度很慢,训练过程耗时较长,太大,则训练过程可能不稳定。
本文将介绍一种新的SLFN的算法,极限学习机,该算法将随机产生输入层和隐含层间的连接权值和隐含层神经元的阈值,且在训练过程中无需调整,只需要设置隐含层的神经元的个数,便可以获得唯一最优解,与传统的训练方法相比,该方法具有学习速率快、泛化性能好等优点。
1.确定隐含层神经元个数,随机设定输入层与隐含层的连接权值ω和隐含层神经元阈值b
2.选择一个无线可微函数作为隐含层激活函数,进一步计算隐含层输出矩阵H=G(ωixi+bi) 。
3.计算输出层权值 β^=H+Y
极限学习机与传统BP神经网络不同
ELM与BP都是基于前馈神经网络的架构之下的,他们的不同之处在于学习的方法不同,BP是通过梯度下降法,利用反向传播的方式进行的学习,需要不断地进行迭代来更新权重和阈值,而ELM则是通过增加隐层节点的个数来达到学习的目的,隐层节点的个数一般是根据样本的个数来确定的,巧妙地将隐含层的个数与样本的个数进行了联系。其实在许多前向神经网络中,默认的最大的隐层节点的个数就是样本数。它不需要进行迭代,所以速度就比BP要快很多。ELM的精华之处就在于那两条他所依赖的定理,这些定理决定了他的学习方式。输入层和隐含层之间的权重w和隐含层节点的阈值b是通过随机初始化得到的,而且不需要进行调整。一般隐层节点的个数与样本的个数相同(在样本数比较少的情况下)。
ELMtrain的过程就是为了计算隐含层与输出层之间的权重,ELMpredict则是利用隐含层与输出层之间的权重来计算输出Y,当然也会将ELMtrain中的随机初始化的输入节点和隐层节点之间的权值和隐层节点的阈值照搬过来,不会再进行随机初始化。
clear all clc
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
[IW,B,LW,TF,TYPE] = elmtrain(P_train,T_train,20,'sig',1);
T_sim_1 = elmpredict(P_train,IW,B,LW,TF,TYPE); T_sim_2 = elmpredict(P_test,IW,B,LW,TF,TYPE);
result_1 = [T_train' T_sim_1']; result_2 = [T_test' T_sim_2'];
1. 训练集正确率
k1 = length(find(T_train == T_sim_1)); n1 = length(T_train); Accuracy_1 = k1 / n1 * 100; disp(['训练集正确率Accuracy = ' num2str(Accuracy_1) '%(' num2str(k1) '/' num2str(n1) ')'])
训练集正确率Accuracy = 100%(120/120)
2. 测试集正确率
k2 = length(find(T_test == T_sim_2)); n2 = length(T_test); Accuracy_2 = k2 / n2 * 100; disp(['测试集正确率Accuracy = ' num2str(Accuracy_2) '%(' num2str(k2) '/' num2str(n2) ')'])
测试集正确率Accuracy = 93.3333%(28/30)
figure(2) plot(1:30,T_test,'bo',1:30,T_sim_2,'r-*') grid on xlabel('测试集样本编号') ylabel('测试集样本类别') string = {'测试集预测结果对比(ELM)';['(正确率Accuracy = ' num2str(Accuracy_2) '%)' ]}; title(string) legend('真实值','ELM预测值')
极限学习机
分享人:徐田田
分享时间:2022/4/19
分享平台:腾讯会议