目录

  • 主体代码参照:
  • 1、RBF网络相关知识
    • 知识概述
  • 2、K-means聚类最优k值的选取
    • 2.1手肘法:SSE(sum of the squared errors,误差平方和)
    • 2.2 轮廓系数法
  • 3、径向基函数的中心值和方差的选取
    • 3.1 有无监督知识概述
    • 3.2 自组织法(无监督)
      • kmeans聚类方法获取聚类中心和标准差
      • 根据高斯函数的形式构建高斯核函数
    • 3.3 有监督学习
    • 3.4 结果对比
  • 传送门
    • RBF网络知识
    • 核函数
    • 小函数

主体代码参照:

基于tensorflow的RBF神经网络案例

1、RBF网络相关知识

知识概述

RBF神经网络是一种3层的前向网络,其基本工作原理是利用RBF构成的隐藏层空间对低维的输入矢量进行投影,将数据变换到高维空间中去,以使原来线性不可分的问题能够变得线性可分。下图为径向基神经网络的基本结构示意图

由于输入层在RBF网络中仅仅起到信号的传输作用,故而输入层和隐含层之间的连接权值都为1隐含层实现对输入特征的非线性投影,而输出层则负责最后的线性加权求和

输出层负责通过线性优化策略来实现对权值的优化,学习速度通常较快;
隐含层则需要采用非线性优化的方法对激活函数的参数调整,故而其学习速度较慢

RBF网络中待学习优化的参数包括:基函数的中心和方差以及隐含层到输出层的连接权值

RBF网络的参数学习方法按照径向基函数中心的选取有不同的类型,主要包括自组织选取法、随机中心法、有监督中心法和正交最小二乘法等

2、K-means聚类最优k值的选取

2.1手肘法:SSE(sum of the squared errors,误差平方和)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeansdef test_Kmeans_nclusters(data_train):#计算不同的k值时,SSE的大小变化nums=range(2,10)SSE = []  # 存放每次结果的误差平方和for k in nums:estimator = KMeans(n_clusters=k)  # 构造聚类器estimator.fit(data_train)SSE.append(estimator.inertia_)X = range(2,10)plt.xlabel('k')plt.ylabel('SSE')plt.plot(X,SSE,'o-')plt.grid()plt.show()

运行结果如下,根据SSE的变化趋势选取K值为4

2.2 轮廓系数法

轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。

轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优

def Kmeans_SC_nclusters(data_train):nums=range(2,10)Scores = []  # 存放轮廓系数for k in nums:estimator = KMeans(n_clusters=k)  # 构造聚类器estimator.fit(data_train)Scores.append(silhouette_score(data_train,estimator.labels_,metric='euclidean'))X = range(2,10)plt.xlabel('k')plt.ylabel('SC')plt.plot(X,Scores,'o-')plt.show()

运行结果:

3、径向基函数的中心值和方差的选取

3.1 有无监督知识概述

无监督学习:输入数据没有被标记,也没有确定的结果。样本数据类别未知,需要根据样本间的相似性对样本集进行分类(聚类,clustering)试图使类内差距最小化,类间差距最大化
有监督学习:从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测结果。监督学习的训练集要求包括输入输出,也可以说是特征和目标
参考:监督学习和无监督学习

3.2 自组织法(无监督)

自组织法为例,其学习主要包括两个阶段:
第一阶段为无监督和自组织学习阶段,用以确定隐含层基函数的中心及方差
第二阶段是有监督学习过程,可实现隐含层到输出层之间的连接权值的求解

kmeans聚类方法获取聚类中心和标准差

 #使用 k-means 获取聚类中心、标准差def getC_S(self,x,class_num):#构造聚类器#n_clusters: 即我们的k值;   max_iter: 最大的迭代次数estimator=KMeans(n_clusters=class_num,max_iter=10000) estimator.fit(x) #聚类# C 隐藏层函数中心c=estimator.cluster_centers_n=len(c)Cmax=0;for i in range(n):j=i+1while j<n:t=np.sum((c[i]-c[j])**2)# 取正值Cmax=max(s,t)j=j+1s=np.sqrt(Cmax)/np.sqrt(2*n)print(c,type(c),'\n',s,type(s))return c,s

采用Kmeans聚类方法获取高斯径向基函数的中心和方差,具体高斯函数形式参考:
高斯函数应用总结
高斯函数(Gaussian function)的详细分析

高斯径向基函数的中心点和方差的:

对Kmeans计算流程介绍可参照:Kmeans聚类过程形象解释K均值聚类算法

小细节:

t=np.sum((c[i]-c[j])**2)# 平方取正值

Kmeans 找到的中心值格式如下,形状为4*1,数据类型为numpy.ndarray,所以抽取元素直接相减的数据类型不是float类型,使用sum函数消除,计算的方差类型为numpy.float64。

根据高斯函数的形式构建高斯核函数

  #高斯核函数(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))

相关函数解释:

tile()函数是用来对张量(Tensor)进行扩展的,其特点是对当前张量内的数据进行一定规则的复制。最终的输出张量维度不变
reshape()函数是数组对象中的方法,用于改变数组的形状
reduce_sum() 用于计算张量tensor沿着某一维度的和,可以在求和后降维

小细节验证:

import tensorflow as tf
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
hidden =2
fature=3
a1=tf.tile(a,[1,hidden])
a2=tf.reshape(a1,[-1,hidden,fature])
b=np.array([[1,1,1],[1,1,1]])
c=a2-b
#print('a: '+str(np.shape(a)),'\ta1: '+str(np.shape(a1))+'\ta2: '+str(np.shape(a2))+'\tc: '+str(np.shape(c)))
# 不同维度累加,默认降维
Sum0=tf.reduce_sum(c,0)
Sum1=tf.reduce_sum(c,1)
Sum2=tf.reduce_sum(c,2)
with tf.Session() as sess:print('a1:\n',sess.run(a1),'\na2:\n',sess.run(a2))print(np.shape(a2))print('c:\n',sess.run(c))print('Sum0:\n',sess.run(Sum0))print('Sum1:\n',sess.run(Sum1))print('Sum2:\n',sess.run(Sum2))

运行结果:

a:[[1 2 3][4 5 6]]
a1:[[1 2 3 1 2 3][4 5 6 4 5 6]]
a2: shape=[2,2,3][[[1 2 3],[1 2 3]][[4 5 6],[4 5 6]]]
c=a2-b: #b=np.array([[1,1,1],[1,1,1]]) shape=[2,3][ [[0 1 2],[0 1 2]][[3 4 5],[3 4 5]] ]# 从去掉最外层括号开始计算,0,1,2
Sum0:[[3 5 7][3 5 7]]
Sum1:[[ 0  2  4][ 6  8 10]]
Sum2:[[ 3  3][12 12]]

3.3 有监督学习

class RBF_supervision():#初始化学习率、学习步数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})self.c,self.s,self.w,self.b=sess.run([c,s,w,b])        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.4 结果对比

传送门

RBF网络知识

RBF(径向基)神经网络
MLP、RBF、SVM网络比较及其应用前景
【机器学习】径向基(RBF)神经网络的tensorflow实现

【机器学习】RBF神经网络原理与Python实现

核函数

对核函数(kernel)最通俗易懂的理解
知乎-机器学习里的 kernel 是指什么?
核函数K

小函数

numpy.reshape()函数
直观的理解tensorflow中的tf.tile()函数
numpy函数:[1]shape用法
数据预处理中fit()
在keras中model.fit_generator()和model.fit()有什么区别
python使用matplotlib:subplot绘制多个子图

TensorFlow学习--函数逼近(RBF神经网络)相关推荐

  1. TensorFlow学习(三)——神经网络进阶

    TensorFlow学习(三)--神经网络进阶DNN 一.神经网络的进阶概念 激活函数 偏置项 损失函数 经典损失函数 交叉熵(cross entropy)损失函数--分类问题 示例展示 代码表示 代 ...

  2. 径向基RBF(radial basis function)函数、RBF神经网络、 反推(back-stepping)控制

    文章目录 1. 什么是径向基函数 1. 高斯径向基函数 2. 反演S型函数 3. 拟多二次函数 2. 正则化径向基神经网络 3. 基于RBF网络逼近的自适应控制 1. 问题描述 2. RBF 网络原理 ...

  3. tensorflow学习函数笔记

    为什么80%的码农都做不了架构师?>>>    [TensorFlow教程资源](https://my.oschina.net/u/3787228/blog/1794868](htt ...

  4. TensorFlow学习笔记之三(神经网络的优化)

    文章目录 1. 使用激活函数去线性化(为什么要用激活函数) 实验证明线性模型的局限性 常用激活函数 2. 神经网络复杂度:用网络层数和网络参数的个数表示 3. 损失函数(loss):预测值(y)与已知 ...

  5. tensorflow学习笔记七----------卷积神经网络

    卷积神经网络比神经网络稍微复杂一些,因为其多了一个卷积层(convolutional layer)和池化层(pooling layer). 使用mnist数据集,n个数据,每个数据的像素为28*28* ...

  6. TensorFlow学习--LeNet5神经网络

    LeNet5神经网络 简介 LeNet5由Yann LeCun于1994年提出,模型结构如图: 在模型中,每个卷积层包含三个部分:卷积/池化/非线性激活函数.并采用MLP作为分类器.同时层与层的稀疏连 ...

  7. RBF神经网络python实践学习(BP算法)

    续上一篇:RBF神经网络学习及实践 RBF神经网络求解方法 RBF网络中需要求解的参数为:径向基函数的中心.方差和隐层到输出层的权值. 对于基函数中心的选取方法主要有:随机选取.聚类选取.有监督学习选 ...

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

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

  9. rbf神经网络参数设置_隐含层节点数对RBF网络逼近的影响(06)

    由高斯函数的表达式可见,逼近误差除了与高斯函数的中心点坐标cj和宽度参数bj有关,还与隐含层神经元节点数量有关. 实例:采用RBF网络对如下离散模型进行逼近:y(k)=u(k)^3+y(k-1)/[1 ...

最新文章

  1. 聚类热图怎么按自己的意愿调整分支的顺序?
  2. 安卓开源项目周报1220
  3. ajax使用pur请求怎么传参,数组参数传递给控制器的方式
  4. SonarQube结合IDEA实现代码检测
  5. mysql_unbuffered_query的_用mysql_unbuffered_query函数取大数据
  6. Typora for Mac(文本编辑器)
  7. python 通信_深入浅出通信原理(Python代码版)
  8. 软件测试人员工作计划怎么写,软件测试个人工作计划.docx
  9. 为何学这么多技术,却做不好Coder!
  10. 失控的京东高管文化:频繁离职背后原因是什么?
  11. 【JZOJ 5424】【NOIP2017提高A组集训10.25】凤凰院凶真
  12. mysql8安装错误,Windows安装MySQL8.0.16 的步骤及出现错误问题解决方法
  13. 通过思翼SIYI MK15E回传Realsense D435i 的 RGB图像
  14. 2022美国大学生数学建模竞赛C题摘要及总结
  15. MapReduce中各个阶段的分析(转自道法—自然老师)
  16. python画水平线和垂直线横线 纵线
  17. CCF基础P29练习题解
  18. 119全国消防日,我们要注意用火安全
  19. Scratch课程设计(四)
  20. android 陀螺仪源码,陀螺仪源码 android

热门文章

  1. 灵信视觉led。六代卡和五代卡
  2. php判断手机还是电脑
  3. jconsole与jvisualvm
  4. 学校计算机使用维护管理制度,计算机教室使用管理制度
  5. matlab用最小二乘法确定系数,如何用MATLAB最小二乘法得出回归方程系数? - 程序语言 - 小木虫 - 学术 科研 互动社区...
  6. 【Proteus仿真】ATMEGA16 ADC转化数码管显示
  7. DCB工作机制解析三(CN)
  8. 李开复演讲----给未来的你
  9. CEC2015:动态多目标野狗优化算法求解CEC2015(提供完整MATLAB代码,含GD、IGD、HV和SP评价指标)
  10. 使用 Scrapy-Redis 进行分布式爬取