日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RBF神经网络参数的参数优化(进化算法)+Matlab源码

發(fā)布時間:2023/12/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RBF神经网络参数的参数优化(进化算法)+Matlab源码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

@RBF神經(jīng)網(wǎng)絡參數(shù)的參數(shù)優(yōu)化(進化算法)

1 RBF神經(jīng)網(wǎng)絡引入

1985年,Powell提出了多變量插值的徑向基函數(shù)(RBF)方法。徑向基函數(shù)是一個取值僅僅依賴于離原點距離的實值函數(shù),也就是Φ(x)=Φ(‖x‖),或者還可以是到任意一點c的距離,c點稱為中心點,也就是Φ(x,c)=Φ(‖x-c‖)。任意一個滿足Φ(x)=Φ(‖x‖)特性的函數(shù)Φ都叫做徑向基函數(shù),標準的一般使用歐氏距離(也叫做歐式徑向基函數(shù)),盡管其他距離函數(shù)也是可以的。其公式的一般表現(xiàn)如下,X表示樣本點,Xi 是第i個rbf神經(jīng)元的中心,σi為聚類寬度。

其三層結(jié)構(gòu)如下圖:

2 數(shù)據(jù)集

一個二維兩分類的數(shù)據(jù)集dataset,數(shù)據(jù)為3000*3。前2列為特征,第三列為標簽(取值1或-1)。在訓練時使用前2500個作為訓練集,后500個作為測試集。

2.1 三維展示:

2.2 二維展示:

3 RBF神經(jīng)網(wǎng)絡

1、 傳統(tǒng)方法是使用k-means確定聚類中心和寬度。基于梯度方法更新權(quán)值。
2、不同的rbf中心個數(shù)設(shè)定會影響最終訓練誤差。此方法在初始化rbf個數(shù)、中心和寬度后,將不再改變
3、其函數(shù)實現(xiàn)如下,僅供參考(未經(jīng)核實)

3.1 RBF實現(xiàn) Matlab源碼

clc;clear;close;%%數(shù)據(jù)導入 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個數(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:hideNumsdmin=10000;for j=1:hideNumsddd=(C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2;if(ddd<dmin&&i~=j)dmin=ddd;endenddd(i)=dmin; end%% 初始化隱層輸出矩陣b=zeros(2500,hideNums); %%隱含層輸出矩陣for i=1:2500for j=1:hideNumsb(i,j)=exp(-((data(i,1)-C(j,1))^2+(data(i,2)-C(j,2))^2)/(2*dd(j)));endend%% 迭代循環(huán)體count=1;while(count < maxcount)c=1;while(c<=samplenum)double o;o=0.0;for i=1:hideNumso=o+b(c,i)*w(i,1);enderrortmp=0;errortmp=errortmp+(labels(c,1)-o)^2;errorp(c)=0.5*errortmp;yitao=labels(c,1)-o;for i=1:hideNumsw(i,1)=w(i,1)+alpha*yitao*b(c,i); %%更新權(quán)重矩陣endc=c+1;enddouble tmp;tmp=0.0;for i=1:samplenumtmp=tmp+errorp(i)*errorp(i); endtmp=tmp/(c-1);error(count)=sqrt(tmp); %%均方根誤差if(error(count)<precision) break;endcount=count+1;end%% 計算訓練誤差% 隱含層輸出矩陣train=zeros(2500,hideNums);for i=1:2500for j=1:hideNumstrain(i,j)=exp( -( (data(i,1)-C(j,1))^2+(data(i,2)-C(j,2))^2 )/(2*dd(j)) );endendtrain_count=0;for i=1:2500net= 0.0;for j=1:hideNumsnet=net+train(i,j)*w(j,1);endif((net>0&&data(i,3)==1)||(net<=0&&data(i,3)==-1))train_count=train_count+1;endend%% 計算測試誤差% 隱含層輸出矩陣test=zeros(500,hideNums);for i=2501:3000for j=1:hideNumstest(i-2500,j)=exp( -( (data(i,1)-C(j,1))^2+(data(i,2)-C(j,2))^2 )/(2*dd(j)) );endendtest_count=0;for i=2501:3000net= 0.0;for j=1:hideNumsnet=net+test(i-2500,j)*w(j,1);endif((net>0&&data(i,3)==1)||(net<=0&&data(i,3)==-1))test_count=test_count+1;endendtrain_count;train_error = 1-(train_count/2500)test_count;test_error = 1-(test_count/500)

3.2 結(jié)果統(tǒng)計

使用不同的隱藏層個數(shù)進行訓練,記錄其訓練誤差和測試誤差,其結(jié)果如下表。

總結(jié):不同的rbf神經(jīng)元個數(shù)設(shè)置是會影響最終的誤差,當hideNums=7時訓練誤差和測試誤差均很小,當hideNums=10時,有100%的訓練樣本和測試樣本準確率。

4 進化算法優(yōu)化RBF參數(shù)

基于梯度下降的優(yōu)化方法,其優(yōu)化目標為訓練誤差或者測試誤差等最小化,本質(zhì)是一個優(yōu)化問題。若將rbf的參數(shù):中心,寬度和隱層到輸出層的權(quán)值作為優(yōu)化輸入?yún)?shù),其訓練誤差或是測試誤差最小化作為優(yōu)化目標。便可使用進化算法進行優(yōu)化。其實現(xiàn)可以是:

4.1 main函數(shù)

此時設(shè)置rbf神經(jīng)元個數(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 =[]; % 一個rbf中心需要 dim+2 的參數(shù) , 聚類中心維度dim ,寬度 1 ,權(quán)值矩陣 1 for j=1:hideNumsx_max = [x_max,data_max];x_min = [x_min,data_min]; end % 個體上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_numx_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); %% 計算一次適應度 [~,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_maxdisp(['第',num2str(iter),'次迭代']);x_pop = DE(x_pop,iter,iter_max,x_best,x_min,x_max,d,hideNums); %返回 pop_num*3best_fitness(iter) = x_pop(1,hideNums*(dim+2)+1); x_best = x_pop(1,1:hideNums*(dim+2)); endplot(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實現(xiàn)函數(shù)

此處的DE算法使用自適應的控制參設(shè)置(F ,CR),該方法基于最大迭代次數(shù)非線性的遞增或遞減,變異使用新的策略。該方法來自于某篇國內(nèi)論文[1],簡單易實現(xiàn)。本文僅選擇一種可行的方法實現(xiàn)驗證,并不做過多評價。

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; %復制一份 [m,n]= size(x_pop); %%此處攜帶個體的適應度在最后一列 dim = n-1; %%此時dim 為算法求解的變量數(shù)k = (iter_max-iter)/iter_max; %% 1)變異 % 隨機選取種群中兩個不同的個體,將向量縮放后與待變異的個體進行向量合成 ,得到變異中間體 for i = 1:mparent= choose_parent(i,m); %存放母本1,母本2,母本3的序號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);endend end%% 2) 交叉 % 使用g代種群和其變異中間體進行交叉 for i = 1:mfor j = 1:dimj_rand = floor(rand*dim)+1;if rand > CR && j_rand ~= jx_pop(i,j) = x_temp(i,j);endend 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;endfunction parent = choose_parent(i,m) parent1 = i; flag = 1; while flagparent2 = floor(rand*m);parent3 = floor(rand*m);if(parent2 ~= 0 && parent3 ~= 0)if(parent1 ~= parent2 && parent1 ~= parent3)if(parent2~= parent3)flag = 0;endendend end parent = [parent1,parent2,parent3]; end

4.3 函數(shù)評價

這一大類的進化算法,其實現(xiàn)難點就在于此,如何編寫適應度評估函數(shù)!!
此時使用訓練集預測準確率作為優(yōu)化目標。

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%列向量,每一行代表一個RBF寬度rbf(i).sigma(1:hideNums) = x_pop(i,hideNums*(dim)+1:hideNums*(dim+1))';%矩陣,每一行代表一RBF中心,for k =1:hideNumsrbf(i).mu(k,1:dim) = x_pop(i,(k-1)*(dim)+1:k*(dim));end% 權(quán)重矩陣,權(quán)重矩陣第一列是偏置1rbf(i).weight = [1,x_pop(i,hideNums*(dim+1)+1:hideNums*(dim+2))]; end%給數(shù)據(jù)加x0 =1train_data = d(1:2500,1:dim);for i =1:mfor k = 1:hideNumstemp = (sum((train_data - rbf(i).mu(k,:)).^2,2));rbf(i).z(:,k) = exp( -temp./(2*(rbf(i).sigma(k))^2)); end% 加偏置 Z0 =1rbf(i).z(:,1:hideNums+1) = [ones(2500,1),rbf(i).z]; endfor i = 1:mrbf(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]; endend

4.4 運行結(jié)果

運行完成后最優(yōu)位置:
x_best = [21.2735176022600 7.18976834476119 28.0382989880820 -12.1554405903179 10.2756309083648 41.5810190156907 0.793344450152196 -1.62700237519134];
其適應度迭代情況如下圖:

經(jīng)過10000次的迭代訓練樣本的預測準確計數(shù)達到2500。即能實現(xiàn)完全預測(完全內(nèi)插)。

4.5 測試誤差

上述的優(yōu)化目標為訓練樣本預測準確度,而訓練網(wǎng)絡的好壞還需計算測試誤差。以下提供測試誤差的計算實時函數(shù),此函數(shù)需要在完成優(yōu)化任務后的基礎(chǔ)上進行,即得保留上次優(yōu)化完成后的工作區(qū)變量

[m,n] = size(x_best); dim = n/hideNums - 2; data_num = size(d,1); fitness = [];for i =1:m%列向量,每一行代表一個RBF寬度rbf(i).sigma(1:hideNums) = x_pop(i,hideNums*(dim)+1:hideNums*(dim+1))';%矩陣,每一行代表一RBF中心,for k =1:hideNumsrbf(i).mu(k,1:dim) = x_pop(i,(k-1)*(dim)+1:k*(dim));end% 權(quán)重矩陣,權(quán)重矩陣第一列是偏置1rbf(i).weight = [1,x_pop(i,hideNums*(dim+1)+1:hideNums*(dim+2))]; endtest_data = d(2501:data_num,1:dim);for i =1:mfor k = 1:hideNumstemp = (sum((test_data - rbf(i).mu(k,:)).^2,2));rbf(i).z(:,k) = exp( -temp./(2*(rbf(i).sigma(k))^2));end% 加偏置 Z0 =1rbf(i).z(:,1:hideNums+1) = [ones(500,1),rbf(i).z]; endfor i = 1:mrbf(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

運行結(jié)果為 fitness = 500,即測試樣本預測準確!!

4.6 總結(jié)

此方法得到的RBF神經(jīng)網(wǎng)絡較為輕量,但優(yōu)化耗時較長,僅為一種學習思路。并不提倡使用。

參考文獻
[1] 張延莉. 函數(shù)優(yōu)化問題求解的自適應差分進化算法[J]. 內(nèi)蒙古師范大學學報(自然科學漢文版),2017,46(6):797-799.

總結(jié)

以上是生活随笔為你收集整理的RBF神经网络参数的参数优化(进化算法)+Matlab源码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。