一、理论基础
模糊神经网络(Fuzzy Neural Network,简称FNN)本质上是一种将模糊理论与人工前向神经网络相结合的多层前向神经网络,在处理信息时,该网络能够具有更大的处理范围以及更快的信息处理速度,因此该网络的自学习能力与映射也相对较高。与反向传播神经网络(BPNN)相似,其训练过程主要分为前向传播与反向传播两个部分。
反向传播神经网络(BPNN)原理参考:
反向传播神经网络(BPNN)的实现(Python,附源码及数据集)
1、模糊神经网络结构
模糊神经网络的结构图如下图所示:
2、前向传播过程
数据输入模糊神经网络总共需要经过五层网络结构,最先是输入层,这一层的节点数量为输入数据的特征维度,即当数据的特征维度为n时,输入层的节点数为n。
然后数据从输入层传递至隶属度函数计算层,在这一层需要使用隶属度函数来计算每个节点的隶属度,每一个节点代表一个隶属度函数,这一层的节点个数为输入变量有可能构成的模糊条件的个数。隶属度函数一般选用高斯函数,公式如下:
其中u_ij为节点的输出,x_i为输入数据,c_ij为隶属函数的中心点,b_ij为隶属函数的宽度向量,m为对输入进行模糊分级的个数。
之后数据传递至规则生成层,这一层的节点数为模糊规则数,这一层的输出为每条规则的适用度,一般采用下列公式进行计算:
紧接着在归一化层对规则生成层的节点输出进行归一化处理,这一层的节点与规则生成层相同,使用如下公式进行归一化:
最后数据在输出层进行加权处理获得最终输出,计算的公式为:
其中ω_j为输出层的连接权值,上述公式是基于网络的输出变量维度为1时而设定的权值,当输出变量的维度增加时,对权值也将进行相应的调整。
3、反向传播过程
模糊神经网络同BPNN一样,一般使用反向传播算法如随机梯度下降法(SGD)对隶属函数的中心点、宽度向量以及输出层的连接权值进行优化。
以输出层的权值为例,其更新公式如下:
其中E为误差函数,μ为学习率。
损失函数原理参考:
机器学习基础知识之损失函数
反向传播原理参考:
神经网络之反向传播算法(梯度、误差反向传播算法BP)
4、建模步骤
以使用模糊神经网络进行数据预测为例,可以将模糊神经网络预测模型的建模步骤总结如下:
- 根据输入数据的相关特征确定模糊神经网络输入层、隶属度函数计算层、规则生成层、归一化层以及输出层的节点数;
- 选择一种参数初始化方法对模糊神经网络隶属度函数计算层中隶属度函数的中心点、宽度向量以及输出层的连接权值、阈值进行随机初始化;
- 数据由输入层输入模糊神经网络,依次经过隶属度函数计算层以及规则生成层计算获得输出;
- 将规则生成层的输出在归一化层进行归一化处理之后经由输出层的加权处理获得网络的最终前向传播输出;
- 传递至隐含层后经径向基函数对数据进行非线性转换;
- 选择一种损失函数对网络的前向传播输出以及目标值进行相关计算得到损失值;
- 以输出层的损失值计算得到输出层连接权值的梯度,选择一种反向传播算法对它们进行调整;
- 损失值传递至隶属度函数计算层,同样使用相同的反向传播算法对隶属度函数的中心点以及宽度向量进行调整;
- 获得一个参数得到更新后的模糊神经网络;
- 在达到最大迭代次数之前,重复步骤3到步骤9,在达到最大迭代次数后,输出隐含层与输出层参数确定的多层前馈神经网络。
参数初始化方法参考:
神经网络基础知识之参数初始化文章来源:https://www.toymoban.com/news/detail-400101.html
二、模糊神经网络的实现
以数据预测为例,下面介绍基于Python实现模糊神经网络的过程。
选用某省市的表层土壤重金属元素数据集作为实验数据,该数据集总共96组,随机选择其中的24组作为测试数据集,72组作为训练数据集。选取重金属Ti的含量作为待预测的输出特征,选取重金属Co、Cr、Mg、Pb作为模型的输入特征。文章来源地址https://www.toymoban.com/news/detail-400101.html
1、训练过程(FNN.py)
#库的导入
import numpy as np
import pandas as pd
#输入数据的导入
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()#对应最大值最小值
#待预测数据为Ti
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()[0])).transpose()
sampleoutnorm = ((np.array(sampleout.T)-sampleoutminmax.transpose()[0])/(sampleoutminmax.transpose()[1]-sampleoutminmax.transpose()[0])).transpose()
sampleinnorm = sampleinnorm.transpose()
sampleoutnorm = sampleoutnorm.transpose()
S = 2 #模糊分级个数
T = 16 #规则生成层、归一化层节点数
iteration = 500 #迭代训练次数
learningrate = 0.01
到了这里,关于模糊神经网络(FNN)的实现(Python,附源码及数据集)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!