数学建模:MATLAB :RBF、GRNN、PNN神经网络解决分类和回归问题

一、径向基函数神经网络(RBF)

1.简述

RBF神经网络是一种前馈神经网络。由输入层、隐藏层、输出层 组成**。**

输入层负责接收外部输入数据,其神经元数量等于输入特征的数量;

隐含层由多个 RBF 神经元组成每个 RBF 神经元都有一个中心向量和一个宽度参数。RBF 神经元的激活函数通常采用高斯函数等径向基函数(径向基函数以中心点为基准,输出值取决于输入数据与该中心点的距离),输入数据经过隐藏层的径向基函数从原始的输入空间映射到一个高维的特征空间,在高维空间中进行线性或非线性的操作;

输出层将隐含层的输出进行线性组合,产生最终的输出。输出层神经元的数量取决于要预测的目标数量。

确定了隐含层的参数后可以采用最小二乘法或梯度下降法来计算输出层的权重。

下面代码使用RBF神经网络对光谱数据进行回归分析,预测汽油样本的辛烷值。

2.代码

Matlab 复制代码
clear 
clc

%导入数据
load spectra_data.mat

%随机产生训练集和测试集
%对得到的训练集和测试集进行转置,确保每个数据集的列都表示样本的个数,用于构建神经网络
temp = randperm(size(NIR, 1));
% 训练集
train_x = NIR(temp(1 : 50), :)';
train_y = octane(temp(1 : 50), :)';
% 测试集
test_x = NIR(temp(51 : end), :)';
test_y = octane(temp(51 : end), :)';
N = size(test_x, 2);

%创建RBF神经网络
%第三个传入参数表示径向基函数的散布,传入参数越大,函数逼近就越平滑
net = newrbe(train_x, train_y, 30);

%测试
sim_y = sim(net, test_x);

%计算相对误差
error = abs(sim_y - test_y) ./ test_y;

%计算决定系数R^2
R2 = (N * sum(sim_y .* test_y) - sum(sim_y) * sum(test_y))^2 / ((N * sum((sim_y).^2) - (sum(sim_y))^2) * (N * sum((test_y).^2) - (sum(test_y))^2)); 

%绘图
figure
plot(1 : N, test_y, 'b:*', 1 : N, sim_y, 'r-o');

%legend函数为每个绘制的数据序列创建一个带有描述性标签的图例
legend('真实值','预测值');
xlabel('预测样本');
ylabel('辛烷值');

3.运行结果

二、广义回归神经网络(GRNN)、概率神经网络(PNN)

1.简述

GRNN神经网络属于径向基神经网络的一种变形形式,由输入层、模式层、求和层、输出层组成

输入层的输入层节点数与输入向量的维数相等,各个节点直接将输入样本传输到模式层中。

模式节点数与输入层节点数相同,模式层的传递函数为径向基函数,与RBF神经网络相同

求和层包含两个子层,分别是加权求和层非线性求和层。加权求和层计算所有模式层节点输出的加权和,非线性求和层计算所有加权值的非线性函数值。

输出层根据求和层提供的结果生成最终的输出结果。输出层通常只包含一个节点,该节点的值为加权求和层的输出除以非线性求和层的输出。输出结果与平滑因子相关,平滑因子过大时,会导致测量结果趋于样本数据的均值;平滑因子过小会导致测量结果接近训练样本值,使神经网络的泛化性能变差。

2.代码

Matlab 复制代码
clear 
clc

% 导入数据
load iris_data.mat

% 随机产生训练集和测试集
%初始化训练集和测试集
%由于后续需要执行拼接操作,无法提前确定训练集和测试集的大小,因此用[]来初始化空矩阵
train_x = [];
train_y = [];
test_x = [];
test_y = [];
%数据中一共有三个类别,需循环遍历三个类别,分段划分三个训练集和测试集再拼接在一起
for i = 1:3
    %temp临时存储每一类的数据
    temp_input = features((i-1)*50+1:i*50,:);
    temp_output = classes((i-1)*50+1:i*50,:);
    n = randperm(50);
    %执行拼接操作并转置
    train_x = [train_x temp_input(n(1:40),:)'];
    train_y = [train_y temp_output(n(1:40),:)'];
    test_x = [test_x temp_input(n(41:50),:)'];
    test_y = [test_y temp_output(n(41:50),:)'];
end

%分别初始化GRNN和PNN的结果存储矩阵
result_grnn = [];
result_pnn = [];

%遍历每个可能的输入特征起始点
for i = 1:4
    %遍历每个可能的输入特征终点
    for j = i:4
        %根据当前的起始和结束点选取对应的训练集和测试集输入特征
        train_X = train_x(i:j,:);
        test_X = test_x(i:j,:);
       
        %%
        %创建GRNN神经网络
        net_grnn = newgrnn(train_X,train_y);

        %测试得到预测结果
        t_sim_grnn = sim(net_grnn,test_X);
        %将预测结果取整
        T_sim_grnn = round(t_sim_grnn);

        %通过拼接存储预测结果
        result_grnn = [result_grnn T_sim_grnn'];
       
        %%
        %将训练集的结果转换为向量形式,目的是将类别索引转换成一个稀疏矩阵,保证其中的每一列对应一个样本,每一行对应一个类别
        train_yc = ind2vec(train_y);

        % 创建PNN神经网络
        net_pnn = newpnn(train_X,train_yc);

        %将测试集的结果转换为向量形式
        Tc_test = ind2vec(test_y);
        %测试得到预测结果
        t_sim_pnn = sim(net_pnn,test_X);
        %将预测结果取整
        T_sim_pnn = vec2ind(t_sim_pnn);
        %通过拼接存储预测结果
        result_pnn = [result_pnn T_sim_pnn'];
    end
end

3.运行结果

相关推荐
乱次序_Chaos1 小时前
【监督学习】线性回归算法步骤及matlab实现
学习·算法·matlab·线性回归
啥都鼓捣的小yao2 小时前
课程2. 用PyTorch训练神经网络与梯度下降
人工智能·pytorch·神经网络
小宇爱3 小时前
55、深度学习-自学之路-自己搭建深度学习框架-16、使用LSTM解决RNN梯度消失和梯度爆炸的问题,重写莎士比亚风格文章。
人工智能·rnn·深度学习·神经网络·自然语言处理
南太湖小蚂蚁3 小时前
自然语言处理入门2——神经网络
人工智能·python·深度学习·神经网络·自然语言处理
IT猿手8 小时前
2025最新智能优化算法:人工旅鼠算法(Artificial Lemming Algorithm, ALA)求解23个经典函数测试集,MATLAB
人工智能·算法·数学建模·matlab·智能优化算法
88号技师8 小时前
2025年2月最新SCI-鹰鱼优化算法HawkFish Optimization Algorithm-附Matlab免费代码
开发语言·算法·matlab·优化算法
紫雾凌寒9 小时前
计算机视觉 |解锁视频理解三剑客——TimeSformer
python·深度学习·神经网络·计算机视觉·transformer·timesformer
楼台的春风10 小时前
【图像亮度、对比度调整,直方图均衡化及图像平滑】
图像处理·人工智能·opencv·算法·计算机视觉·matlab·嵌入式
机器学习之心12 小时前
分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机多特征分类预测
算法·matlab·分类·gwo-lssvm