深度學(xué)習(xí)——RBF算法

前言:rbf算法用的不多,但他的思想引用到局部逼近,能夠更快求解參數(shù),在未來的發(fā)展應(yīng)該不錯

簡介

1>方法:先給定幾個中心點和聚類類似,然后判斷數(shù)據(jù)是屬于哪個中心點,那么屬于該中心的特性就比較大,RBF網(wǎng)絡(luò)能夠逼近任意非線性的函數(shù)??梢蕴幚硐到y(tǒng)內(nèi)難以解析的規(guī)律性,具有很好的泛化能力,并且具有較快的學(xué)習(xí)速度。
2>優(yōu)點:有很快的學(xué)習(xí)收斂速度,已成功應(yīng)用于非線性函數(shù)逼近、時間序列分析、數(shù)據(jù)分類、 模式識別、信息處理、圖像處理、系統(tǒng)建模、控制和故障診斷等。
3>全局逼近網(wǎng)絡(luò):當(dāng)網(wǎng)絡(luò)的一個或多個可調(diào)參數(shù)(權(quán)值或閾值)對任何一個輸出都有影響時,這樣的網(wǎng)絡(luò)稱為全局逼近網(wǎng)絡(luò)。由于對于每次輸入,網(wǎng)絡(luò)上的每一個權(quán)值都要調(diào)整,從而導(dǎo)致全局逼近網(wǎng)絡(luò)的學(xué)習(xí)速度很慢,比如BP網(wǎng)絡(luò)。
4>局部逼近網(wǎng)絡(luò):如果對于輸入空間的某個局部區(qū)域只有少數(shù)幾個連接權(quán)值影響輸出,則該網(wǎng)絡(luò)稱為局部逼近網(wǎng)絡(luò),比如RBF網(wǎng)絡(luò)。

原理:

RBF Network 通常只有三層:
1>輸入層
2>中間層:計算輸入 x 矢量與樣本矢量 c 歐式距離的 Radial Basis Function (RBF) 的值。隱含層的作用是把向量從低維度的m映射到高維度的P,這樣低維線性不可分
的情況到高維線性可分了。
3>輸出層:計算它們的線性組合。


RBF Kernel的特點:


image.png

先是用類似聚類的方式把區(qū)分出記憶樣本(圖中的圓心點),然后有用了BP的算法求解。


image.png

神經(jīng)網(wǎng)絡(luò)遇到的問題:
一般來講,可以通過增加神經(jīng)元和網(wǎng)絡(luò)層次來提升神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)能力,使其得到的模型更加能夠符合數(shù)據(jù)的分布場景;但是實際應(yīng)用場景中,神經(jīng)網(wǎng)絡(luò)的層次一般情況不會太大,因為太深的層次有可能產(chǎn)生一些求解的問題
在DNN(深度神經(jīng)網(wǎng)絡(luò))的求解中有可能存在兩個問題:梯度消失和梯度爆炸;我們在求解梯度的時候會使用到鏈?zhǔn)角髮?dǎo)法則,實際上就是一系列的連乘,如果每一層都小于1的話,則梯度越往前乘越小,導(dǎo)致梯度消失,而如果連乘的數(shù)字在每層 都是大于1的,則梯度越往前乘越大,導(dǎo)致梯度爆炸.
用代碼實現(xiàn)一個rbf神經(jīng)網(wǎng)絡(luò)如下:

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

from matplotlib import pyplot as plt

np.random.seed(28)


class RBF:
    """
    RBF徑向基神經(jīng)網(wǎng)絡(luò)
    """

    def __init__(self, input_dim, num_centers, out_dim):
        """
        初始化函數(shù)
        :param input_dim: 輸入維度數(shù)目
        :param num_centers: 中間的核數(shù)目
        :param out_dim:輸出維度數(shù)目
        """
        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):
        """
        進行模型訓(xùn)練
        :param X: 矩陣,x的維度必須是給定的n * input_dim
        :param Y: 列的向量組合,要求維度必須是n * 1
        :return:
        """

        # 隨機初始化中心點(permutation API的作用是打亂順序,如果給定的是一個int類型的數(shù)據(jù),那么打亂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
        # 相當(dāng)于計算RBF中的激活函數(shù)值
        G = self._calcAct(X)

        # calculate output weights (pseudoinverse)
        # 計算權(quán)重(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


# 構(gòu)造數(shù)據(jù)
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神經(jīng)網(wǎng)絡(luò)
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
# 展示預(yù)測值
plt.plot(x, z, 'r-', linewidth=2)

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

結(jié)果:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文章主要分為:一、深度學(xué)習(xí)概念;二、國內(nèi)外研究現(xiàn)狀;三、深度學(xué)習(xí)模型結(jié)構(gòu);四、深度學(xué)習(xí)訓(xùn)練算法;五、深度學(xué)習(xí)的優(yōu)點...
    艾剪疏閱讀 22,216評論 0 58
  • 好煩啊,其實自己是想做牛夢迪那樣的人的,但是又不知道該怎么做,考慮的事情有很多,其實覺得還是做自己比較自在,那就做...
    a2fe3d8f488b閱讀 165評論 0 0
  • 摘要: 本篇是對筆者上一篇文章 Android進階 - 二維碼生成 的一點補充。 效果圖: 工具類: 本篇不再重復(fù)...
    夢想編織者灬小楠閱讀 12,073評論 9 39
  • 前天,我生日。 弟弟買了粉色花瓣做成的蛋糕,這個蛋糕是我長這么大最漂亮的也很好吃的生日蛋糕,我們還做了一桌子可口的...
    暖陽灑灑閱讀 237評論 0 0
  • 文 | 風(fēng)的衣裳 1919年的春天,細(xì)雨霏霏。傍晚,江蘇南通一大戶人家的庭院,一間安靜的房間,一個女子倚在床榻上,...
    風(fēng)的衣裳閱讀 3,047評論 29 33

友情鏈接更多精彩內(nèi)容