@RBF神經(jīng)網(wǎng)絡(luò)參數(shù)的參數(shù)優(yōu)化(進(jìn)化算法)
1 RBF神經(jīng)網(wǎng)絡(luò)引入
1985年,Powell提出了多變量插值的徑向基函數(shù)(RBF)方法。徑向基函數(shù)是一個(gè)取值僅僅依賴于離原點(diǎn)距離的實(shí)值函數(shù),也就是Φ(x)=Φ(‖x‖),或者還可以是到任意一點(diǎn)c的距離,c點(diǎn)稱為中心點(diǎn),也就是Φ(x,c)=Φ(‖x-c‖)。任意一個(gè)滿足Φ(x)=Φ(‖x‖)特性的函數(shù)Φ都叫做徑向基函數(shù),標(biāo)準(zhǔn)的一般使用歐氏距離(也叫做歐式徑向基函數(shù)),盡管其他距離函數(shù)也是可以的。其公式的一般表現(xiàn)如下,X表示樣本點(diǎn),Xi 是第i個(gè)rbf神經(jīng)元的中心,σi為聚類寬度。
其三層結(jié)構(gòu)如下圖:
2 數(shù)據(jù)集
一個(gè)二維兩分類的數(shù)據(jù)集dataset,數(shù)據(jù)為3000*3。前2列為特征,第三列為標(biāo)簽(取值1或-1)。在訓(xùn)練時(shí)使用前2500個(gè)作為訓(xùn)練集,后500個(gè)作為測(cè)試集。
2.1 三維展示:
2.2 二維展示:
3 RBF神經(jīng)網(wǎng)絡(luò)
1、 傳統(tǒng)方法是使用k-means確定聚類中心和寬度?;谔荻确椒ǜ聶?quán)值。
2、不同的rbf中心個(gè)數(shù)設(shè)定會(huì)影響最終訓(xùn)練誤差。此方法在初始化rbf個(gè)數(shù)、中心和寬度后,將不再改變
3、其函數(shù)實(shí)現(xiàn)如下,僅供參考(未經(jīng)核實(shí))
3.1 RBF實(shí)現(xiàn) Matlab源碼
clc;clear;close;
%%數(shù)據(jù)導(dǎo)入
d = load("data1.mat");
data = (d.data)';
dat=data(1:2500,1:2);
labels=data(1:2500,3);
%參數(shù)設(shè)置
inputNums=2;
outputNums=1;
hideNums= 10 %人為設(shè)定rbf個(gè)數(shù)
maxcount=1e4; %max_iter
samplenum = 2500; %training data
precision=0.001; %精度
alpha= 0.01;
%參數(shù)記錄
error=zeros(1,maxcount);
errorp=zeros(1,samplenum);
w=rand(hideNums,outputNums);
%% k-means 確定rbf中心和寬度
[Idx,C]=kmeans(dat,hideNums);
dd=zeros(1,hideNums); %% RBF寬度
for i=1:hideNums
dmin=10000;
for j=1:hideNums
ddd=(C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2;
if(ddd<dmin&&i~=j)
dmin=ddd;
end
end
dd(i)=dmin;
end
%% 初始化隱層輸出矩陣
b=zeros(2500,hideNums); %%隱含層輸出矩陣
for i=1:2500
for j=1:hideNums
b(i,j)=exp(-((data(i,1)-C(j,1))^2+(data(i,2)-C(j,2))^2)/(2*dd(j)));
end
end
%% 迭代循環(huán)體
count=1;
while(count < maxcount)
c=1;
while(c<=samplenum)
double o;
o=0.0;
for i=1:hideNums
o=o+b(c,i)*w(i,1);
end
errortmp=0;
errortmp=errortmp+(labels(c,1)-o)^2;
errorp(c)=0.5*errortmp;
yitao=labels(c,1)-o;
for i=1:hideNums
w(i,1)=w(i,1)+alpha*yitao*b(c,i); %%更新權(quán)重矩陣
end
c=c+1;
end
double tmp;
tmp=0.0;
for i=1:samplenum
tmp=tmp+errorp(i)*errorp(i);
end
tmp=tmp/(c-1);
error(count)=sqrt(tmp); %%均方根誤差
if(error(count)<precision)
break;
end
count=count+1;
end
%% 計(jì)算訓(xùn)練誤差
% 隱含層輸出矩陣
train=zeros(2500,hideNums);
for i=1:2500
for j=1:hideNums
train(i,j)=exp( -( (data(i,1)-C(j,1))^2+(data(i,2)-C(j,2))^2 )/(2*dd(j)) );
end
end
train_count=0;
for i=1:2500
net= 0.0;
for j=1:hideNums
net=net+train(i,j)*w(j,1);
end
if((net>0&&data(i,3)==1)||(net<=0&&data(i,3)==-1))
train_count=train_count+1;
end
end
%% 計(jì)算測(cè)試誤差
% 隱含層輸出矩陣
test=zeros(500,hideNums);
for i=2501:3000
for j=1:hideNums
test(i-2500,j)=exp( -( (data(i,1)-C(j,1))^2+(data(i,2)-C(j,2))^2 )/(2*dd(j)) );
end
end
test_count=0;
for i=2501:3000
net= 0.0;
for j=1:hideNums
net=net+test(i-2500,j)*w(j,1);
end
if((net>0&&data(i,3)==1)||(net<=0&&data(i,3)==-1))
test_count=test_count+1;
end
end
train_count;
train_error = 1-(train_count/2500)
test_count;
test_error = 1-(test_count/500)
3.2 結(jié)果統(tǒng)計(jì)
使用不同的隱藏層個(gè)數(shù)進(jìn)行訓(xùn)練,記錄其訓(xùn)練誤差和測(cè)試誤差,其結(jié)果如下表。
總結(jié):不同的rbf神經(jīng)元個(gè)數(shù)設(shè)置是會(huì)影響最終的誤差,當(dāng)hideNums=7時(shí)訓(xùn)練誤差和測(cè)試誤差均很小,當(dāng)hideNums=10時(shí),有100%的訓(xùn)練樣本和測(cè)試樣本準(zhǔn)確率。
4 進(jìn)化算法優(yōu)化RBF參數(shù)
基于梯度下降的優(yōu)化方法,其優(yōu)化目標(biāo)為訓(xùn)練誤差或者測(cè)試誤差等最小化,本質(zhì)是一個(gè)優(yōu)化問(wèn)題。若將rbf的參數(shù):中心,寬度和隱層到輸出層的權(quán)值作為優(yōu)化輸入?yún)?shù),其訓(xùn)練誤差或是測(cè)試誤差最小化作為優(yōu)化目標(biāo)。便可使用進(jìn)化算法進(jìn)行優(yōu)化。其實(shí)現(xiàn)可以是:
4.1 main函數(shù)
此時(shí)設(shè)置rbf神經(jīng)元個(gè)數(shù)為2。(即 hideNums = 2)
clear;clc;close;
load ('data1.mat');
d = data';
hideNums = 2;
iter_max = 1e4;
pop_num = 100;
best_fitness = zeros(iter_max,1);
[m,n] =size(d);
dim = n-1;
data_max = max(d(:,1:dim));
data_min = min(d(:,1:dim));
sigma_max = max(data_max-data_min);
W_max = 2*ones(1,hideNums);
W_min = -2*ones(1,hideNums);
x_max =[];
x_min =[];
% 一個(gè)rbf中心需要 dim+2 的參數(shù) , 聚類中心維度dim ,寬度 1 ,權(quán)值矩陣 1
for j=1:hideNums
x_max = [x_max,data_max];
x_min = [x_min,data_min];
end
% 個(gè)體上1:hideNums*dim 為聚類中心參數(shù) dim*hideNums+1:(dim+1)*hideNums 為聚類寬度,
% (dim+1)*hideNums+1:(dim+2)*hideNums 為隱層到輸出層權(quán)值
x_max = [x_max,sigma_max*ones(1,hideNums),W_max];
x_min = [x_min,zeros(1,hideNums),W_min];
% initial
for i = 1:pop_num
x_pop(i,1:hideNums*(dim+2)) = rand(1,hideNums*(dim+2)).*(x_max-x_min)+x_min;
end
x_pop(:,hideNums*(dim+2)+1) = eluvate(x_pop,d,hideNums); %% 計(jì)算一次適應(yīng)度
[~,index]=max(x_pop(1,:));
x_best = x_pop(index,1:hideNums*(dim+2));
best_fitness(1) = x_pop(index,hideNums*(dim+2)+1);
%iter
for iter = 2:iter_max
disp(['第',num2str(iter),'次迭代']);
x_pop = DE(x_pop,iter,iter_max,x_best,x_min,x_max,d,hideNums); %返回 pop_num*3
best_fitness(iter) = x_pop(1,hideNums*(dim+2)+1);
x_best = x_pop(1,1:hideNums*(dim+2));
end
plot(best_fitness);
title(['min最優(yōu)值 ',num2str(best_fitness(end))]);
% xlabel(['best [x1,x2] = ',num2str(x_best)]);
ylabel("fitness");
x_best
best_fitness(iter_max);
4.2 DE實(shí)現(xiàn)函數(shù)
此處的DE算法使用自適應(yīng)的控制參設(shè)置(F ,CR),該方法基于最大迭代次數(shù)非線性的遞增或遞減,變異使用新的策略。該方法來(lái)自于某篇國(guó)內(nèi)論文[1],簡(jiǎn)單易實(shí)現(xiàn)。本文僅選擇一種可行的方法實(shí)現(xiàn)驗(yàn)證,并不做過(guò)多評(píng)價(jià)。
function x_pop = DE(x_pop,iter,iter_max,x_best,x_min,x_max,d,hideNums)
% 設(shè)置
F = 1- iter/(iter+iter_max); % 縮放因子
CR = exp((iter-iter_max)/iter_max); % 交叉概率
x_temp = x_pop; %復(fù)制一份
[m,n]= size(x_pop); %%此處攜帶個(gè)體的適應(yīng)度在最后一列
dim = n-1; %%此時(shí)dim 為算法求解的變量數(shù)
k = (iter_max-iter)/iter_max;
%% 1)變異
% 隨機(jī)選取種群中兩個(gè)不同的個(gè)體,將向量縮放后與待變異的個(gè)體進(jìn)行向量合成 ,得到變異中間體
for i = 1:m
parent= choose_parent(i,m); %存放母本1,母本2,母本3的序號(hào)
x_pop(i,1:dim) = k * x_temp(i,1:dim) + (1-k)*x_best + F*(x_temp(parent(2),1:dim) - x_temp(parent(3),1:dim));
for j = 1:dim %%邊界處理
if x_pop(i,j)>x_max(j) || x_pop(i,j)<x_min(j)
x_pop(i,j) = rand*(x_max(j)-x_min(j)) +x_min(j);
end
end
end
%% 2) 交叉
% 使用g代種群和其變異中間體進(jìn)行交叉
for i = 1:m
for j = 1:dim
j_rand = floor(rand*dim)+1;
if rand > CR && j_rand ~= j
x_pop(i,j) = x_temp(i,j);
end
end
end
%% 3) 選擇
% 1v1 選擇。
x_pop(:,dim+1) = eluvate(x_pop(:,1:dim),d,hideNums);
t = x_pop(:,dim+1) > x_temp(:,dim+1);
x_pop = x_pop.*t + x_temp.*(1-t);
% for i =1:m
% if x_pop(i,n+1) > x_temp(i,n+1)
% x_temp(i,:) = x_pop(i,:);
% end
% end
%
% x_pop = x_temp;
end
function parent = choose_parent(i,m)
parent1 = i;
flag = 1;
while flag
parent2 = floor(rand*m);
parent3 = floor(rand*m);
if(parent2 ~= 0 && parent3 ~= 0)
if(parent1 ~= parent2 && parent1 ~= parent3)
if(parent2~= parent3)
flag = 0;
end
end
end
end
parent = [parent1,parent2,parent3];
end
4.3 函數(shù)評(píng)價(jià)
這一大類的進(jìn)化算法,其實(shí)現(xiàn)難點(diǎn)就在于此,如何編寫適應(yīng)度評(píng)估函數(shù)!!
此時(shí)使用訓(xùn)練集預(yù)測(cè)準(zhǔn)確率作為優(yōu)化目標(biāo)。
function fitness = eluvate(x_pop,d,hideNums)
[m,n] = size(x_pop);
dim = n/hideNums - 2;
data_num = size(d,1);
fitness = [];
for i =1:m
%列向量,每一行代表一個(gè)RBF寬度
rbf(i).sigma(1:hideNums) = x_pop(i,hideNums*(dim)+1:hideNums*(dim+1))';
%矩陣,每一行代表一RBF中心,
for k =1:hideNums
rbf(i).mu(k,1:dim) = x_pop(i,(k-1)*(dim)+1:k*(dim));
end
% 權(quán)重矩陣,權(quán)重矩陣第一列是偏置1
rbf(i).weight = [1,x_pop(i,hideNums*(dim+1)+1:hideNums*(dim+2))];
end
%給數(shù)據(jù)加x0 =1
train_data = d(1:2500,1:dim);
for i =1:m
for k = 1:hideNums
temp = (sum((train_data - rbf(i).mu(k,:)).^2,2));
rbf(i).z(:,k) = exp( -temp./(2*(rbf(i).sigma(k))^2));
end
% 加偏置 Z0 =1
rbf(i).z(:,1:hideNums+1) = [ones(2500,1),rbf(i).z];
end
for i = 1:m
rbf(i).out = rbf(i).z*(rbf(i).weight)';
rbf(i).predict = rbf(i).out;
rbf(i).predict(find(rbf(i).out < 0)) = -1;
rbf(i).predict(find(rbf(i).out >= 0)) = 1;
temp = rbf(i).predict.*d(1:2500,dim+1);
index = find(temp == 1);
rbf(i).count = length(index);
fitness = [fitness;rbf(i).count];
end
end
4.4 運(yùn)行結(jié)果
運(yùn)行完成后最優(yōu)位置:
x_best = [21.2735176022600 7.18976834476119 28.0382989880820 -12.1554405903179 10.2756309083648 41.5810190156907 0.793344450152196 -1.62700237519134];
其適應(yīng)度迭代情況如下圖:
經(jīng)過(guò)10000次的迭代訓(xùn)練樣本的預(yù)測(cè)準(zhǔn)確計(jì)數(shù)達(dá)到2500。即能實(shí)現(xiàn)完全預(yù)測(cè)(完全內(nèi)插)。
4.5 測(cè)試誤差
上述的優(yōu)化目標(biāo)為訓(xùn)練樣本預(yù)測(cè)準(zhǔn)確度,而訓(xùn)練網(wǎng)絡(luò)的好壞還需計(jì)算測(cè)試誤差。以下提供測(cè)試誤差的計(jì)算實(shí)時(shí)函數(shù),此函數(shù)需要在完成優(yōu)化任務(wù)后的基礎(chǔ)上進(jìn)行,即得保留上次優(yōu)化完成后的工作區(qū)變量。
[m,n] = size(x_best);
dim = n/hideNums - 2;
data_num = size(d,1);
fitness = [];
for i =1:m
%列向量,每一行代表一個(gè)RBF寬度
rbf(i).sigma(1:hideNums) = x_pop(i,hideNums*(dim)+1:hideNums*(dim+1))';
%矩陣,每一行代表一RBF中心,
for k =1:hideNums
rbf(i).mu(k,1:dim) = x_pop(i,(k-1)*(dim)+1:k*(dim));
end
% 權(quán)重矩陣,權(quán)重矩陣第一列是偏置1
rbf(i).weight = [1,x_pop(i,hideNums*(dim+1)+1:hideNums*(dim+2))];
end
test_data = d(2501:data_num,1:dim);
for i =1:m
for k = 1:hideNums
temp = (sum((test_data - rbf(i).mu(k,:)).^2,2));
rbf(i).z(:,k) = exp( -temp./(2*(rbf(i).sigma(k))^2));
end
% 加偏置 Z0 =1
rbf(i).z(:,1:hideNums+1) = [ones(500,1),rbf(i).z];
end
for i = 1:m
rbf(i).out = rbf(i).z*(rbf(i).weight)';
rbf(i).predict = rbf(i).out;
rbf(i).predict(find(rbf(i).out < 0)) = -1;
rbf(i).predict(find(rbf(i).out >= 0)) = 1;
temp = rbf(i).predict.*d(2501:data_num,dim+1);
index = find(temp == 1);
rbf(i).count = length(index);
fitness = [fitness;rbf(i).count];
end
fitness
運(yùn)行結(jié)果為 fitness = 500,即測(cè)試樣本預(yù)測(cè)準(zhǔn)確!!
4.6 總結(jié)
此方法得到的RBF神經(jīng)網(wǎng)絡(luò)較為輕量,但優(yōu)化耗時(shí)較長(zhǎng),僅為一種學(xué)習(xí)思路。并不提倡使用。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-426119.html
參考文獻(xiàn)
[1] 張延莉. 函數(shù)優(yōu)化問(wèn)題求解的自適應(yīng)差分進(jìn)化算法[J]. 內(nèi)蒙古師范大學(xué)學(xué)報(bào)(自然科學(xué)漢文版),2017,46(6):797-799.文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-426119.html
到了這里,關(guān)于RBF神經(jīng)網(wǎng)絡(luò)參數(shù)的參數(shù)優(yōu)化(進(jìn)化算法)+Matlab源碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!