用matlab编程实现用RBF神经网络预测客流

用matlab编程实现用RBF神经网络预测客流,第1张

%% 清空环境变量

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%%

自己对着改一下。

clc

clearall

closeall

%%----BuildatrainingsetofasimilarversionofXOR

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=[AB]

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

%UsingknnsearchtofindKnearestneighborpointsforeachcentervector

%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

%%trainingfunctionandpredictfunction

[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)

扩展资料

matlab的特点

1、具有完备的图形处理滚闷渣功能,实现罩伏计算结果和编程的可视化;

2、友好的用户界面及接近大悄数学表达式的自然化语言,使学者易于学习和掌握;

3、功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等) ,为用户提供了大量方便实用的处理工具。

参考资料来源:百度百科—MATLAB

给你个RBF预测的运橡程序,你根据程序自己改下就可以了

clear all

x=[]

T=[]

x(1)=0.22

k=4

n=900

N=400

% 产生logistic序列,前100个去除

for i=1:n

x(i+1)=k*x(i)*(1-x(i))

end

X(1:800)=x(101:900)

% 用X的前400个数据训练RBF神经网络

for j=1:N

P(1:8,j)=X(j:j+7)'

end

T=X(9:408) % 目标数据

net1=newrb(P,T,0.001,1) % 训练RBF神经网络

N1=300

% 选取X的400—700个数据进行RBF神经网络检验

for j=1:N1

P1(1:8,j)=X(j+400:j+7+400)'

end

T1=X(409:708) % 目标数据

%仿真验证

a=sim(net1,P1) % 对检验数据的预测结果 %sim是仿真该网络的意思

e = T1-a % 一步预测误差

mse = sqrt(e*e')/size(e,2)% 均方误差 Mean Square Error

%画图描绘仿真结果

figure(2)

plot(X(1:200))

axis([1 200 -0.1 1.1])

title('logistic混沌序列')

xlabel('t')

ylabel('magnitude')

figure(3)

plot(1:300,T1,'b',1:300,a,'r*')

h = legend('混沌序列','RBF神经网络一步预测值')

axis([1 300 -0.5 1.5])

hold on

title('混沌序列与一步预测值')

xlabel('t')

ylabel('magnitude')

figure(4)

plot(e,'b-')

axis([1 300 -0.02 0.02])

title('预测误差e')

xlabel('t')

ylabel('magnitude')

至于你要K均值聚类的话:

%一个最基本的rbf算法,学习算猛悄锋法采用伪逆函数

%

%

%

%

%

%

%

%

%

%

%

%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all

close all

clc

%定义用到的变量

r=1 %领域半径,人为设定

nodenum=0 %隐层节点数,由实际数据与r共同决定

inputdata=[]%输入矩阵

inputpath=' ' %存储原始输入数据的路径

nodeout=[] %隐层输入阵

netout=[] %网络输出阵

weight=[] %输出权值阵,也是唯一的权值

inputnum=0 %输入维数

outputnum=0 %输出维数

center=[] %聚类中心

numtrain=0 %学习样本的个枝晌数

row=0 %学习样本的个数

simrow=0%全部样本的个数

numtest=0 %泛化样本的个数

strength=1 %归一化处理时用到的范围,一般为1

yout=[] %输出的期望值

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%变量的初始化

r=1

inputnum=9

inputpath='e:\yinjia\data\yearsun.dat'

outputnum=1

simrow=290

source=load(inputpath)

%保存一个source的副本,为反归一化做准备

copysource=source

%归一化处理

source=normalize(source,strength)

yout=source(inputnum+1:simrow+inputnum)

inputdata=phasespace(source,inputnum,simrow)

row=250

numtrain=row

numtest=simrow-row

%把第一人输入变量定为初始的中心

%中心的位置在初始化后,不会再变化

center=inputdata(1,:)'

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%开始进行简单的聚类

%其基本思想是:给定一个固定的邻域半径,在中心点邻域半径内的点就算作

%是该邻域的点;半径外的点,取第一个不是半径内的点做为新的中心点

%设计一个函数iscenter,来计算一个点是否为中心点。

for step=2:row

if iscenter(inputdata(step,:)',center,r)

center=[center inputdata(step,:)']

nodenum=nodenum+1

end % this end for iscenter(inputdata(step,:))

end % this end for step=2:row

%聚类完成.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%准备进行神经网络的前向计算

[centerrow nodenum]=size(center)

%网络的初始化

nodeout=zeros(row,nodenum)

netout=zeros(row,outputnum)

weight=zeros(nodenum,outputnum)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%网络的计算

for step=1:row

for step1=1:nodenum

nodeout(step,step1)=GaussRadialBasisFunction(inputdata(step,:)',...

center(:,step1),r)

end % this end for step1=1:nodenum

end %this end for step=1:row

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%用伪逆来计算权值

weight=pinv(nodeout)*yout(1:250)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%进行仿真

for step=1:simrow

for step1=1:nodenum

nodeout(step,step1)=GaussRadialBasisFunction(inputdata(step,:)',...

center(:,step1),r)

end % this end for step1=1:nodenum

end %this end for step=1:simrow

mydata=nodeout*weight

%反归一化

mydata=unnomal(mydata,copysource,strength)

rldata=copysource(inputnum+1:inputnum+simrow)

plot(rldata)hold onplot(mydata,'r')

%计算一个评价函数

rmsetest=(norm(rldata(numtrain+1:simrow)-mydata(numtrain+1:simrow))...

^2/(numtest-1))^0.5

还有几段小程序,你应该可以自己编写出来的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12533581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存