国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

RBF神經(jīng)網(wǎng)絡(luò)參數(shù)的參數(shù)優(yōu)化(進(jìn)化算法)+Matlab源碼

這篇具有很好參考價(jià)值的文章主要介紹了RBF神經(jīng)網(wǎng)絡(luò)參數(shù)的參數(shù)優(yōu)化(進(jìn)化算法)+Matlab源碼。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

@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為聚類寬度。
RBF神經(jīng)網(wǎng)絡(luò)參數(shù)的參數(shù)優(yōu)化(進(jìn)化算法)+Matlab源碼
其三層結(jié)構(gòu)如下圖:RBF神經(jīng)網(wǎng)絡(luò)參數(shù)的參數(shù)優(yōu)化(進(jìn)化算法)+Matlab源碼

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 三維展示:

RBF神經(jīng)網(wǎng)絡(luò)參數(shù)的參數(shù)優(yōu)化(進(jìn)化算法)+Matlab源碼

2.2 二維展示:

RBF神經(jīng)網(wǎng)絡(luò)參數(shù)的參數(shù)優(yōu)化(進(jìn)化算法)+Matlab源碼

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é)果如下表。
RBF神經(jīng)網(wǎng)絡(luò)參數(shù)的參數(shù)優(yōu)化(進(jìn)化算法)+Matlab源碼
總結(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)度迭代情況如下圖:
RBF神經(jīng)網(wǎng)絡(luò)參數(shù)的參數(shù)優(yōu)化(進(jìn)化算法)+Matlab源碼

經(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í)思路。并不提倡使用。

參考文獻(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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包