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;
}