文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-10-27 10:14

关注

文章目录

一、理论基础

广义回归神经网络(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 npimport 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.0        for 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------------------')#预测差值errerr = predict - testY#MAE等评价指标的计算mae = np.sum(np.abs(predict-testY))/paverage_loss1=np.sum(np.abs((predict-testY)/testY))/pmape="%.2f%%"%(average_loss1*100)f1 = 0for m in range(p):    f1 = f1 + np.abs(testY[m]-predict[m])/((np.abs(testY[m])+np.abs(predict[m]))/2)f2 = f1 / psmape="%.2f%%"%(f2*100)#计算预测值与真实值误差与真实值之比的分布A=0B=0C=0D=0E=0for m in range(p):    y1 = np.abs(testY[m]-predict[m])/np.abs(testY[m])    if y1 <= 0.1:        A = A + 1    elif y1 > 0.1 and y1 <= 0.2:        B = B + 1    elif y1 > 0.2 and y1 <= 0.3:        C = C + 1    elif y1 > 0.3 and y1 <= 0.4:        D = D + 1    else:        E = E + 1print("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、参考源码及实验数据集

参考源码及实验数据集

来源地址:https://blog.csdn.net/weixin_42051846/article/details/128765413

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯