1 前言

在使用RBF神经网络实现函数逼近中,笔者介绍了使用 Matlab 训练RBF神经网络。本博客将介绍使用 tensorflow 训练RBF神经网络。代码资源见:RBF案例(更新版)

这几天,笔者在寻找 tensorflow 中 RBF 官方案例,没找到,又看了一些博客,发现这些博客或不能逼近多元函数,或不能批量训练。于是,自己手撕了一下代码。

RBF神经网络中需要求解的参数有4个:基函数的中心方差、隐含层到输出层的权值偏值

RBF 神经网络的关键在于中心的选取,一般有如下三种方法:

  • 直接计算法:直接通过先验经验固定中心,并计算方差,再通过有监督学习得到其他参数
  • 自组织学习法:先通过k-means等聚类算法求出中心(无监督学习),并计算方差,再通过有监督学习得到其他参数
  • 有监督学习法:直接通过有监督学习求出所有参数

在直接计算法和自组织学习法中,方差的计算公式如下:

其中 Cmax 表示 h 个中心间的最大距离。

本博客主要介绍后两种中心计算方法实现 RBF 神经网络。

笔者工作空间如下:

2  RBF神经网络实现

2.1 自组织学习选取RBF中心

RBF_kmeans.py

import tensorflow as tf
import numpy as np
from sklearn.cluster import KMeansclass RBF:#初始化学习率、学习步数def __init__(self,learning_rate=0.002,step_num=10001,hidden_size=10):self.learning_rate=learning_rateself.step_num=step_numself.hidden_size=hidden_size#使用 k-means 获取聚类中心、标准差def getC_S(self,x,class_num):estimator=KMeans(n_clusters=class_num,max_iter=10000) #构造聚类器estimator.fit(x) #聚类c=estimator.cluster_centers_n=len(c)s=0;for i in range(n):j=i+1while j<n:t=np.sum((c[i]-c[j])**2)s=max(s,t)j=j+1s=np.sqrt(s)/np.sqrt(2*n)return c,s#高斯核函数(c为中心,s为标准差)def kernel(self,x,c,s):x1=tf.tile(x,[1,self.hidden_size]) #将x水平复制 hidden次x2=tf.reshape(x1,[-1,self.hidden_size,self.feature])dist=tf.reduce_sum((x2-c)**2,2)return tf.exp(-dist/(2*s**2))#训练RBF神经网络def train(self,x,y):self.feature=np.shape(x)[1] #输入值的特征数self.c,self.s=self.getC_S(x,self.hidden_size) #获取聚类中心、标准差x_=tf.placeholder(tf.float32,[None,self.feature]) #定义placeholdery_=tf.placeholder(tf.float32,[None,1]) #定义placeholder#定义径向基层z=self.kernel(x_,self.c,self.s)  #定义输出层w=tf.Variable(tf.random_normal([self.hidden_size,1]))b=tf.Variable(tf.zeros([1]))yf=tf.matmul(z,w)+bloss=tf.reduce_mean(tf.square(y_-yf))#二次代价函数optimizer=tf.train.AdamOptimizer(self.learning_rate) #Adam优化器     train=optimizer.minimize(loss) #最小化代价函数init=tf.global_variables_initializer() #变量初始化with tf.Session() as sess:sess.run(init)for epoch in range(self.step_num):sess.run(train,feed_dict={x_:x,y_:y})if epoch>0 and epoch%500==0:mse=sess.run(loss,feed_dict={x_:x,y_:y})print(epoch,mse)self.w,self.b=sess.run([w,b],feed_dict={x_:x,y_:y})def kernel2(self,x,c,s): #预测时使用x1=np.tile(x,[1,self.hidden_size]) #将x水平复制 hidden次x2=np.reshape(x1,[-1,self.hidden_size,self.feature])dist=np.sum((x2-c)**2,2)return np.exp(-dist/(2*s**2))def predict(self,x):z=self.kernel2(x,self.c,self.s)pre=np.matmul(z,self.w)+self.breturn pre

2.2 有监督学习选取RBF中心

RBF_Supervised.py

import numpy as np
import tensorflow as tfclass RBF:#初始化学习率、学习步数def __init__(self,learning_rate=0.002,step_num=10001,hidden_size=10):self.learning_rate=learning_rateself.step_num=step_numself.hidden_size=hidden_size#高斯核函数(c为中心,s为标准差)def kernel(self,x,c,s): #训练时使用x1=tf.tile(x,[1,self.hidden_size]) #将x水平复制 hidden次x2=tf.reshape(x1,[-1,self.hidden_size,self.feature])dist=tf.reduce_sum((x2-c)**2,2)return tf.exp(-dist/(2*s**2))#训练RBF神经网络def train(self,x,y):self.feature=np.shape(x)[1] #输入值的特征数x_=tf.placeholder(tf.float32,[None,self.feature]) #定义placeholdery_=tf.placeholder(tf.float32,[None,1]) #定义placeholder#定义径向基层c=tf.Variable(tf.random_normal([self.hidden_size,self.feature]))s=tf.Variable(tf.random_normal([self.hidden_size]))z=self.kernel(x_,c,s)#定义输出层w=tf.Variable(tf.random_normal([self.hidden_size,1]))b=tf.Variable(tf.zeros([1]))yf=tf.matmul(z,w)+bloss=tf.reduce_mean(tf.square(y_-yf))#二次代价函数optimizer=tf.train.AdamOptimizer(self.learning_rate) #Adam优化器train=optimizer.minimize(loss) #最小化代价函数init=tf.global_variables_initializer() #变量初始化with tf.Session() as sess:sess.run(init)for epoch in range(self.step_num):sess.run(train,feed_dict={x_:x,y_:y})if epoch>0 and epoch%500==0:mse=sess.run(loss,feed_dict={x_:x,y_:y})print(epoch,mse)self.c,self.s,self.w,self.b=sess.run([c,s,w,b],feed_dict={x_:x,y_:y})def kernel2(self,x,c,s): #预测时使用x1=np.tile(x,[1,self.hidden_size]) #将x水平复制 hidden次x2=np.reshape(x1,[-1,self.hidden_size,self.feature])dist=np.sum((x2-c)**2,2)return np.exp(-dist/(2*s**2))def predict(self,x):z=self.kernel2(x,self.c,self.s)pre=np.matmul(z,self.w)+self.breturn pre

3 案例

3.1 一元函数逼近

待逼近函数:

(1)自组织学习选取RBF中心

test_kmeans.py

import numpy as np
import matplotlib.pyplot as plt
from RBF_kmeans import RBF#待逼近的函数
def fun(x):return x*x+2*x*np.sin(x)-np.exp(-x)/10#生成样本
def generate_samples():n=150 #样本点个数wideX=0.03 #横轴噪声的宽度wideY=0.5 #纵轴噪声宽度t=np.linspace(-5,5,n).reshape(-1,1) #横轴理想值u=fun(t) #纵轴理想值noisyX=np.random.uniform(-wideX,wideX,n).reshape(n,-1) #横轴噪声noisyY=np.random.uniform(-wideY,wideY,n).reshape(n,-1) #纵轴噪声x=t+noisyX #横轴实际值y=u+noisyY #纵轴实际值 return t,u,x,yt,u,x,y=generate_samples()
rbf=RBF(0.003,20001,4) #学习率
rbf.train(x,y)
pre=rbf.predict(t)
plt.plot(x,y,'+')
plt.plot(t,u)
plt.plot(t,pre)
plt.legend(['dot','real','pre'],loc='upper left')

自组织学习选取RBF中心

(2)有监督学习选取RBF中心

test_Supervised.py

import numpy as np
import matplotlib.pyplot as plt
from RBF_Supervised import RBF#待逼近的函数
def fun(x):return x*x+2*x*np.sin(x)-np.exp(-x)/10#生成样本
def generate_samples():n=150 #样本点个数wideX=0.03 #横轴噪声的宽度wideY=0.5 #纵轴噪声宽度t=np.linspace(-5,5,n).reshape(-1,1) #横轴理想值u=fun(t) #纵轴理想值noisyX=np.random.uniform(-wideX,wideX,n).reshape(n,-1) #横轴噪声noisyY=np.random.uniform(-wideY,wideY,n).reshape(n,-1) #纵轴噪声x=t+noisyX #横轴实际值y=u+noisyY #纵轴实际值return t,u,x,yt,u,x,y=generate_samples()
rbf=RBF(0.003,20001,4) #学习率
rbf.train(x,y)
pre=rbf.predict(t)
plt.plot(x,y,'+')
plt.plot(t,u)
plt.plot(t,pre)
plt.legend(['dot','real','pre'],loc='upper left')

有监督学习选取RBF中心

3.2 二元函数逼近

待逼近函数:

(1)自组织学习选取RBF中心

test_kmeans2.py

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from RBF_kmeans import RBF#待逼近的函数
def fun(t):x1=(t+0.5*np.pi)*np.sin(t+0.5*np.pi)x2=(t+0.5*np.pi)*np.cos(t+0.5*np.pi)y=1.5*tx=np.append(x1,x2,1)return x,y#生成样本
def generate_samples():n=200 #样本点个数wideX=0.6 #水平方向噪声的宽度wideY=1 #纵轴噪声宽度t=np.linspace(0,10*np.pi,n).reshape(-1,1) #横轴理想值u,v=fun(t) #纵轴理想值noisyX=np.random.uniform(-wideX,wideX,u.shape).reshape(n,-1) #水平方向噪声noisyY=np.random.uniform(-wideY,wideY,n).reshape(n,-1) #纵轴噪声x=u+noisyX #横轴实际值y=v+noisyY #纵轴实际值return u,v,x,yu,v,x,y=generate_samples()
rbf=RBF(0.02,20001,10) #学习率
rbf.train(x,y)
pre=rbf.predict(u)ax=plt.figure().gca(projection='3d')
ax.plot(x[:,0],x[:,1],y[:,0],'+')
ax.plot(u[:,0],u[:,1],v[:,0])
ax.plot(u[:,0],u[:,1],pre[:,0])
plt.legend(['dot','real','pre'],loc='upper left')
plt.show()

自组织学习选取RBF中心

(2)有监督学习选取RBF中心

test_Supervised2.py

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from RBF_Supervised import RBF#待逼近的函数
def fun(t):x1=(t+0.5*np.pi)*np.sin(t+0.5*np.pi)x2=(t+0.5*np.pi)*np.cos(t+0.5*np.pi)y=1.5*tx=np.append(x1,x2,1)return x,y#生成样本
def generate_samples():n=200 #样本点个数wideX=0.6 #水平方向噪声的宽度wideY=1 #纵轴噪声宽度t=np.linspace(0,10*np.pi,n).reshape(-1,1) #横轴理想值u,v=fun(t) #纵轴理想值noisyX=np.random.uniform(-wideX,wideX,u.shape).reshape(n,-1) #水平方向噪声noisyY=np.random.uniform(-wideY,wideY,n).reshape(n,-1) #纵轴噪声x=u+noisyX #横轴实际值y=v+noisyY #纵轴实际值return u,v,x,yu,v,x,y=generate_samples()
rbf=RBF(0.02,20001,10) #学习率
rbf.train(x,y)
pre=rbf.predict(u)ax=plt.figure().gca(projection='3d')
ax.plot(x[:,0],x[:,1],y[:,0],'+')
ax.plot(u[:,0],u[:,1],v[:,0])
ax.plot(u[:,0],u[:,1],pre[:,0])
plt.legend(['dot','real','pre'],loc='upper left')
plt.show()

有监督学习选取RBF中心

通过实验可以看到:无论是一元函数逼近还是二元函数逼近,在隐藏层神经元个数、学习率、学习步数相同的情况下,有监督学习法都比自组织学习法效果好。

基于tensorflow的RBF神经网络案例相关推荐

  1. DL之DNN:基于Tensorflow框架对神经网络算法进行参数初始化的常用九大函数及其使用案例

    DL之DNN:基于Tensorflow框架对神经网络算法进行参数初始化的常用九大函数及其使用案例 目录 基于Tensorflow框架对神经网络算法进行初始化的常用函数及其使用案例 1.初始化的常用函数

  2. 基于tensorflow和卷积神经网络的电影推荐系统的实现

    基于tensorflow和卷积神经网络的电影推荐系统的实现 一. 数据处理 1. MovieLens数据集 2. 处理后的数据 二. 建模&训练 1. 嵌入层 2. 文本卷积层 3. 全连接层 ...

  3. python神经网络库识别验证码_基于TensorFlow 使用卷积神经网络识别字符型图片验证码...

    本项目使用卷积神经网络识别字符型图片验证码,其基于TensorFlow 框架.它封装了非常通用的校验.训练.验证.识别和调用 API,极大地减低了识别字符型验证码花费的时间和精力. 项目地址:http ...

  4. 【深度学习】我的第一个基于TensorFlow的卷积神经网络

    基于MNIST数据集实现简单的卷积神经网络,熟悉基于TensorFlow的CNN的流程和框架. #1.导入相关库 import numpy as np import tensorflow as tf ...

  5. 基于Simulink的RBF神经网络的LMS自适应滤波器设计仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 LMS(Least Mean Square), 由 Widrow 和 Hoff 于1960年提出,也 ...

  6. 基于HHT和RBF神经网络的故障检测——第二篇论文读后感

    故障诊断主要包括三部分: 1.故障信号检测方法(定子电流信号检测 [ 定子电流幅值和电流频谱 ] ,振动信号检测,温度信号检测,磁通检测法,绝缘检测法,噪声检测法) 2.故障信号的处理方法,即故障特征 ...

  7. 基于径向基函数RBF神经网络的非线性函数拟合研究-含Matlab代码

    目录 一.RBF神经网络基本原理 二.模型建立 三.RBF网络拟合结果分析 四.注意事项 五.参考文献 六.Matlab代码获取 一.RBF神经网络基本原理 1988年Broomhead和Lowe将径 ...

  8. 基于tensorflow的卷积神经网络图像识别

    参考    基于卷积神经网络的图像识别 - 云+社区 - 腾讯云 一.图像识别问题简介与经典数据集 视觉是人类认识世界非常重要的一种知觉.对于人类来说,通过识别手写体数字.识别图片中的物体或者是找出图 ...

  9. python rbf神经网络_原创,基于径向基函数(RBF)神经网络RBF网络的举例应用!

    function RBF_NN_Example() clc clear all %  创建训练样本 %  线性函数的训练 Mn_Train=100*[rand(1,5) rand(1,5)+0.5 r ...

  10. 基于GA优化RBF神经网络(GA-RBF)数据预测的matlab仿真

    目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 遗传算法的基本运算过程如下:  (1)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0 ...

最新文章

  1. Android 编程下代码之(QQ消息列表滑动删除)
  2. HASH 大量插入与查询
  3. 夜间灯光数据dn值_中国区域DMSP/OLS夜间灯光影像的校正
  4. G6 图可视化引擎——入门教程——元素及其配置
  5. php put 参数,php – 如何在Guzzle 5中发送PUT请求的参数?
  6. 【机器学习】 - keras中的模型可视化plot_model模块(含依赖包pydot和graphviz的详细安装过程与注意事项)
  7. oracle有人用过fra吗,FRA(闪回恢复区)
  8. (软件工程复习核心重点)第十章面向对象设计-第四节:设计人机交互子系统和设计任务管理子系统
  9. (王道408考研数据结构)第五章树-第三节1:二叉树遍历(先序、中序和后序)
  10. C语言二叉树之二叉链表
  11. 散列函数之双重散列算法解决冲突问题
  12. s3c2440定时器简介
  13. unity3d技术摄像头跟随_天尚元无人驾驶技术应用丨环卫清扫车
  14. 网站SEO优化工具大全推荐-免费SEO优化工具
  15. web实现地图画标识物
  16. 青岛大学计算机小姐姐,青岛大学举牌校花一夜爆红,评论区留下脏话:见不得别人好是病!...
  17. 「绝影」出没上海车展,约上30+车企一块「商量」
  18. 权威解释----如何选择羽毛球?(摘自《羽毛球竞赛规则问答》北京体育大学出版社
  19. 如果如果,如果没有如果
  20. edge浏览器如何把网页放到桌面_win10系统设置edge浏览器快捷方式放到桌面的操作方法...

热门文章

  1. golang java 对比_golang编程语言和java的性能对比
  2. MaxScript与外部程序通讯
  3. HBase安装与验证
  4. STM32精英版(正点原子STM32F103ZET6开发板)学习篇1——新建库函数模版
  5. 光纤传感技术:基于Matlab的OFDR系统数值仿真
  6. 心理测试软件沙盘游戏,心理沙盘游戏软件|心理测验管理系统 网络版
  7. 2022-2028年中国AC-DC蓝牙音箱市场现状研究分析与发展前景预测报告
  8. 面向公交营运管理的车路协同应用场景研究
  9. Matlab-Simulink文件类型总结
  10. Java定时自动锁屏小程序_小程序 番茄时钟如何实现锁屏持续运行功能