美文网首页机器学习实战
深度学习——RBF算法

深度学习——RBF算法

作者: 飘涯 | 来源:发表于2018-05-21 10:09 被阅读18次

    前言: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()
    

    结果:


    相关文章

      网友评论

        本文标题:深度学习——RBF算法

        本文链接:https://www.haomeiwen.com/subject/teffjftx.html