📄 rbfforecastcpi.m
字号:
tic
clear
clc
r=0.001;%设置容许值
s_err=0;%选择中心是用的误差缩减率的和
%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%数据预处理%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%
aa=[109.3000 106.0000 107.3000 118.8000 118.0000 103.1000 103.4000 106.4000 114.7000 124.1000 117.1000 108.3000 102.8000 99.2000 98.6000 100.4000 100.7000 99.2000 101.2000 103.9000 101.8000 101.5000 104.8000];
%m为输入节点数
m=3;
for i=1:(length(aa)-m)
for j=1:m
X(i,j)=aa(i+j-1);
end
end
for i=1:(length(aa)-m)
Y(i)=aa(i+m);
end
Y=Y';%期望输出
YJ(1)=aa(length(aa)-1);%校正值
YJ(2)=aa(length(aa));
X(20,:)=[];
X(19,:)=[];
Y(20,:)=[];
Y(19,:)=[];
[n,NN]=size(X);%样本容量
C=X;%初始中心矩阵
%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算神经的初始网络宽度%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%
z=1;
for i=1:n
for j=1:n
if i~=j
d(z)=norm(X(i,:)-X(j,:));
z=z+1;
end
end
end
sigma=max(d)/sqrt(n);
%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%建立初始回归矩阵%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%
for i=1:n %n为样本向量个数
for j=1:n %n为中心向量个数,开始时将其设为与输入样本向量个数相同
P(i,j)=exp(-(norm(X(i,:)-C(j,:)))^2/(sigma^2));%建立回归矩阵,选高斯函数作为基函数,其中x(i,:)为样本向量,c(j,:)为中心向量
end
end
%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%RBF网络中心的选择%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%
%初始化
for i=1:n
err(1,i)=((P(:,i)'*Y)^2)/(P(:,i)'*P(:,i)*Y'*Y);
end
s_err(1)=max(err(1,:));
for i=1:n
if s_err(1)==err(1,i)
q=i;
break;
end
end
B(:,1)=P(:,q);
Center_C(1,:)=C(q,:);
C(q,:)=[];%%同时去掉备选中心的第q行
P(:,q)=[];
t=1;%计数器,选取中心的个数
%
%第k步
%
for k=2:n
q=0;
D=zeros(n);
for i=1:n-k+1
S=0;
A=0;
for j=1:k-1
A(j,i)=(B(:,j)'*P(:,i))/(B(:,j)'*B(:,j));
S=S+A(j,i)*B(:,j);
end
D(:,i)=P(:,i)-S;
err(k,i)=(D(:,i)'*Y)^2/(D(:,i)'*D(:,i)*Y'*Y);
end
s_err(k)=max(err(k,:));
for i=1:n-k+1
if s_err(k)==err(k,i)
q=i;
break;
end
end
if 1-sum(s_err)<r %误差判断
break;
else
B(:,k)=D(:,q);
Center_C(k,:)=C(q,:);
C(q,:)=[];%%同时去掉备选中心的第q行
P(:,q)=[];
t=t+1
end
end
%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%权值与宽度调整%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%
Uu=-0.08;
for j=1:t
u(j,1)=sigma;
end
N=12000%循环次数
for i=1:N
s=0;
ss=0;
L=0;
Yd=0;
%%%权值调整%%%
for k=1:n
for j=1:t
L(k,j)=exp(-(norm(X(k,:)-Center_C(j,:)))^2/(u(j,i)^2));%%回归矩阵
end
end
w(:,i)=pinv(L)*Y;%最小二乘法调整权值向量
Yd=L*w(:,i);%%实际输出
e=Yd-Y;
for j=1:length(Yd)
ss=ss+e(j)^2;%求误差平方和
end
Se(i)=ss;
%%%宽度调整%%%
tt=fix((i-1)/n)*n;
for j=1:t
s=s+w(j,i)*exp(-(norm(X(i-tt,:)-Center_C(j,:)))^2/(u(j,i)^2));%点调节网络的宽度
end
YY(i)=s;%实际值
ee(i)=YY(i)-Y(i-tt);
for j=1:t
u(j,i+1)=u(j,i)+Uu*ee(i)*w(j,i)*exp(-(norm(X(i-tt,:)-Center_C(j,:)))^2/(u(j,i)^2))*(norm(X(i-tt,:)-Center_C(j,:)))^2/u(j,i)^3;
end
end
%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%寻找最佳参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%
Min_Se=min(Se);%求所有误差平方和中的最小者
for i=1:N
if Se(i)==Min_Se
a=i;
break;
end
end
%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算训练过程中的预测误差%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%
for i=1:n
for j=1:t
LL(i,j)=exp(-(norm(X(i,:)-Center_C(j,:)))^2/(u(j,a)^2));
end
end
y=LL*w(:,a);%实际输出
jd_wucha=Y-y;%绝对误差
for i=1:length(Y)
xd_wucha(i)=abs(jd_wucha(i))/y(i);%相对误差绝对值
end
%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%绘制RBF网络训练的误差平和曲线%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%
x_wucha=1:1:N;
plot(x_wucha,Se,'r-')
grid on;
title('RBF神经网络误差曲线');
xlabel('横轴(序数)');
ylabel('纵轴(平方误差和)');
%legend('误差点',2)
%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%校正预测与其误差%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%
xx=[101.2 103.9 101.8;103.9 101.8 101.5];
for i=1:2
for j=1:t
LLL(i,j)=exp(-(norm(xx(i,:)-Center_C(j,:)))^2/(u(j,a)^2)); %建立回归矩阵
end
end
yy=LLL*w(:,a)
JD_wucha=YJ'-yy;%校正预测的绝对误差
for i=1:2
XD_wucha(i)=abs(JD_wucha(i))/yy(i)%校正预测的的相对误差
End
%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%开始预测%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%
xxx=[101.8 101.5 104.8]%3维输入数据
for j=1:t
LLL(1,j)=exp(-(norm(xxx(1,:)-Center_C(j,:)))^2/(u(j,a)^2)); %建立回归矩阵
end
yc=LLL*w(:,a)%预测值
toc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -