⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rbfforecastcpi.m

📁 毕业论文时编写RBF神经网络预测我国CPI
💻 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 + -