基于粒子群算法优化广义神经网络(岩爆预测实例)

粒子群算法优化广义神经网络(PSO_GRNN)

这里分享最近研究重现的一篇文章,核心算法是广义神经网络GRNN,依据岩石的抗拉强度、弹性能量指数等四个特征对岩爆危险等级的一种预测。算法思路比较简单,论文《基于粒子群算法和广义回归神经网络的岩爆预测 》欢迎大家引用原文~

这里附上主程序,完整代码可从这里下载://

download.csdn.net/download/weixin_40405758/12123029

 

论文摘要:岩爆是岩石深部开挖中一种常见的工程地质灾害。为评价岩爆发生的可能性,提出一种基于粒子群算法和广义回归神经网络模型(PSO-GRNN 模型)的岩爆预测方法。该方法利用已有岩爆数据,通过神经网络技术建立回
归模型,采用粒子群算法对模型参数进行优化,减少人为因素对神经网络设计的影响。据此方法,在能量理论的
基础上,选取洞壁围岩最大切向应力、岩石单轴抗压强度、抗拉强度和弹性能量指数作为主要影响因素,利用国
内外 26 组已有工程数据建立岩爆预测的 PSO-GRNN 模型。通过对苍岭隧道和冬瓜山铜矿岩爆预测的工程实例分
析验证该方法的可行性和适用性。所提方法可为类似工程的岩爆预测提供参考。 
 

%%将PSO_GRNN看做是一个神经网络模型的话,即一个函数,那么接下来加入交叉验证就方便多了
%加入4折交叉验证:
%主要问题是查看其数据的应用
%程序说明
%主程序:Cross_PSO_GRNN.m
%PSO_GRNN.m为粒子群优化模型
%此程序仅为示例
%版权归作者所有,未经作者同意不得转载
clc;clear;
data_all=textread('data1.txt');%读取数据
data_cl=textread('cldata.txt');%读取苍岭隧道数据作为模型输出值
%获得网络训练数据
%使用交叉验证处理训练集样本,找到最适合的某组数据
%数据集分类
 P_train=data_all(:,2:5)
 T_train=data_all(:,6)
 [M,N]=size(data_all);
 indices=crossvalind('Kfold',M,4);
 P_test_cl=data_cl(:,1:4)'; %实验工程数据 
 Result_out=[];
 Best_fitness_cv=[];
 G_Best_position_cv=[];
 Gbest_position_cv=[];
  
 for i=1:4  %2折交叉验证训练过程,首先将训练数据集分为两类
       test=(indices==i);train=~test;
       P_train_first_cv=P_train(train,:)';    
       T_train_first_cv=T_train(train,:)'; 
       P_test_second_cv=P_train(test,:)';
       T_test_second_cv=T_train(test,:)';
       %调用PSO_GRNN获取相应参数
       [Gbest_position,Best_fitness,G_Best_position]=PSO_GRNN(P_train_first_cv,T_train_first_cv,P_test_second_cv,T_test_second_cv,P_test_cl); 
       Gbest_position_cv=[Gbest_position_cv;Gbest_position];
       Best_fitness_cv=[Best_fitness_cv;Best_fitness];
       G_Best_position_cv=[G_Best_position_cv;G_Best_position];
       %训练网络
  net=newgrnn(P_train_first_cv,T_train_first_cv,Gbest_position);
  %测试网络
  T_out_cl=sim(net,P_test_cl);
  disp(T_out_cl);disp(Gbest_position);
  Result_out=[Result_out;T_out_cl];
   end
 n=1:size(P_test_cl,2);
 Num=size(Best_fitness_cv,2);
%画图进行比较
figure(1)
plot(n,Result_out(1,:),'-ro',n,Result_out(2,:),'-bo',n,Result_out(3,:),'-*b',n,Result_out(4,:),'-*r');
legend('第一组','第二组','第三组','第四组');
% plot(1:4,Result_out(4:8),'-bo');
title('预测值');
xlabel('次序');
ylabel('预测值');
figure(2);
plot(1:Num,Best_fitness_cv(1,:),'-ro',1:Num,Best_fitness_cv(2,:),'-bo',1:Num,Best_fitness_cv(3,:),'-*b',1:Num,Best_fitness_cv(4,:),'-*r');
legend('第一组','第二组','第三组','第四组');
title('最优适应度值');
xlabel('迭代次数');
ylabel('适应度值');
figure(3);
plot(1:Num,G_Best_position_cv(1,:),'-ro',1:Num,G_Best_position_cv(2,:),'-bo',1:Num,G_Best_position_cv(3,:),'-*b',1:Num,G_Best_position_cv(4,:),'-*r');
legend('第一组','第二组','第三组','第四组');
title('粒子最优位置');
xlabel('迭代次数');
ylabel('光滑因子');
%画柱状图
figure(4)
b= bar(Result_out');
grid  on;
hold on  
set(gca,'XGrid','off');
ch=get(b,'children');
set(gca,'XTickLabel',{'1','2','3','4'});
%set(gca,'YTickLabel',{'0','0.25','0.5','0.75','1'});
legend('第一组','第二组','第三组','第四组');
ylabel('岩爆预测值');
xlabel('次序')
%实验结论:出现样本数据对结果影响太大的情况,即同一份数据不同的选择结果会不同甚至完全相反,那么,请思考方法还能信任?

 

你可能感兴趣的:(机器学习,算法)