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

📄 dynrbf.m

📁 matlab,神经网络
💻 M
字号:
%=====================RBF网络动态设计方法=====================

clc;
clear all;
close all;
% 产生训练样本
Sample_N = 100;    % 样本数
X = -4+8*rand(Sample_N,1);   % 服从区间(-4,4)内均匀分布的训练样本
Y1 = 1.1*(1-X+2*(X.^2)).*exp(-(X.^2)/2);  % 教师输出(无噪声)
Y = Y1+sqrt(0.25)*randn(Sample_N,1);      % 教师输出(有噪声)
% X1 = -4+8*rand(Sample_N,1);           % 测试样本
X1 = linspace(-4,4,100)';
Y_Ex = 1.1*(1-X1+2*(X1.^2)).*exp(-(X1.^2)/2);   % 期望输出(无噪声)
Y_Ex1 = Y_Ex+sqrt(0.25)*randn(Sample_N,1);     % 期望输出(有噪声)

% 设置参数
r = 1.5;   % 扩展常数
lambda = 3e-4;      % 正则化系数
C_max = 1e6;        % 条数极限
eta = 1e-4;         % 学习率
kk = 1.0;           % 重叠系数
w_min = 0.1;        % 临界权值
Train_Nmax = 150;   % 最大学习次数
D = 0;              % 期望误差
delta_lambda = 2e-3;   % 正则化系数增量
miu = 0.95;
rou = 0.95;

%===========开始训练=============
% 选择RBF网第一个数据中心,并计算输出权值
for j = 1:Sample_N
    for i = 1:Sample_N
        S(i,j) = exp(-norm(X(i)-X(j))/r);    % 设计阵
    end
end
E1 = Y'*S;      % Gaussian正则化方法时的目标函数
[a1 b1] = max(E1);
c(1) = X(b1);      % 选择第b(使得E最大)个输入样本x为RBF网络第一个数据中心
P_M(:,1) = S(:,b1);
P_M11 = P_M;
P_M11(:,end+1) = ones(Sample_N,1);
P_M11(:,end+1) = S(:,b1);
A = P_M11'*P_M11+lambda*eye(size(P_M11'*P_M11));
C_A = norm(A,'fro')*norm(inv(A),'fro');       % 条件数
P_M1 = P_M11(:,1:end-1);
W = inv(P_M1'*P_M1+lambda*eye(size(P_M1'*P_M1)))*P_M1'*Y;   % 最优权值
E(1) = (Y-P_M1*W)'*(Y-P_M1*W)+lambda*W(end-1)'*W(end-1);
A1(1) = (1-miu)*E(1);    % 当前训练样本的平均误差

%=====================开始粗调=======================
k = 1;               % 隐节点数
abc(k) = k;          % 训练次数
k_Hide(k) = k;
while C_A <= C_max          % 判断粗调是否停止
    k = k+1;
    abc(k) = k;
    k_Hide(k) = k;
    P_M1 = P_M;
    P_M1(:,end+1) = ones(Sample_N,1);
    for j = 1:Sample_N
        P_M11 = P_M1;
        P_M11(:,end+1) = S(:,j);
        H_M11 = eye(Sample_N)-P_M11*inv(P_M11'*P_M11+lambda*eye(size(P_M11'*P_M11)))*P_M11';
        E_M11(j) = Y'*H_M11*Y;
    end
    [a2 b2] = min(E_M11);
    c(k) = X(b2);      % 第k个数据中心    k = 2,3,4,...
    P_M(:,end+1) = S(:,b2);
    P_M11 = P_M;
    P_M11(:,end+1) = ones(Sample_N,1);
    P_M11(:,end+1) = S(:,b2);
%     A = P_M11'*P_M11;    
    A = P_M11'*P_M11+lambda*eye(size(P_M11'*P_M11));
    C_A = norm(A,'fro')*norm(inv(A),'fro');      % 条件数
    P_M1 = P_M11(:,1:end-1);
    W = inv(P_M1'*P_M1+lambda*eye(size(P_M1'*P_M1)))*P_M1'*Y;   % 权值
    E(abc(end)) = (Y-P_M1*W)'*(Y-P_M1*W)+lambda*W(end-1)'*W(end-1);      % 当前训练样本的总误差
    A1(abc(end)) = miu*A1(abc(end)-1)+(1-miu)*E(abc(end));    % 当前训练样本的平均误差
end
lambda(1:k) = lambda;
%=====================粗调结束=======================

%=====================开始精调=======================
for Train_N = 2:Train_Nmax-k+1
    clear P_M; clear P_M1; clear P_M11;
    abc(k+Train_N-1) = k+Train_N-1;
for i = 1:k
    % 调整数据中心
    k1 = 0;
    for j = 1:Sample_N
        if norm(X(j)-c(i),'fro')<kk*r
            k1 = k1+1;
            fx = W(i)*exp(-norm(X(j)-c(i),'fro')/r)+W(end);
            delta_c(k1) = 4*(eta/r)*(X(j)-c(i))*exp(-abs(Y(j)-fx-c(i))/r)*W(i);    % 数据中心调节量
        end
    end
    c(i) = c(i)+sum(delta_c);      % 精调之后的数据中心
    
    % 调整网络输出权值和输出偏移
    for j = 1:Sample_N
        P_M(j,i) = exp(-norm(X(j)-c(i),'fro')/r);
    end
    P_M1 = P_M;
    P_M1(:,end+1) = ones(Sample_N,1);
end
clear W;
W = inv(P_M1'*P_M1+lambda(abc(end)-1)*eye(size(P_M1'*P_M1)))*P_M1'*Y;    % 精调后的权值

% 对隐节点进行剪枝
k10 = 0;
for i = 1:k
    if abs(W(i))<w_min
        W(i) = 0;
        k10 = k10+1;
    end
end 
k = k-k10;         % 剪枝后的隐接点个数
k_Hide(abc(end)) = k;
clear c1; clear W1; clear P_M2;
c1 = c;
W1 = W;
P_M2 = P_M1;
o = 0;
for j = 1:length(c)               % 提取权值和数据中心中的非零值
    if W(j) == 0
        W1(j-o,:) = [];
        c1(j-o) = []; 
        P_M2(:,j-o) = [];
        o = o+1;
    end
end
clear c; clear W; clear P_M1;
c = c1;
W = W1;
P_M1 = P_M2;

% 计算当前所有训练样本的总误差和平均误差
E(abc(end)) = (Y-P_M1*W)'*(Y-P_M1*W)+lambda(abc(end)-1)*W(end-1)'*W(end-1);          % 当前训练样本的总误差
A1(abc(end)) = miu*A1(abc(end)-1)+(1-miu)*E(abc(end));    % 当前训练样本的平均误差

% 判断算法是否结束
if E(abc(end))==D
    break;
end

% 调整正则化系数
if E(abc(end))<E(abc(end)-1) || E(abc(end))<D
    lambda(abc(end)) = lambda(abc(end)-1)+delta_lambda;
elseif E(abc(end))>=E(abc(end)-1) && E(abc(end))<A1(abc(end)) && E(abc(end))>=D
    lambda(abc(end)) = lambda(abc(end)-1)-delta_lambda;
elseif E(abc(end))>=E(abc(end)-1) && E(abc(end))>=A1(abc(end)) && E(abc(end))>=D
    lambda(abc(end)) = rou*lambda(abc(end)-1);
end
end
%====================精调结束=====================

%====================测试网络=====================
for j = 1:k
    for i = 1:Sample_N
        P_M(i,j) = exp(-norm(X1(i)-c(j))/r);
    end
end
P_M1 = P_M;
P_M1(:,end+1) = ones(Sample_N,1);
Y_Test = P_M1*W;     % 测试样本的实际输出

%==================画图====================
figure
[s t] = max(k_Hide);
plot(abc,k_Hide);
xlabel('训练次数(N)'); ylabel('隐节点个数');
title('隐节点个数与训练次数的关系');
ylim([0 s+5]);
plotxline(abc(t),'r');grid on;

figure
plot(abc,lambda);
xlabel('训练次数(N)'); ylabel('正则化系数');
title('正则化系数与训练次数的关系');
ylim([0 0.08]);
plotxline(abc(t),'r');grid on;

% figure;
% plot(abc,E);
% xlabel('学习次数'); ylabel('学习误差'); title('学习误差与学习次数的关系');
% xlim([0 abc(end)]);
% plotxline(abc(t),'r');grid on;

figure
plot(abc,E,'b',abc,A1,'r');
xlabel('学习次数'); ylabel('误差'); title('误差与学习次数的关系');
xlim([0 abc(end)]);
plotxline(abc(t),'r');grid on;
legend('学习误差','平均误差');

figure;
hold on;grid on;
plot(X1,Y_Ex,'b');
plot(X1,Y_Ex1,'y');
plot(X1,Y_Test,'r');
xlabel('测试样本(X)'); ylabel('函数输出(F(X))');
legend('无噪声时的期望输出','有噪声时的期望输出','测试样本的实际输出');title('DYNRBF拟合曲线');

disp('测试样本误差(期望输出无噪声时)---------->:');
disp((Y_Ex-Y_Test)'*(Y_Ex-Y_Test)+lambda(end)*W(end-1)'*W(end-1));
disp('测试样本误差(期望输出有噪声时)---------->:');
disp((Y_Ex1-Y_Test)'*(Y_Ex1-Y_Test)+lambda(end)*W(end-1)'*W(end-1));
disp('训练结束时的训练误差---------->:');
disp(E(end));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -