我现在在做RBF神经网络k-means算法与RLS递归二乘法结合训练,求哪位大神能给个RLS的算法的MTALAB程序

我现在在做RBF神经网络k-means算法与RLS递归二乘法结合训练,求哪位大神能给个RLS的算法的MTALAB程序,第1张

直接用广义RBF网络我感觉比较方便,而且可以直接用newgrnn(P,T,spread)函数。

RLS算法的MATLAB程序在附件,你可以参考下。

小二乘大约是1795年高斯在他那星体运动轨道预报工作中提出的[1]。后来,最小二乘法就成了估计理论的奠基石。由于最小二乘法结构简单,编制程序也不困难,所以它颇受人们重视,应用相当广泛。

如用标准符号,最小二乘估计可被表示为:

AX=B (2-43)

上式中的解是最小化 ,通过下式中的伪逆可求得:

A'AX=A'B (2-44)

(A'A)^(-1)A'AX=(A'A)^(-1)A'B (2-45)

由于

(A'A)^-1A'A=I (2-46)

所以有

X=(A'A)^(-1)A'B (2-47)

此即最小二乘的一次完成算法,现代的递推算法,更适用于计算机的在线辨识。

最小二乘是一种最基本的辨识方法,但它具有两方面的缺陷[1]:一是当模型噪声是有色噪声时,最小二乘估计不是无偏、一致估计;二是随着数据的增长,将出现所谓的“数据饱和”现象。针对这两个问题,出现了相应的辨识算法,如遗忘因子法、限定记忆法、偏差补偿法、增广最小二乘、广义最小二乘、辅助变量法、二步法及多级最小二乘法等。

%%%%% RBF网络PID %%%%%

clear all

close all

T=0.005%采样周期

sys=tf(1,[0.0015,0.08,1])

dsys=c2d(sys,T,'z')

[num,den]=tfdata(dsys,'v')

%%%%% 学习率初值给定 %%%%%

xite=0.05%学习速率η

alfa=0.1%平滑因子

belte=0.15

x=[0,0,0]'%网络的输入向量

H=3%隐含层节点数

ci=28*ones(3,H)

bi=40*ones(H,1)

w=30*ones(H,1)%网络的权向量

h=zeros(H,1)%隐层输出

ci_1=cici_2=ci_1ci_3=ci_2

bi_1=bibi_2=bi_1bi_3=bi_2

w_1=ww_2=w_1w_3=w_2

u_1=0y_1=0%函数中间变量

u_2=0y_2=0%函数中间变量

xc=[0,0,0]'%高斯函数的输入

error_1=0error_2=0%误差初始化

%%%%% PID初始参数给定 %%%%%

kp=1%比例系数

ki=0.1%积分系数

kd=0.01%微分系数

kp_1=kp

ki_1=ki

kd_1=kd

xitekp=0.5

xiteki=0.5

xitekd=0.5

for k=1:1:1000%采样

time(k)=k*T

rin(k)=1%输入指令信号

yout(k)=-den(3)*y_2-den(2)*y_1+num(3)*u_2+num(2)*u_1%二阶被控对象

for j=1:1:H

h(j)=exp(-norm(x-ci_1(:,j))^2/(2*bi_1(j)*bi_1(j)))%为高斯函数

end

ymout(k)=w_1'*h%辨识网络的输出

d_w=0*w% Defining matrix number of d_w equal to that of w

for j=1:1:H

d_w(j)=xite*(yout(k)-ymout(k))*h(j)

end

w=w_1+d_w+alfa*(w_1-w_2)+belte*(w_2-w_3)%输出权的迭代算法

d_bi=0*bi

for j=1:1:H

d_bi(j)=xite*(yout(k)-ymout(k))*w_1(j)*h(j)*(bi_1(j)^-3)*norm(x-ci_1(:,j))^2

end

bi=bi_1+d_bi+alfa*(bi_1-bi_2)+belte*(bi_2-bi_3)%节点中心的迭代算法

for j=1:1:H

for i=1:1:3

d_ci(i,j)=xite*(yout(k)-ymout(k))*w_1(j)*h(j)*(x(i)-ci_1(i,j))*(bi_1(j)^-2)

end

end

ci=ci_1+d_ci+alfa*(ci_1-ci_2)+belte*(ci_2-ci_3)%节点基宽参数的迭代算法

%%%%%%%%%%%%%%%%%%%%%%Jacobian%%%%%%%%%%%%%%%%%%

dyu=0

for j=1:1:H

dyu=dyu+w(j)*h(j)*(-x(1)+ci(1,j))/bi(j)^2

end

dyout(k)=dyu

%%%%%%%%%%%%%%%%%%%%%%Start of Control system%%%%%%%%%%%

error(k)=rin(k)-yout(k)%期望输出与实际输出的偏差值,即控制误差

kp(k)=kp_1+xitekp*error(k)*dyout(k)*xc(1)

kd(k)=kd_1+xitekd*error(k)*dyout(k)*xc(2)

ki(k)=ki_1+xiteki*error(k)*dyout(k)*xc(3)

if kp(k)<0

kp=0

end

if kd(k)<0

kd=0

end

if ki(k)<0

ki=0

end

du(k)=kp(k)*xc(1)+kd(k)*xc(2)+ki(k)*xc(3)

u(k)=u_1+du(k)

if u(k)>=2

u(k)=2

end

if u(k)<=0

u(k)=0

end

%Return of parameters返回参数

x(1)=du(k)

x(2)=yout(k)

x(3)=y_1

u_1=u(k)

y_1=yout(k)

%%%%% 权值更新 %%%%%

w_3=w_2

w_2=w_1

w_1=w

%%%%% PID三项输入 %%%%%

xc(1)=error(k)-error_1%Calculating P

xc(2)=error(k)-2*error_1+error_2%Calculating D

xc(3)=error(k) %Calculating I

error_2=error_1

error_1=error(k)

kp_1=kp(k)

kd_1=kd(k)

ki_1=ki(k)

end

figure(1)

plot(time,rin,'b',time,yout,'r')

xlabel('time(s)')ylabel('rin,yout')

figure(4)

subplot(311)

plot(time,kp,'r')

xlabel('time(s)')ylabel('kp')

subplot(312)

plot(time,ki,'g')

xlabel('time(s)')ylabel('ki')

subplot(313)

plot(time,kd,'b')

xlabel('time(s)')ylabel('kd')

hold on

%% 清空环境变量

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

自己对着改一下。


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

原文地址:https://54852.com/yw/11770515.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存