1. 用matlab編程實現用RBF神經網路預測客流
%% 清空環境變數
clc
clear
close all
%%
a=load('walk1.txt');%讀取數據 % xlsread(『 『);讀取execl文件
data=a(1:500,5);%樣本數據和測試數據
order=5;%輸入數據個數
snum=200;%訓練樣本數
step=3;%預測步數
input=data(1:snum);
output=data(1+order+step:snum+order+step);
delay=200;%訓練樣本與測試樣本間時延
input1=data(1+delay:snum+delay);
output1=date(1+order+delay+step:snum+order+delay+step);
input_train=zeros(snum,order);input_test=zeros(snum,order);
for i=1:snum
input_train(i,:)=data(i:i+order-1);
input_test(i,:)=data(i+delay:i+delay+order-1);
end
%% RBF神經網路預測
%% 網路建立和訓練
net=newrb(input_train',output',0.001,100,300,25);
% net=newrbe(input_train',output',100);
% net=newgrnn(input_train',output',10);
%% 網路驗證
ty=sim(net,input_train');
errR=abs(output-ty');
ty1=sim(net,input_test');
errR1=abs(output1-ty1');
figure
plot(1:snum,output1,'r*-');
hold on;
plot(1:snum,ty1','kx-');
title('三步RBF');
xlabel('數據序號');
ylabel('數據值');
legend('實際值','預測值');
figure
subplot(2,1,1);
stem(1:snum,errR1,'r*');
title('三步RBF');
xlabel('數據序號');
ylabel('絕對誤差值');
rbfmean = mean(errR1)
subplot(2,1,2);
stem(1:snum,
abs(errR1./output1),'r*');
title('三步RBF');
xlabel('數據序號');
ylabel('絕對誤差率');
rbfpmean = mean(abs(errR1./output1))*100%%
自己對著改一下。
2. matlab中用RBF神經網路做預測的代碼怎麼寫
clc;
clearall;
closeall;
%%----
c_1=[00];
c_2=[11];
c_3=[01];
c_4=[10];
n_L1=20;%numberoflabel1
n_L2=20;%numberoflabel2
A=zeros(n_L1*2,3);
A(:,3)=1;
B=zeros(n_L2*2,3);
B(:,3)=0;
%createrandompoints
fori=1:n_L1
A(i,1:2)=c_1+rand(1,2)/2;
A(i+n_L1,1:2)=c_2+rand(1,2)/2;
end
fori=1:n_L2
B(i,1:2)=c_3+rand(1,2)/2;
B(i+n_L2,1:2)=c_4+rand(1,2)/2;
end
%showpoints
scatter(A(:,1),A(:,2),[],'r');
holdon
scatter(B(:,1),B(:,2),[],'g');
X=[A;B];
data=X(:,1:2);
label=X(:,3);
%%Usingkmeanstofindcintervector
n_center_vec=10;
rng(1);
[idx,C]=kmeans(data,n_center_vec);
holdon
scatter(C(:,1),C(:,2),'b','LineWidth',2);
%%Calulatesigma
n_data=size(X,1);
%calculateK
K=zeros(n_center_vec,1);
fori=1:n_center_vec
K(i)=numel(find(idx==i));
end
%
%thencalucatesigma
sigma=zeros(n_center_vec,1);
fori=1:n_center_vec
[n,d]=knnsearch(data,C(i,:),'k',K(i));
L2=(bsxfun(@minus,data(n,:),C(i,:)).^2);
L2=sum(L2(:));
sigma(i)=sqrt(1/K(i)*L2);
end
%%Calutateweights
%kernelmatrix
k_mat=zeros(n_data,n_center_vec);
fori=1:n_center_vec
r=bsxfun(@minus,data,C(i,:)).^2;
r=sum(r,2);
k_mat(:,i)=exp((-r.^2)/(2*sigma(i)^2));
end
W=pinv(k_mat'*k_mat)*k_mat'*label;
y=k_mat*W;
%y(y>=0.5)=1;
%y(y<0.5)=0;
%%
[W1,sigma1,C1]=RBF_training(data,label,10);
y1=RBF_predict(data,W,sigma,C1);
[W2,sigma2,C2]=lazyRBF_training(data,label,2);
y2=RBF_predict(data,W2,sigma2,C2);
(2)rbf神經網路程序擴展閱讀
matlab的特點
1、具有完備的圖形處理功能,實現計算結果和編程的可視化;
2、友好的用戶界面及接近數學表達式的自然化語言,使學者易於學習和掌握;
3、功能豐富的應用工具箱(如信號處理工具箱、通信工具箱等) ,為用戶提供了大量方便實用的處理工具。
3. 利用RBF神經網路做預測
在命令欄敲nntool,按提示操作,將樣本提交進去。
還有比較簡單的是用廣義RBF網路,直接用grnn函數就能實現,基本形式是y=grnn(P,T,spread),你可以用help grnn看具體用法。GRNN的預測精度是不錯的。
廣義RBF網路:從輸入層到隱藏層相當於是把低維空間的數據映射到高維空間,輸入層細胞個數為樣本的維度,所以隱藏層細胞個數一定要比輸入層細胞個數多。從隱藏層到輸出層是對高維空間的數據進行線性分類的過程,可以採用單層感知器常用的那些學習規則,參見神經網路基礎和感知器。
注意廣義RBF網路只要求隱藏層神經元個數大於輸入層神經元個數,並沒有要求等於輸入樣本個數,實際上它比樣本數目要少得多。因為在標准RBF網路中,當樣本數目很大時,就需要很多基函數,權值矩陣就會很大,計算復雜且容易產生病態問題。另外廣RBF網與傳統RBF網相比,還有以下不同:
1.徑向基函數的中心不再限制在輸入數據點上,而由訓練演算法確定。
2.各徑向基函數的擴展常數不再統一,而由訓練演算法確定。
3.輸出函數的線性變換中包含閾值參數,用於補償基函數在樣本集上的平均值與目標值之間的差別。
因此廣義RBF網路的設計包括:
1.結構設計--隱藏層含有幾個節點合適
2.參數設計--各基函數的數據中心及擴展常數、輸出節點的權值。
4. 用c語言編寫RBF神經網路程序
RBF網路能抄夠逼近任意的非線性函數,可以處理系統內的難以解析的規律性,具有良好的泛化能力,並有很快的學習收斂速度,已成功應用於非線性函數逼近、時間序列分析、數據分類、模式識別、信息處理、圖像處理、系統建模、控制和故障診斷等。
簡單說明一下為什麼RBF網路學習收斂得比較快。當網路的一個或多個可調參數(權值或閾值)對任何一個輸出都有影響時,這樣的網路稱為全局逼近網路。由於對於每次輸入,網路上的每一個權值都要調整,從而導致全局逼近網路的學習速度很慢。BP網路就是一個典型的例子。
如果對於輸入空間的某個局部區域只有少數幾個連接權值影響輸出,則該網路稱為局部逼近網路。常見的局部逼近網路有RBF網路、小腦模型(CMAC)網路、B樣條網路等。
附件是RBF神經網路的C++源碼。
5. 用matlab神經網路工具箱構建RBF神經網路,跪求源程序!
希望對您有用
clc
clear
close all
%---------------------------------------------------
% 產生訓練樣本與測試樣本,每一列為一個樣本
P1 = [rand(3,5),rand(3,5)+1,rand(3,5)+2];
T1 = [repmat([1;0;0],1,5),repmat([0;1;0],1,5),repmat([0;0;1],1,5)];
P2 = [rand(3,5),rand(3,5)+1,rand(3,5)+2];
T2 = [repmat([1;0;0],1,5),repmat([0;1;0],1,5),repmat([0;0;1],1,5)];
%---------------------------------------------------
% 歸一化
[PN1,minp,maxp] = premnmx(P1);
PN2 = tramnmx(P2,minp,maxp);
%---------------------------------------------------
% 訓練
switch 2
case 1
% 神經元數是訓練樣本個數
spread = 1; % 此值越大,覆蓋的函數值就大(默認為1)
net = newrbe(PN1,T1,spread);
case 2
% 神經元數逐步增加,最多就是訓練樣本個數
goal = 1e-4; % 訓練誤差的平方和(默認為0)
spread = 1; % 此值越大,需要的神經元就越少(默認為1)
MN = size(PN1,2); % 最大神經元數(默認為訓練樣本個數)
DF = 1; % 顯示間隔(默認為25)
net = newrb(PN1,T1,goal,spread,MN,DF);
case 3
spread = 1; % 此值越大,需要的神經元就越少(默認為1)
net = newgrnn(PN1,T1,spread);
end
%---------------------------------------------------
% 測試
Y1 = sim(net,PN1); % 訓練樣本實際輸出
Y2 = sim(net,PN2); % 測試樣本實際輸出
Y1 = full(compet(Y1)); % 競爭輸出
Y2 = full(compet(Y2));
%---------------------------------------------------
% 結果統計
Result = ~sum(abs(T1-Y1)) % 正確分類顯示為1
Percent1 = sum(Result)/length(Result) % 訓練樣本正確分類率
Result = ~sum(abs(T2-Y2)) % 正確分類顯示為1
Percent2 = sum(Result)/length(Result) % 測試樣本正確分類率
6. 有哪位RBF神經網路高手能幫我寫一下在RBF用聚類方法求中心時的程序啊!謝謝啦
我參照《神經網路原理》的演算法描述寫的,不知道對不對,歡迎探討。
void CRBFNN::KMeansCluster(size_t K)
{
if( K >m_nPatternNum)
return;
int* vecLabel= new int[m_nPatternNum];
//step1 初始化 選擇K個初始不同的中心點
RandomSelCenter(K);
while(true)
{
memset(vecLabel,-1,sizeof(int)*m_nPatternNum);
size_t rnd = rand()%m_nPatternNum;//抽取樣本 以某種概率抽取樣本向量
float fMin = (float)INT_MAX;
float fNum = 0;
//step2 相似匹配 _input[rnd]離_center[j]最近,則標記為j
for(int j=0; j<(int)K; j++)
{
fNum = 0;
for(size_t k = 0; k<m_nInputNum; k++)
fNum += (_input[rnd][k]-_center[j][k])*(_input[rnd][k]-_center[j][k]);
if(fNum < fMin)
{
fMin = fNum;
vecLabel[rnd] = j;
}
}
//step3 更新中心 重新計算_center
CMatrix lastCenter = _center;//一個對象需要通過另外一個對象進行初始化,調用拷貝初始化
for(int i=0; i<(int)K; i++)
{
if(vecLabel[rnd] == i)
{
for(size_t j=0; j<m_nInputNum; j++)
_center[i][j] = _center[i][j] + (_input[rnd][j]-_center[i][j])*0.1f;//學習率0.1
}
}
//step4 _center無明顯變化退出
fNum = 0;
for(int i=0; i<(int)K; i++)
{
for(size_t k = 0; k<m_nInputNum; k++)
fNum += (_center[i][k]-lastCenter[i][k])*(_center[i][k]-lastCenter[i][k]);
}
if(fNum < 1e-3)
break;
}
delete[] vecLabel;
}