Python实战RBF神经网络

2023-11-02

程序员A:哥们儿,最近手头紧,借点钱? 程序员B:成啊,要多少? A:1000行不? B:咱俩谁跟谁!给你凑个整,这1024,拿去吧。
在这里插入图片描述
之前我们讲了神经网络,人工神经网络是受到人类大脑结构的启发而创造出来的,这也是它能拥有真智能的根本原因。在我们的大脑中,有数十亿个称为神经元的细胞,它们连接成了一个神经网络。
人工神经网络正是模仿了上面的网络结构。下面是一个人工神经网络的构造图。每一个圆代表着一个神经元,他们连接起来构成了一个网络。
在这里插入图片描述
人类大脑神经元细胞的树突接收来自外部的多个强度不同的刺激,并在神经元细胞体内进行处理,然后将其转化为一个输出结果。人工神经元也有相似的工作原理。
在这里插入图片描述
上面的x是神经元的输入,相当于树突接收的多个外部刺激。w是每个输入对应的权重,它影响着每个输入x的刺激强度。

大脑的结构越简单,那么智商就越低。单细胞生物是智商最低的了。人工神经网络也是一样的,网络越复杂它就越强大,所以我们需要深度神经网络。这里的深度是指层数多,层数越多那么构造的神经网络就越复杂。

训练深度神经网络的过程就叫做深度学习。网络构建好了后,我们只需要负责不停地将训练数据输入到神经网络中,它内部就会自己不停地发生变化不停地学习。打比方说我们想要训练一个深度神经网络来识别猫。我们只需要不停地将猫的图片输入到神经网络中去。训练成功后,我们任意拿来一张新的图片,它都能判断出里面是否有猫。但我们并不知道他的分析过程是怎样的,它是如何判断里面是否有猫的。就像当我们教小孩子认识猫时,我们拿来一些白猫,告诉他这是猫,拿来一些黑猫,告诉他这也是猫,他脑子里会自己不停地学习猫的特征。最后我们拿来一些花猫,问他,他会告诉你这也是猫。但他是怎么知道的?他脑子里的分析过程是怎么样的?我们无从知道~~

只要模型是一层一层的,并使用AD/BP算法,就能称作 BP神经网络。RBF 神经网络是其中一个特例。本文主要包括以下内容:

什么是径向基函数
RBF神经网络
RBF神经网络的学习问题
RBF神经网络与BP神经网络的区别
RBF神经网络与SVM的区别
为什么高斯核函数就是映射到高维区间
前馈网络、递归网络和反馈网络
完全内插法
一、什么是径向基函数
1985年,Powell提出了多变量插值的径向基函数(RBF)方法。径向基函数是一个取值仅仅依赖于离原点距离的实值函数,也就是Φ(x)=Φ(‖x‖),或者还可以是到任意一点c的距离,c点称为中心点,也就是Φ(x,c)=Φ(‖x-c‖)。任意一个满足Φ(x)=Φ(‖x‖)特性的函数Φ都叫做径向基函数,标准的一般使用欧氏距离(也叫做欧式径向基函数),尽管其他距离函数也是可以的。

RBF网络能够逼近任意非线性的函数。可以处理系统内难以解析的规律性,具有很好的泛化能力,并且具有较快的学习速度。当网络的一个或多个可调参数(权值或阈值)对任何一个输出都有影响时,这样的网络称为全局逼近网络。

由于对于每次输入,网络上的每一个权值都要调整,从而导致全局逼近网络的学习速度很慢,比如BP网络。如果对于输入空间的某个局部区域只有少数几个连接权值影响输出,则该网络称为局部逼近网络,比如RBF网络。接下来重点先介绍RBF网络的原理,然后给出其实现。先看如下图
在这里插入图片描述

最常用的径向基函数是高斯核函数 ,形式为 k(||x-xc||)=exp{- ||x-xc||2/(2*σ)2) } 其中x_c为核函数中心,σ为函数的宽度参数 , 控制了函数的径向作用范围。

二、RBF神经网络
RBF神将网络是一种三层神经网络,其包括输入层、隐层、输出层。从输入空间到隐层空间的变换是非线性的,而从隐层空间到输出层空间变换是线性的。流图如下:

在这里插入图片描述
RBF网络的基本思想是:用RBF作为隐单元的“基”构成隐含层空间,这样就可以将输入矢量直接映射到隐空间,而不需要通过权连接。当RBF的中心点确定以后,这种映射关系也就确定了。而隐含层空间到输出空间的映射是线性的,即网络的输出是隐单元输出的线性加权和,此处的权即为网络可调参数。其中,隐含层的作用是把向量从低维度的p映射到高维度的h,这样低维度线性不可分的情况到高维度就可以变得线性可分了,主要就是核函数的思想。这样,网络由输入到输出的映射是非线性的,而网络输出对可调参数而言却又是线性的。网络的权就可由线性方程组直接解出,从而大大加快学习速度并避免局部极小问题。

径向基神经网络的激活函数可表示为:
在这里插入图片描述
其中xp

径向基神经网络的结构可得到网络的输出为:

在这里插入图片描述
当然,采用最小二乘的损失函数表示:
在这里插入图片描述
三、RBF神经网络的学习问题
求解的参数有3个:基函数的中心、方差以及隐含层到输出层的权值。

(1)自组织选取中心学习方法:

第一步:无监督学习过程,求解隐含层基函数的中心与方差

第二步:有监督学习过程,求解隐含层到输出层之间的权值

首先,选取h个中心做k-means聚类,对于高斯核函数的径向基,方差由公式求解:

在这里插入图片描述
cmax为所选取中心点之间的最大距离。

隐含层至输出层之间的神经元的连接权值可以用最小二乘法直接计算得到,即对损失函数求解关于w的偏导数,使其等于0,可以化简得到计算公式为:

在这里插入图片描述
(2)直接计算法:

隐含层神经元的中心是随机地在输入样本中选取,且中心固定。一旦中心固定下来,隐含层神经元的输出便是已知的,这样的神经网络的连接权就可以通过求解线性方程组来确定。适用于样本数据的分布具有明显代表性。

(3)有监督学习算法:

通过训练样本集来获得满足监督要求的网络中心和其他权重参数,经历一个误差修正学习的过程,与BP网络的学习原理一样,同样采用梯度下降法。因此RBF同样可以被当作BP神经网络的一种。
  
四、RBF神经网络与BP神经网络之间的区别
1、局部逼近与全局逼近:

BP神经网络的隐节点采用输入模式与权向量的内积作为激活函数的自变量,而激活函数采用Sigmoid函数。各调参数对BP网络的输出具有同等地位的影响,因此BP神经网络是对非线性映射的全局逼近。RBF神经网络的隐节点采用输入模式与中心向量的距离(如欧式距离)作为函数的自变量,并使用径向基函数(如Gaussian函数)作为激活函数。神经元的输入离径向基函数中心越远,神经元的激活程度就越低(高斯函数)。RBF网络的输出与部分调参数有关,譬如,一个wij值只影响一个yi的输出(参考上面第二章网络输出),RBF神经网络因此具有“局部映射”特性。

在这里插入图片描述
所谓局部逼近是指目标函数的逼近仅仅根据查询点附近的数据。而事实上,对于径向基网络,通常使用的是高斯径向基函数,函数图象是两边衰减且径向对称的,当选取的中心与查询点(即输入数据)很接近的时候才对输入有真正的映射作用,若中心与查询点很远的时候,欧式距离太大的情况下,输出的结果趋于0,所以真正起作用的点还是与查询点很近的点,所以是局部逼近;而BP网络对目标函数的逼近跟所有数据都相关,而不仅仅来自查询点附近的数据。

在这里插入图片描述
2、中间层数的区别

BP神经网络可以有多个隐含层,但是RBF只有一个隐含层。

3、训练速度的区别

使用RBF的训练速度快,一方面是因为隐含层较少,另一方面,局部逼近可以简化计算量。对于一个输入x,只有部分神经元会有响应,其他的都近似为0,对应的w就不用调参了。

4、Poggio和Girosi已经证明,RBF网络是连续函数的最佳逼近,而BP网络不是。

在这里插入图片描述
在这里插入图片描述
五、RBF神经网络与SVM的区别
SVM等如果使用核函数的技巧的话,不太适应于大样本和大的特征数的情况,因此提出了RBF。另外,SVM中的高斯核函数可以看作与每一个输入点的距离,而RBF神经网络对输入点做了一个聚类。RBF神经网络用高斯核函数时,其数据中心C可以是训练样本中的抽样,此时与svm的高斯核函数是完全等价的,也可以是训练样本集的多个聚类中心,所以他们都是需要选择数据中心的,只不过SVM使用高斯核函数时,这里的数据中心都是训练样本本身而已。
在这里插入图片描述
最后上python代码实现:

from scipy import *  
from scipy.linalg import norm, pinv  
from matplotlib import pyplot as plt  
class RBF:  
    def __init__(self, indim, numCenters, outdim):  
        self.indim = indim  
        self.outdim = outdim  
        self.numCenters = numCenters  
        self.centers = [random.uniform(-1, 1, indim) for i in xrange(numCenters)]  
        self.beta = 8  
        self.W = random.random((self.numCenters, self.outdim))  
    def _basisfunc(self, c, d):  
        assert len(d) == self.indim  
        return exp(-self.beta * norm(c-d)**2)  
    def _calcAct(self, X):  
        # calculate activations of RBFs  
        G = zeros((X.shape[0], self.numCenters), float)  
        for ci, c in enumerate(self.centers):  
            for xi, x in enumerate(X):  
                G[xi,ci] = self._basisfunc(c, x)  
        return G  
    def train(self, X, Y):  
        """ X: matrix of dimensions n x indim  
            y: column vector of dimension n x 1 """  
        # choose random center vectors from training set  
        rnd_idx = random.permutation(X.shape[0])[:self.numCenters]  
        self.centers = [X[i,:] for i in rnd_idx]  
        print "center", self.centers  
        # calculate activations of RBFs  
        G = self._calcAct(X)  
        print G  
        # calculate output weights (pseudoinverse)  
        self.W = dot(pinv(G), Y)  
    def test(self, X):  
        """ X: matrix of dimensions n x indim """  
        G = self._calcAct(X)  
        Y = dot(G, self.W)  
        return Y  
if __name__ == '__main__':  
    n = 100  
    x = mgrid[-1:1:complex(0,n)].reshape(n, 1)  
    # set y and add random noise  
    y = sin(3*(x+0.5)**3 - 1)  
    # y += random.normal(0, 0.1, y.shape)  
    # rbf regression  
    rbf = RBF(1, 10, 1)  
    rbf.train(x, y)  
    z = rbf.test(x)  
    # plot original data  
    plt.figure(figsize=(12, 8))  
    plt.plot(x, y, 'k-')  
    # plot learned model  
    plt.plot(x, z, 'r-', linewidth=2)  
    # plot rbfs  
    plt.plot(rbf.centers, zeros(rbf.numCenters), 'gs')  
    for c in rbf.centers:  
        # RF prediction lines  
        cx = arange(c-0.7, c+0.7, 0.01)  
        cy = [rbf._basisfunc(array([cx_]), array([c])) for cx_ in cx]  
        plt.plot(cx, cy, '-', color='gray', linewidth=0.2)  
    plt.xlim(-1.2, 1.2)  
    plt.show()  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python实战RBF神经网络 的相关文章

随机推荐

  • osg打开.osg格式文件报错:DynamicLibrary::failed loading “osgPlugins-3.4.1/osgdb_osgd.dll“

    前言 osg打开 osg格式文件报错 DynamicLibrary failed loading osgPlugins 3 4 1 osgdb osgd dll osgPlugins 3 4 1 osgdb osgd dll 解决 需要用到
  • 交换机配置——Cisco(思科)-交换机初始化配置

    一 实验目的 完成一台交换机的初始化配置 并且可以用telnet登录 二 拓扑图如下 三 实验步骤 1 创建一台交换机 S1 和一台主机 PC1 2 先给PC1主机设置IP地址 3 S1配置 进入S1命令行界面 Switch gt enab
  • 在centos安装redis,完成数据迁移,安装python3.6部署项目到服务器上

    1 安装redis 第一步 进入想要安装的目录下载压缩包 cd wget http download redis io releases redis 3 0 0 tar gz 第二步 解压压缩包安装redis tar zxvf redis
  • 李沐基于Pytorch的深度学习笔记(10)-Softmax回归-几种常用损失函数介绍:均方损失、绝对值损失、Huber‘s robust损失(代码在后面章节)

    1 均方损失 第一种是均方损失 1 2和平方是为了方便求导 其中 蓝色曲线是当Y 0时 变换预测值Y 的函数 绿色是似然函数 橙色表示梯度 梯度下降时 对负梯度方向会更新梯度 所以它的导数就是可以看出参数的一个更新 2 绝对值损失 这种定义
  • VC++6.0 IDE的工程用Code::Blocks来打开、编译、调试终极配置方案

    引子 竟然可以用Code Blocks来打开 编译 调试VC 6 0的项目 感觉很神奇 通过配置也让我们更进一步了解VC 6 0的编译器 连接器 调试器 好多兄弟问到要是能支持最新的VS2008和VS2010就好了 其实Code Block
  • SQL数据表层面操作(DDL)

    DDL Data Definition Language 数据定义语言 用于对数据库和数据表的操作 因为操作对象有两个 数据库和数据表 所以我们要在每个命令之后 create drop alter show后面加上database或者tab
  • jstat使用详解(jvm问题排查)

    jstat命令使用 jstat命令可以查看堆内存各部分的使用量 以及加载类的数量 命令的格式如下 jstat 命令选项 vmid 间隔时间 毫秒 查询次数 注意 使用的jdk版本是jdk8 类加载统计 C Users Administrat
  • 联盟链选型之FISCO BCOS

    算起来从去年12 31开始 到现在 已经快满三个月了 这三个月 阅读了各种区块链白皮书 腾讯的 华为的 京东的 可信区块链组织的 组织了一份 dfgx区块链解决方案 参加了华为组织的区块链生态 其实主要是推他自己的目录链 目前区块链这个概念
  • 快递E栈项目实战第二阶段

    快递E栈项目实战第二阶段 文章目录 快递E栈项目实战第二阶段 1 阶段二需求 2 模块分析 3 代码结构和运行截图 4 源码 1 阶段二需求 2 模块分析 1 V视图展示 欢迎 菜单 子菜单 2 D数据存储 快递数据 gt 存取媒介更改为数
  • urllib的使用

    See PyCharm help at https www jetbrains com help pycharm import urllib request 设置关闭本地验证 import ssl import urllib parse s
  • 文件流之文件输出流FileOutputStream

    一 介绍 FileOutputStream实现了向文件中写入byte数据的方法 二 打印数据到文件 package com imooc io import java io FileOutputStream import java io IO
  • 机器学习sklearn-支持向量机1

    目录 相关概念 线性SVM决策过程的可视化 相关概念 支持向量机的分类方法 是在这组分布中找出一个超平面作为决策边界 使模型在数据上的 分类误差尽量接近于小 尤其是在未知数据集上的分类误差 泛化误差 尽量小 边际很小的情况 是一种模型在训练
  • Out of memory

    环境 Ubuntu Server 12 04 i686 问题描述 24G内存 空闲的有20G左右 但是内核老是报这个 动不动就杀程序 Jul 6 13 12 44 00098 kernel 3112325 883069 Out of mem
  • 利用mongodb实现分布式WEB图片存储

    利用mongodb实现分布式WEB图片存储 2012 12 22 14 00 33 标签 mongodb 分布式图片存储 nginx 分布式网站 的确在站比较小得时候 附件不多的时候 当然这样处理很好 但是当 附件数量海里去了 那这样存就蛋
  • Sass中@each、@for、@if的搭配使用

    CSS 预处理器赋予了 CSS 逻辑编程的能力 其中 Sass Less Stylus 最受欢迎 语法都是大同小异 上手也很快 在项目中使用最多的可能要数 Sass 了 本文就讲讲 Sass 中循环遍历 each for 和 if 判断的搭
  • SpringBoot 返回json数据 的几种方式

    一 RestController RequestMapping RestController public class TestController RequestMapping public User test User user new
  • LeetCode/LintCode 题解丨一周爆刷字符串:URL 编码

    描述 给出一个代表网址 host 的字符串 base url 和代表查询参数的列表 query params list 你需要返回带查询参数的完整 URL 查询参数列表由一些包含两个元素的数组组成 数组第一个元素代表参数 数组第二个元素代表
  • 8-js高级-4

    JavaScript 进阶 4 深浅拷贝 浅拷贝 浅拷贝 把对象拷贝给一个新的对象 开发中我们经常需要复制一个对象 如果直接赋值 则复制的是地址 修改任何一个对象 另一个对象都会变化 常见方法 拷贝对象 Object assgin 展开运算
  • postgresql安装报错

    postgresql安装报错 版本问题 版本问题 第一次下载安装postgresql 进到官网 随便点了一个12得版本进行下载 postgresql 12 12 1 windows x64 下载后双击运行 直接提示 百度了一圈 有说 用管理
  • Python实战RBF神经网络

    程序员A 哥们儿 最近手头紧 借点钱 程序员B 成啊 要多少 A 1000行不 B 咱俩谁跟谁 给你凑个整 这1024 拿去吧 之前我们讲了神经网络 人工神经网络是受到人类大脑结构的启发而创造出来的 这也是它能拥有真智能的根本原因 在我们的