十一、机器学习进阶知识:径向基神经网络(RBFNN)的实现(Python,附源码及数据集)

本文详细介绍了径向基函数神经网络(RBFNN)的理论基础,包括网络结构、前向传播、反向传播和建模步骤。并提供基于Python的RBFNN训练与测试代码,利用K-means聚类确定中心点,采用高斯函数作为激活函数,以及讲解了参数初始化、损失函数和反向传播算法。实验数据集用于表层土壤重金属元素含量预测。
摘要由CSDN通过智能技术生成

一、理论基础

径向基神经网络(Radial Basis Function Neural Network,简称RBFNN)是一种具有较强映射功能的三层前向网络,其原理与反向传播神经网络(BPNN)较为接近,最主要的特征为以径向基函数作为隐含层激活函数,数据从输入层传入隐含层后,通过径向基函数对其进行非线性映射,然后经过线性计算传递至输出层进行输出。
反向传播神经网络(BPNN)原理参考:
反向传播神经网络(BPNN)的实现(Python,附源码及数据集)

1、径向基神经网络结构

径向基神经网络的结构图如下图所示:
在这里插入图片描述

2、前向传播过程

径向基神经网络的前向传播过程类似于无监督学习,首先通过使用聚类算法如K-means对数据进行聚类,将聚类生成的中心点作为隐含层径向基函数的中心点,其中径向基函数一般选用高斯函数,然后利用中心点信息计算得出径向基函数的宽度向量,宽度向量的计算公式如下:
在这里插入图片描述

其中c_max为中心点之间的最大距离,h为节点数。
之后输入数据分别经过隐含层、输出层进行相关计算,输入样本x_i在隐含层的第j个节点的输出由以下公式计算得出:
在这里插入图片描述

其中c_j与σ_j分别为隐含层第j个节点的中心点与宽度向量,除上述方法外,还可直接随机生成隐含层的中心点与宽度向量。
输入样本x_i在输出层的第m个节点的输出由以下公式计算得出:
在这里插入图片描述

其中ω_m为该节点的权值,φ为激活函数。
激活函数原理参考:
神经网络基础知识之激活函数

3、反向传播过程

径向基神经网络的反向传播过程类似于监督学习,主要是对网络隐含层的中心点、宽度向量以及输出层的权值、阈值进行不断修正的过程,这一过程主要通过损失函数计算出每个参数的梯度值,然后使用反向传播算法如随机梯度下降法(SGD)对权值进行不断修正的过程,以输出层的权值为例,其更新公式如下:
在这里插入图片描述

其中E为损失函数,μ为学习率。
损失函数原理参考:
机器学习基础知识之损失函数
反向传播原理参考:
神经网络之反向传播算法(梯度、误差反向传播算法BP)

4、建模步骤

以使用径向基神经网络进行预测为例,可以将径向基神经网络预测模型的建模步骤总结如下:

  1. 根据输入数据的相关特征确定径向基神经网络输入层、隐含层以及输出层的节点数;
  2. 使用K-means算法对模型的输入数据进行聚类,将聚类生成的中心点作为隐含层径向基函数的中心点,通过中心点计算获得隐含层径向基函数的宽度向量;
  3. 选择一种参数初始化方法对径向基神经网络输出层的连接权值以及阈值进行随机初始化;
  4. 数据由输入层输入径向基神经网络,传递至隐含层后经径向基函数对数据进行非线性转换;
  5. 数据在隐含层输出后传递至输出层,在与输出层的连接权值进行线性计算后由激活函数进行非线性转换,最后得到网络的前向传播输出;
  6. 选择一种损失函数对网络的前向传播输出以及目标值进行相关计算得到损失值;
  7. 以输出层的损失值计算得到输出层连接权值以及阈值的梯度,选择一种反向传播算法对它们进行调整;
  8. 损失值传递至隐含层,同样使用相同的反向传播算法对隐含层的中心点以及宽度向量进行调整;
  9. 获得一个参数得到更新后的径向基神经网络;
  10. 在达到最大迭代次数或满足停止迭代条件之前,重复步骤4到步骤9,在达到最大迭代次数后,输出隐含层与输出层参数确定的径向基神经网络。

参数初始化方法参考:
神经网络基础知识之参数初始化

二、径向基神经网络的实现

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

1、训练过程(RBFNN.py)

#库的导入
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans

#激活函数
def tanh(x):
    return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
#激活函数偏导数
def de_tanh(x):
    return (1-x**2)


#参数设置
samnum = 72  #输入数据数量
hiddenunitnum = 8  #隐含层节点数
indim = 4  #输入层节点数
outdim = 1  #输出层节点数
maxepochs = 500  #最大训练次数
errorfinal = 0.65*10**(-3)  #停止迭代训练条件
learnrate = 0.001  #学习率

#输入数据的导入
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)
samplein = np.mat([Co,Cr,Mg,Pb])
#数据归一化,将输入数据压缩至0到1之间,便于计算,后续通过反归一化恢复原始值
sampleinminmax = np.array([samplein.min(axis=1).T.tolist()[0],samplein.max(axis=1).T.tolist()[0]]).transpose()#对应最大值最小值
sampleout = np.mat([Ti])
sampleoutminmax = np.array([sampleout.min(axis=1).T.tolist()[0],sampleout.max(axis=1).T.tolist()[0]]).transpose()#对应最大值最小值
sampleinnorm = ((np.array(samplein.T)-sampleinminmax.transpose()[0])/(sampleinminmax.transpose()[1]-sampleinminmax.transpose(
对于使用 RBF(径向函数)神经网络进行预测的 Python 实现,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了所需的 Python 库,如 numpy、scikit-learn 和 matplotlib。如果没有安装,可以使用 pip 命令进行安装。 2. 导入所需的库: ```python import numpy as np from sklearn.cluster import KMeans from sklearn.metrics.pairwise import euclidean_distances ``` 3. 定义 RBF 网络类: ```python class RBFNetwork: def __init__(self, num_centers, sigma=1): self.num_centers = num_centers self.sigma = sigma self.centers = None self.weights = None def train(self, X, y): kmeans = KMeans(n_clusters=self.num_centers) kmeans.fit(X) self.centers = kmeans.cluster_centers_ D = euclidean_distances(X, self.centers) phi = np.exp(-(D ** 2) / (2 * self.sigma ** 2)) self.weights = np.linalg.pinv(phi) @ y def predict(self, X): D = euclidean_distances(X, self.centers) phi = np.exp(-(D ** 2) / (2 * self.sigma ** 2)) return phi @ self.weights ``` 4. 准备数据并进行训练和预测: ```python # 准备训练数据 X_train = np.array([[1], [2], [3], [4], [5]]) y_train = np.array([2, 4, 6, 8, 10]) # 创建 RBF 神经网络对象并进行训练 rbf_net = RBFNetwork(num_centers=3, sigma=1) rbf_net.train(X_train, y_train) # 准备测试数据 X_test = np.array([[6], [7], [8]]) # 进行预测 y_pred = rbf_net.predict(X_test) print(y_pred) ``` 这样就可以使用 RBF 神经网络进行预测了。记得根据你的具体需求调整代码中的参数和数据。希望对你有所帮助!
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七层楼的疯子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值