第四课 RBF、GRNN和PNN神经网络

在这里插入图片描述

1 RBF神经网络 VS BP神经网络

径向基(radial basis functions,RBF)函数网络是以径向基函数为激活函数的人工神经网络,是一种线性组合。
RBF函数:
在这里插入图片描述
在这里插入图片描述
RBF和BP同一个数据进行实验对比:

%% I. 清空环境变量
clear all
clc

%% II. 训练集/测试集产生
%%
% 1. 导入数据
load spectra_data.mat

%%
% 2. 随机产生训练集和测试集
temp = randperm(size(NIR,1));
% 训练集——50个样本
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
% 测试集——10个样本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);

%% III. 数据归一化,BP 网络需要归一化处理,RBF不需要归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);
[t_train, ps_output] = mapminmax(T_train,0,1);

%% IV. RBF/BP神经网络创建及仿真测试
%%
% 1. 创建网络 
%0.3为参数spread,默认是1.0,这个参数影响后面的阈值的大小,可看newrbe函数里面的阈值b的产生的公式
net_rbf = newrbe(P_train,T_train,0.3);
net_bp = newff(p_train, t_train, 9);

%%
%2. 设置 BP 网络 训练参数, RBF 网络不需要设置参数,除了上面的spread设置为30
net_bp.trainParam.epochs = 1000;
net_bp.trainParam.goal = 1e-3;
net_bp.trainParam.lr = 0.01;

%3. BP网络 训练, RBF 不需要训练
net_bp = train(net_bp,p_train,t_train);

%4. 仿真测试
T_sim_rbf = sim(net_rbf,P_test);
t_sim_bp = sim(net_bp,p_test);

%5. 数据反归一化,rbf没归一化因此也不需要返归一化
T_sim_bp = mapminmax('reverse',t_sim_bp,ps_output);

%% V. 性能评价
%%
% 1. 相对误差error
error_rbf = abs(T_sim_rbf - T_test)./T_test;
error_bp = abs(T_sim_bp - T_test)./T_test;

%%
% 2. 决定系数R^2
R2_rbf = (N * sum(T_sim_rbf .* T_test) - sum(T_sim_rbf) * sum(T_test))^2 / ((N * sum(T_sim_rbf.^2) - (sum(T_sim_rbf))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));
R2_bp = (N * sum(T_sim_bp .* T_test) - sum(T_sim_bp) * sum(T_test))^2 / ((N * sum(T_sim_bp.^2) - (sum(T_sim_bp))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));

%%
% 3. 结果对比
result = [T_test' T_sim_rbf' T_sim_bp' error_rbf' error_bp']

%% VI. 绘图
figure
plot(1:N,T_test,'b:*',1:N,T_sim_rbf,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('辛烷值')
string = {'基于RBF网络测试集辛烷值含量预测结果对比';['R^2=' num2str(R2_rbf)]};
title(string)
figure
plot(1:N,T_test,'b:*',1:N,T_sim_bp,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('辛烷值')
string = {'基于BP网络测试集辛烷值含量预测结果对比';['R^2=' num2str(R2_bp)]};
title(string)


在这里插入图片描述
在这里插入图片描述
分析参数影响:
在这里插入图片描述
spread越大,则生成的阈值b越小,只有当值为0时候得到的结果最优。
在这里插入图片描述

2 GRNN(广义回归)神经网络

问题导入:
方框是表示正类,横线是负类,试问预测值x=6,y=5.1的三角形是什么类?
矛盾点:把横线覆盖应该是负类,但是周围方框多,也可以看成正类。
在这里插入图片描述
广义回归神经网络(GRNN)通常用于函数逼近,它具有径向基础层和特殊的线性层。

3 PNN(概率回归)神经网络

PNN通常用于函数逼近,它具有径向基础层和特殊的竞争函数。

除了BP需要设置参数外,其他三个只需要设置spread参数即可。
可以通过endit newff来比较三个网络的不同。在内部设置断点可以查看算法原理。

newff创建BP神经网络
newrbe创建RBF神经网络
newgrnn创建GRNN神经网络
newpnn创建PNN神经网络

补充算法

1、MATLAB中的round函数
matlab中round也是一个四舍五入函数。在matlab的命令窗口中输入doc round或者helpround即可获得该函数的相关帮助信息。  
格式:Y=round(X)
在这里插入图片描述
2、MATLAB中的ind2vec函数
T中元素作为行号
在这里插入图片描述
在这里插入图片描述
eg。A=[1 3 2 2 2 1 2]
在这里插入图片描述
GRNN和PNN同一个数据进行实验对比:
数据集:iris_data.mat
在这里插入图片描述

%% I. 清空环境变量
clear all
clc

%% II. 训练集/测试集产生
%%
% 1. 导入数据150个样本,每个样本4个特征,每个样本是三种类型中的某一个。每一种类型50个,即50个1,50个2,5个3
load iris_data.mat

%%
% 2 随机产生训练集和测试集
P_train = [];
T_train = [];
P_test = [];
T_test = [];
for i = 1:3  %按照每一种类型划分选联机和测试集,第一类50,40训练10测试,同理其他,然后并排放一块
    temp_input = features((i-1)*50+1:i*50,:);
    temp_output = classes((i-1)*50+1:i*50,:);
    n = randperm(50);
    % 训练集——120个样本
    P_train = [P_train temp_input(n(1:40),:)'];   %4*(40+40+40=120)
    T_train = [T_train temp_output(n(1:40),:)'];   %1*(40+40+40=120)
    % 测试集——30个样本
    P_test = [P_test temp_input(n(41:50),:)'];  %4*(10+10+10=30)
    T_test = [T_test temp_output(n(41:50),:)']; %1*(10+10+10=30)
end

%% III. 模型建立 
result_grnn = [];
result_pnn = [];
time_grnn = [];
time_pnn = [];

%4*120表示120个样本的4个特征,所以第一行表示120个样本的第一个特征
for i = 1:4
    for j = i:4
        p_train = P_train(i:j,:);
        p_test = P_test(i:j,:);
       %% 
        % 1. GRNN创建及仿真测试
        t = cputime;
        % 创建网络
        net_grnn = newgrnn(p_train,T_train);
        % 仿真测试
        t_sim_grnn = sim(net_grnn,p_test);
        T_sim_grnn = round(t_sim_grnn);  %取整
        t = cputime - t;
        time_grnn = [time_grnn t];
        result_grnn = [result_grnn T_sim_grnn'];
       %%
        % 2. PNN创建及仿真测试
        t = cputime;
        Tc_train = ind2vec(T_train);  %变成稀疏矩阵
        % 创建网络
        net_pnn = newpnn(p_train,Tc_train);
        % 仿真测试
        Tc_test = ind2vec(T_test);
        t_sim_pnn = sim(net_pnn,p_test);
        T_sim_pnn = vec2ind(t_sim_pnn);
        t = cputime - t;
        time_pnn = [time_pnn t];
        result_pnn = [result_pnn T_sim_pnn'];
    end
end

%% IV. 性能评价
%%
% 1. 正确率accuracy
accuracy_grnn = [];
accuracy_pnn = [];
time = [];
for i = 1:10
    accuracy_1 = length(find(result_grnn(:,i) == T_test'))/length(T_test);
    accuracy_2 = length(find(result_pnn(:,i) == T_test'))/length(T_test);
    accuracy_grnn = [accuracy_grnn accuracy_1];
    accuracy_pnn = [accuracy_pnn accuracy_2];
end

%%
% 2. 结果对比
result = [T_test' result_grnn result_pnn]
accuracy = [accuracy_grnn;accuracy_pnn]
time = [time_grnn;time_pnn]

%% V. 绘图
figure(1)
plot(1:30,T_test,'bo',1:30,result_grnn(:,4),'r-*',1:30,result_pnn(:,4),'k:^')
grid on
xlabel('测试集样本编号')
ylabel('测试集样本类别')
string = {'测试集预测结果对比(GRNN vs PNN)';['正确率:' num2str(accuracy_grnn(4)*100) '%(GRNN) vs ' num2str(accuracy_pnn(4)*100) '%(PNN)']};
title(string)
legend('真实值','GRNN预测值','PNN预测值')
figure(2)
plot(1:10,accuracy(1,:),'r-*',1:10,accuracy(2,:),'b:o')
grid on
xlabel('模型编号')
ylabel('测试集正确率')
title('10个模型的测试集正确率对比(GRNN vs PNN)')
legend('GRNN','PNN')
figure(3)
plot(1:10,time(1,:),'r-*',1:10,time(2,:),'b:o')
grid on
xlabel('模型编号')
ylabel('运行时间(s)')
title('10个模型的运行时间对比(GRNN vs PNN)')
legend('GRNN','PNN')

1、result结果:
在这里插入图片描述
2、准确率:
在这里插入图片描述
3、绘图1
有结果和图看出只有一个没有预测出来。且GRNN为96.66%,PNN为93.33%
在这里插入图片描述
4、绘图2
将所有特征组合拿出来比较,选取最好的特征组合
在这里插入图片描述
5、绘图3
时间比较图
在这里插入图片描述

  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值