广义回归神经网络(GRNN)的实现(Python,附源码及数据集)

article/2025/9/29 1:16:10

文章目录

  • 一、理论基础
    • 1、广义回归神经网络结构
    • 2、输入层
    • 3、模式层
    • 4、求和层
    • 5、输出层
    • 6、优化思路
  • 二、广义回归神经网络的实现
    • 1、实现过程(GRNN.py)
    • 2、预测结果
    • 3、参考源码及实验数据集

一、理论基础

广义回归神经网络(Generalized Regression Neural Network,简称GRNN)是一种具有较好的非线性逼近能力的四层前向传播神经网络,它属于径向基神经网络的一种变形形式,数据输入网络后依次经过输入层、模式层、求和层、输出层后得到输出结果,与反向传播神经网络(BPNN)不通的是该网络没有训练过程,主要通过对模式层的平滑因子进行优化来获得好的输出结果。
反向传播神经网络(BPNN)原理参考:
反向传播神经网络(BPNN)的实现(Python,附源码及数据集)

1、广义回归神经网络结构

广义回归神经网络的结构图如下图所示:
在这里插入图片描述

2、输入层

这一层主要实现数据的输入过程,并将输入数据传递至模式层,该层的节点数为输入数据的特征维度。

3、模式层

一般使用高斯函数对输入数据进行处理,节点数为训练样本的个数,具体的计算公式如下:
在这里插入图片描述

其中x_i为训练样本,x_j为学习样本,σ为平滑因子,

4、求和层

假设输出样本维度为k,则该层节点数为k+1,其中一个节点输出S_D为模式层输出的算术和,其余节点输出S_Ni均为模式层输出的加权和,具体的计算公式如下:
在这里插入图片描述
在这里插入图片描述

其中ω_ij为加权系数。

5、输出层

该层节点数为输出样本维度,主要根据求和层求出的算术和与加权和进行计算输出,计算公式如下:
在这里插入图片描述

6、优化思路

虽然GRNN无需进行网络训练,但模式层的平滑因子σ对网络的性能影响较大,平滑因子过大或过小会分别导致网络出现欠拟合与过拟合的现象,而在实验中通常难以将平滑因子设定至较优的数值,因此若想获得较好的网络性能,一般选用高效的智能优化算法对平滑因子进行寻优。
常见的智能优化算法介绍

二、广义回归神经网络的实现

以数据预测为例,下面介绍基于Python实现径向基神经网络的过程。
选用某省市的表层土壤重金属元素数据集作为实验数据,该数据集总共96组,随机选择其中的24组作为测试数据集,72组作为训练数据集。选取重金属Ti的含量作为待预测的输出特征,选取重金属Co、Cr、Mg、Pb作为模型的输入特征。

1、实现过程(GRNN.py)

#库的导入
import numpy as np
import pandas as pd#输入层
#读取训练数据
print('------------------------1. Load train data------------------------')
df = pd.read_csv("train.csv")
df.columns = ["Co", "Cr", "Mg", "Pb", "Ti"]
Co = df["Co"]
Co = np.array(Co)
Cr = df["Cr"]
Cr = np.array(Cr)
Mg=df["Mg"]
Mg=np.array(Mg)
Pb = df["Pb"]
Pb =np.array(Pb)
Ti = df["Ti"]
Ti = np.array(Ti)
inputX = np.mat([Co,Cr,Mg,Pb])
inputX = inputX.transpose()
inputY = np.mat(Ti)
inputY = inputY.transpose()#读取测试数据
print('------------------------2. Load test data-------------------------')
df = pd.read_csv("test.csv")
df = pd.read_csv("test.csv")
df.columns = ["Co", "Cr", "Mg", "Pb", "Ti"]
Co = df["Co"]
Co = np.array(Co)
Cr = df["Cr"]
Cr = np.array(Cr)
Mg=df["Mg"]
Mg=np.array(Mg)
Pb = df["Pb"]
Pb =np.array(Pb)
Ti = df["Ti"]
Ti = np.array(Ti)
testX = np.mat([Co,Cr,Mg,Pb])
testX = testX.transpose()
testY = Ti#模式层
#计算样本欧式距离
print('----------------3. Calculate euclidean distance-------------------')
m, n = np.shape(inputX)
p = np.shape(testX)[0]
distance = np.mat(np.zeros((p, m)))
for i in range(p):for j in range(m):distance[i,j] = np.linalg.norm(testX[i,:]-inputX[j,:])#计算高斯矩阵
print('------------------4. Calculate gaussian matrix--------------------')
sigma = 2 #平滑因子
Gauss = np.mat(np.zeros((p,m)))
for i in range(p):for j in range(m):Gauss[i,j] = np.exp(- distance[i,j] / (2 * (sigma ** 2)))#求和层
print('----------------------5. Output of sum Layer----------------------')
n = np.shape(inputY)[1]
sum_mat = np.mat(np.zeros((p,n+1)))
#计算算术和
for i in range(p):sum_mat[i, 0] = np.sum(Gauss[i, :], axis=1)
#计算加权和
for i in range(p):for j in range(n):total = 0.0for s in range(m):total += Gauss[i,s] * inputY[s,j]sum_mat[i,j+1] = total#输出层
print('--------------------6. Output of output Layer---------------------')
#计算预测值
predict = np.mat(np.zeros((p,n)))
for i in range(n):predict[:,i] = sum_mat[:,i+1] / sum_mat[:,0]
predict = predict.transpose()
predict = np.array(predict)
output1=predict.flatten()#降成一维数组
predict=output1.tolist()#预测效果评估
print('----------------7. Forecasting effect evaluation------------------')
#预测差值err
err = predict - testY
#MAE等评价指标的计算
mae = np.sum(np.abs(predict-testY))/p
average_loss1=np.sum(np.abs((predict-testY)/testY))/p
mape="%.2f%%"%(average_loss1*100)
f1 = 0
for m in range(p):f1 = f1 + np.abs(testY[m]-predict[m])/((np.abs(testY[m])+np.abs(predict[m]))/2)
f2 = f1 / p
smape="%.2f%%"%(f2*100)#计算预测值与真实值误差与真实值之比的分布
A=0
B=0
C=0
D=0
E=0
for m in range(p):y1 = np.abs(testY[m]-predict[m])/np.abs(testY[m])if y1 <= 0.1:A = A + 1elif y1 > 0.1 and y1 <= 0.2:B = B + 1elif y1 > 0.2 and y1 <= 0.3:C = C + 1elif y1 > 0.3 and y1 <= 0.4:D = D + 1else:E = E + 1
print("The distribution of the predicted difference ratio in different intervals is as follows:")
print("Ratio <= 0.1 :",A)
print("0.1< Ratio <= 0.2 :",B)
print("0.2< Ratio <= 0.3 :",C)
print("0.3< Ratio <= 0.4 :",D)
print("Ratio > 0.4 :",E)
print("The different error index values are as follows:")
print("the MAE is :",mae)
print("the MAPE is :",mape)
print("the SMAPE is :",smape)#保存误差和真实值
np.save("GRNN-err.npy",err)
np.save("GRNN-output.npy",predict)print("The prediction value and real value comparison figure has been generated !")

2、预测结果

在这里插入图片描述
注:广义回归神经网络中参数主要是平滑因子,因此当设置不同取值的平滑因子时预测效果会存在一定差别。

3、参考源码及实验数据集

参考源码及实验数据集


http://chatgpt.dhexx.cn/article/W9TWYfDG.shtml

相关文章

【机器学习】广义回归神经网络(GRNN)的python实现

【机器学习】广义回归神经网络(GRNN)的python实现 一、广义回归神经网络原理1.1、GRNN与PNN的关系2.2、GRNN的网络结构二、广义回归神经网络的优点与不足2.1、优点2.2、不足三、GRNN的python实现参考资料一、广义回归神经网络原理 1.1、GRNN与PNN的关系 广义回归神经网络(…

C++ Unique函数 详细

unique函数是STL中比较实用的函数之一 包含该函数的函数头文件为 #include <algorithm>2 unique函数可以删除有序数组中的重复元素。 注意&#xff1a; a 这里的删除不是真的delete&#xff0c;而是将重复的元素放到容器末尾 b unique函数的返回值是去重之后的尾地址 c…

c++的unique函数

unique是 c标准模板库STL中十分实用的函数之一&#xff0c;使用此函数需要 #include <algorithm> 该函数的作用是“去除”容器或者数组中相邻元素的重复出现的元素&#xff0c;注意 (1) 这里的去除并非真正意义的erase&#xff0c;而是将重复的元素放到容器的末尾&…

SQL查询JSON格式的字段值 JSON_UNQUOTE与JSON_EXTRACT 去除SQL中双引号

一、最常用的就是 JSON_EXTRACT()函数&#xff0c;用于提取字段值 selectJSON_EXTRACT(a.info,"$.Score")fromjsontest awhereJSON_EXTRACT(a.info,"$.name") "Bob" 二、JSON_UNQUOTE 去除 SQL 中 " " ? MySQL自5.7之后开始支持js…

unique函数的用法

unique函数是用于将矩阵数据中的相同元素删除&#xff0c;只留下不相同的唯一元素。 1.例如: 得到的B矩阵为&#xff1a; 这个相对简单&#xff0c;但是有时需要将矩阵中的元素相同行的删除&#xff0c;也可以用到unique 2.当需要删除矩阵中的出现多次的行数组时 例如&#x…

c++ unique函数详解

unique是 c标准模板库STL中十分实用的函数之一&#xff0c;使用此函数需要#include <algorithm>头文件 该函数的作用是“去除”容器或者数组中相邻元素的重复出现的元素 (1) 这里的去除并非真正意义的erase&#xff0c;而是将重复的元素放到容器的末尾&#xff0c;返回值…

unique函数用法

unique函数用法 unique包含在头文件 #include <algorithm>函数作用&#xff1a;“去除”容器或数组中相邻元素之间重复出现的元素 unique函数的三个参数&#xff1a; 1、想要去重的数据集的起始地址 2、想要去重的最后一个元素的下一个元素的地址 3、比较函数(可以省…

MySQL JSON_EXTRACT()、JSON_UNQUOTE() 函数获取JSON串的值

JSON_EXTRACT()函数作用是读取数据库储存的json值&#xff0c;已key、value的形式获取某个键值 如果json字符串是对象{Object} 1&#xff1a;第一个参数为需要查询的json字段 2&#xff1a;第二个参数为json里需要获取的键名 $.key 如果json字符串是数组[Array] 1&#xff1a;…

c++ unique函数

unique函数属于STL中比较常用函数&#xff0c;它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除&#xff0c;并不是真的删除&#xff0c;而是指重复元素的位置被不重复的元素给占领了(详细情况&#xff0c;下面会讲)。由于它”删除”的是相邻的…

ubuntu启动后一直黑屏

好奇怪的一件事&#xff0c;昨晚使用完ubuntu后&#xff0c;和往常一样拍了快照&#xff0c;但今天打开后就一直黑屏&#xff0c;就突然的有了自己的思想&#xff0c;任我重启电脑都没有任何用处 我采用的方法 徽标cmd回车&#xff0c;输入如下命令,然后重启电脑 netsh winsoc…

ubuntu虚拟机开机黑屏系列解决办法

ubuntu虚拟机开机黑屏系列解决办法 前记解决方法方法一&#xff1a;方法二&#xff1a;方法三&#xff1a;方法四&#xff1a;方法五&#xff1a;方法六&#xff1a; 后记 前记 ubuntu虚拟机玩的好好的&#xff0c;突然不知怎么着图形界面就卡住了&#xff0c;等待了好一会也不…

记录ubuntu启动黑屏,仅有左上角光标闪烁的解决过程

去年装完显卡驱动后有重启黑屏的经历&#xff0c;所以后来一直没敢装显卡驱动&#xff0c;前段时间需要用显卡驱动跑程序&#xff0c;又装了一次&#xff0c;果不其然黑屏了。 nvidia-smi 是可以显示出显卡信息的&#xff0c;这说明显卡驱动是装上了。 1.首先是试了18 20 22的…

ubuntu虚拟机启动失败黑屏解决方案及原因

背景介绍 某天某个时辰,手残的我想打开VMWare里面的ubuntu虚拟机跑跑Kubernetes突然发现ubuntu虚拟机黑屏无法启动,只有一个光标在闪烁,图形界面就再也打不开了 原因 进入高级模式后发现磁盘占用满了,清除一些文件后ubuntu虚拟机正常启动 解决方案 进入grub模式 一旦启动后…

Ubuntu18的bug导致系统启动后黑屏的问题

这是我在使用Ubuntu18时遇到的问题&#xff0c;文章包含遇到黑屏时的各种原因及解决方法&#xff08;或链接&#xff09;&#xff0c;如果是您在使用Ubuntu18时遇到此问题&#xff0c;建议直接跳转到解决方法处。 问题背景 使用系统 Ubuntu 18.04.1 LTS&#xff08;可以通过…

Ubuntu16.04开机后黑屏无法进入系统登陆界面

之前在写小论文&#xff0c;接近一个月没有用Ubuntu&#xff0c;结果想要切换到Linux下使用Hadoop的时候&#xff0c;在grub界面选择第一项Ubuntu却迟迟无法进入登陆界面&#xff0c;一直卡在原地&#xff0c;特征为长久黑屏/紫屏无响应&#xff0c;无法按ctrlaltF1进入命令行以…

ubuntu启动失败黑屏解决方案

现象 启动直接进入黑屏,左上角有光标但不闪烁,ctrl+alt+fx也无法进入命令行界面 异常前操作 在有程序安装过程中直接reboot,接着就一直如此 最终解决 尝试了很多网上的方法,包括进入grub后按e改磁盘ro为rw啊,进入recovery模式该grub配置啊等等都无效,后来发现这种操…

Ubuntu 20.04 - 21.10进入桌面后黑屏的解决思路+经验总结

引言 之前用Ubuntu 20.04 时候三天两头喜欢折腾功能&#xff0c;每次一折腾完Linux就喜欢要么这里要么哪里撂挑子&#xff0c;进入系统后黑屏就是其中最大的一个问题。 回想刚开始用Linux的小白时期&#xff0c;第一次遇到进入系统后黑屏的时候&#xff0c;虽然之前就听说过桌…

Ubuntu20.04 启动卡在黑屏的解决方法

最近在VM中新安装了Ubuntu20.04&#xff0c;悲催的是启动后一直卡在黑屏&#xff1b;在坑里爬了几天后&#xff0c;终于出坑&#xff1b; 以下是整理的实际操作步骤&#xff0c;希望若有入坑的尽快出坑&#xff1b; 1、启动虚拟机时&#xff0c;进入Grub画面选择相应内核启动…

ubuntu 开机黑屏 解决方案 之一(filesystem readonly)

起因 &#xff1a; 由于本人有不关机的习惯&#xff0c;最近几次早上到公司工作&#xff0c;发现电脑都处于假死状态&#xff0c;显示屏永远处于屏保画面。只好重新启动&#xff0c;但是启动之后 电脑就黑屏&#xff0c;彻彻底底的黑屏&#xff0c;什么都看不到。 解决方案&…

ubuntu启动时黑屏,无法进入登录界面

方式1 1、重新启动客户机 2、点击屏幕立即长按左shift键或ESC 3、出现grub菜单后选择第二个 4、又出现一个列表继续选择第二个 5、下一个页面选择第一个 6、下一个界面点击OK就可以了&#xff0c;但不能保证下次开机时能不能进入 方式2 在vmware中的ubuntu开机时黑屏&#xf…