专栏首页机器学习原理深度学习(5)——RBF算法简介

深度学习(5)——RBF算法简介

前言:rbf算法用的不多,但他的思想引用到局部逼近,能够更快求解参数,在未来的发展应该不错

简介

RBF网络能够逼近任意非线性的函数。 可以处理系统内难以解析的规律性,具有很好的泛化能力,并且具有较快的学习速度。 有很快的学习收敛速度,已成功应用于非线性函数逼近、时间序列分析、数据分类、 模式识别、信息处理、图像处理、系统建模、控制和故障诊断等。 当网络的一个或多个可调参数(权值或阈值)对任何一个输出都有影响时,这样的网 络称为全局逼近网络。由于对于每次输入,网络上的每一个权值都要调整,从而导致 全局逼近网络的学习速度很慢,比如BP网络。 如果对于输入空间的某个局部区域只有少数几个连接权值影响输出,则该网络称为局 部逼近网络,比如RBF网络。 原理:

神经网络遇到的问题 一般来讲,可以通过增加神经元和网络层次来提升神经网络的学习能力,使 其得到的模型更加能够符合数据的分布场景;但是实际应用场景中,神经网 络的层次一般情况不会太大,因为太深的层次有可能产生一些求解的问题 在DNN(深度神经网络)的求解中有可能存在两个问题:梯度消失和梯度爆炸;我们在求解梯 度的时候会使用到链式求导法则,实际上就是一系列的连乘,如果每一层都 小于1的话,则梯度越往前乘越小,导致梯度消失,而如果连乘的数字在每层 都是大于1的,则梯度越往前乘越大,导致梯度爆炸. 用代码实现一个rbf神经网络如下:

from scipy.linalg import norm, pinv
import numpy as np

from matplotlib import pyplot as plt

np.random.seed(28)


class RBF:
    """
    RBF径向基神经网络
    """

    def __init__(self, input_dim, num_centers, out_dim):
        """
        初始化函数
        :param input_dim: 输入维度数目
        :param num_centers: 中间的核数目
        :param out_dim:输出维度数目
        """
        self.input_dim = input_dim
        self.out_dim = out_dim
        self.num_centers = num_centers
        self.centers = [np.random.uniform(-1, 1, input_dim) for i in range(num_centers)]
        self.beta = 8
        self.W = np.random.random((self.num_centers, self.out_dim))

    def _basisfunc(self, c, d):
        return np.exp(-self.beta * norm(c - d) ** 2)

    def _calcAct(self, X):
        # calculate activations of RBFs
        G = np.zeros((X.shape[0], self.num_centers), 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):
        """
        进行模型训练
        :param X: 矩阵,x的维度必须是给定的n * input_dim
        :param Y: 列的向量组合,要求维度必须是n * 1
        :return:
        """

        # 随机初始化中心点(permutation API的作用是打乱顺序,如果给定的是一个int类型的数据,那么打乱range(int)序列)
        rnd_idx = np.random.permutation(X.shape[0])[:self.num_centers]
        self.centers = [X[i, :] for i in rnd_idx]

        # calculate activations of RBFs
        # 相当于计算RBF中的激活函数值
        G = self._calcAct(X)

        # calculate output weights (pseudoinverse)
        # 计算权重(pinv API:计算矩阵的逆) ==> Y=GW ==> W = G^-1Y
        self.W = np.dot(pinv(G), Y)

    def test(self, X):
        """ X: matrix of dimensions n x indim """
        G = self._calcAct(X)
        Y = np.dot(G, self.W)
        return Y


# 构造数据
n = 100
x = np.linspace(-1, 1, n).reshape(n, 1)
y = np.sin(3 * (x + 0.5) ** 3 - 1)
# y = y + np.random.normal(0, 0.1, n).reshape(n, 1)

# RBF神经网络
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)

plt.xlim(-1.2, 1.2)
plt.show()

结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 天池大赛——瑞金医院MMC人工智能辅助构建知识图谱大赛审题解题思路解题训练模型编写预测结果

    实体抽取就是自然语言中的命名实体识别,命名实体识别的算法非常多, 比如隐马尔科夫、条件随机场、rnn、lstm等等 用标注好的数据训练模型参数,调优,预测就...

    DC童生
  • 知识图谱(2)——neo4j的用法

    先了解各个命令的用法 创建一个节点 CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 ...

    DC童生
  • 机器学习(16)——EM算法示例

    算法思想:含有隐变量的极大似然估计 我们经常会从样本观察数据中,找出样本的模型参数。 最常用的方法就是极大化模型分布的对数似然函数。 但是在一些情况下,我们得到...

    DC童生
  • Python解析XML字符串

    py3study
  • 轻松学Pytorch – 构建生成对抗网络

    又好久没有继续写了,这个是我写的第21篇文章,我还在继续坚持写下去,虽然经常各种拖延症,但是我还记得,一直没有敢忘记!今天给大家分享一下Pytorch生成对抗网...

    OpenCV学堂
  • 教你制作可移动的导航栏

    Dwyane
  • 数据结构(三):队列

      队列通常用来实现消息(任务)的快速读写,即消息队列。消息队列的常用来解决如下问题:

    py3study
  • 【多目标跟踪】搞不懂MOT数据集,会跑代码有啥用!

    数据集用的最多的是 MOTChallenge,专注于行人追踪的。https://motchallenge.net/

    机器视觉CV
  • Python手写模拟单向链表对象,栈对象和树

    步履不停凡
  • 使用Python写Windows Ser

    如果你想用Python开发Windows程序,并让其开机启动等,就必须写成windows的服务程序Windows Service,用Python来做这个事情必...

    py3study

扫码关注云+社区

领取腾讯云代金券