ELM算法模型是最近几年得到广泛重视的模型,它不同于现在广为火热的DNN。 ELM使用传统的三层神经网络,只包含一个隐含层,但又不同于传统的神经网络。ELM是一种简单易用、有效的单隐层前馈神经网络SLFNs学习算法。2006年由南洋理工大学黄广斌副教授提出。传统的神经网络学习算法(如BP算法)需要人为设置大量的网络训练参数,并且很容易产生局部最优解。极限学习机只需要设置网络的隐层节点个数,在算法执行过程中不需要调整网络的输入权值以及隐元的偏置,并且产生唯一的最优解,因此具有学习速度快且泛化性能好的优点。但是隐含层节点个数的设置需要经过人工大量实验得到或者通过最常见的CV方法可以得到。 下面,matlab实现10-fold CV 寻找最优隐含层节点个数的。作为以前工作的一个小记录。ELM使用的是主页http://www.ntu.edu.sg/home/egbhuang/ 源码。源程序包含两个脚本文件cv_para.m 和 Data2txt.m
Description:
@cv_para.m 这个是主程序
结构体:function [best_para]=cv_para(data,para_set)。其中使用到两个参数,data代表我们的完整数据,也就是没有划分训练集和测试集的完整数据。para_set代表隐含层节点个数的一个数组,例如在[1:60]之间选择一个最优的隐含层节点个数。
@Data2txt.m 这个脚本文件是为了满足ELM算法训练将数据转化为源码ELM可以使用的文本文件。数据格式在ELM主页已经给出example。
function [best_para]=cv_para(data,para_set) num_folds=10; % 10-fold cross validation n=size(data,1); n_paras=length(para_set); idx=randperm(n); % idx 代表n个数据中索引的任意排列 n_test=floor(n/num_folds); % n_test: 测试集包含的数据集的个数 test_idx=zeros(num_folds,n_test); % test_idx: 储存num_folds次测试集的索引 train_idx=zeros(num_folds,n-n_test); %train_idx: 原理同test_idx % 下面程序操作的主要是索引,只要将训练集地址和测试集地址划分出来 for i=1:num_folds test_idx(i,:)=idx((i-1)*n_test+1:i*n_test); tmp=1:n; tmp(test_idx(i,:))=[]; train_idx(i,:)=tmp; end best_accs=inf; best_para=1; % 保存最优的隐含节点个数 for i=1:n_paras one_accs=0; for j=1:num_folds % 这里就是将数据集转化为文本文件形式,以满足elm源码的需求 train_data=data(train_idx(j,:),:); test_data=data(test_idx(j,:),:); Data2txt(train_data,'trainfile'); Data2txt(test_data,'testfile'); [TrainingTime, TrainingAccuracy] = elm_train('trainfile', 0, para_set(1,i), 'sig'); [TestingTime, acc] = elm_predict('testfile'); one_accs=one_accs+acc; delete('trainfile'); delete('testfile'); end if(best_accs>one_accs) best_para=para_set(1,i); best_accs=one_accs; end end end @Data2txt 源码 function[]=Data2txt(Data,file) fid=fopen(file,'w');%дÈëÎļþ·¾¶ [m,n]=size(Data); for i=1:1:m for j=1:1:n if j==n fprintf(fid,'%g\n',Data(i,j)); else fprintf(fid,'%g\t',Data(i,j)); end end end fclose(fid); end