RBF神經網絡通常只有三層,即輸入層、中間層和輸出層。其中中間層主要計算輸入x和樣本矢量c(記憶樣本)之間的歐式距離的Radial Basis Function (RBF)的值,輸出層對其做一個線性的組合。
徑向基函數:
RBF神經網絡的訓練可以分為兩個階段:
第一階段為無監督學習,從樣本數據中選擇記憶樣本/中心點;可以使用聚類算法,也可以選擇隨機給定的方式。
?
第二階段為監督學習,主要計算樣本經過RBF轉換后,和輸出之間的關系/權重;可以使用BP算法計算、也可以使用簡單的數學公式計算。
?
1. 隨機初始化中心點
2. 計算RBF中的激活函數值,每個中心點到樣本的距離
3. 計算權重,原函數:Y=GW
4. W = G^-1Y
RBF網絡能夠逼近任意非線性的函數(因為使用的是一個局部的激活函數。在中心點附近有最大的反應;越接近中心點則反應最大,遠離反應成指數遞減;就相當于每個神經元都對應不同的感知域)。
可以處理系統內難以解析的規律性,具有很好的泛化能力,并且具有較快的學習速度。
有很快的學習收斂速度,已成功應用于非線性函數逼近、時間序列分析、數據分類、模式識別、信息處理、圖像處理、系統建模、控制和故障診斷等。
當網絡的一個或多個可調參數(權值或閾值)對任何一個輸出都有影響時,這樣的網絡稱為全局逼近網絡。由于對于每次輸入,網絡上的每一個權值都要調整,從而導致全局逼近網絡的學習速度很慢,比如BP網絡。
如果對于輸入空間的某個局部區域只有少數幾個連接權值影響輸出,則該網絡稱為局部逼近網絡,比如RBF網絡。
RBF和BP神經網絡的對比
BP神經網絡(使用Sigmoid激活函數)是全局逼近;RBF神經網絡(使用徑向基函數作為激活函數)是局部逼近;
相同點:
- 1. RBF神經網絡中對于權重的求解也可以使用BP算法求解。
不同點:
- 1. 中間神經元類型不同(RBF:徑向基函數;BP:Sigmoid函數)
- 2. 網絡層次數量不同(RBF:3層;BP:不限制)
- 3. 運行速度的區別(RBF:快;BP:慢)
簡單的RBF神經網絡代碼實現
# -*- coding:utf-8 -*-
"""@Time : @Author: Feng Lepeng@File : RBF_demo.py@Desc :
"""
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
from scipy.linalg import norm, pinv # norm 求模,pinv 求逆mpl.rcParams["font.sans-serif"] = ["SimHei"]
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_dimself.out_dim = out_dimself.num_centers = num_centersself.centers = [np.random.uniform(-1, 1, input_dim) for i in range(num_centers)]self.beta = 8self.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):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 Gdef train(self, X, Y):"""進行模型訓練:param X: 矩陣,x的維度必須是給定的 n * input_dim:param Y: 列的向量組合,要求維度必須是n * 1:return:"""# 隨機初始化中心點rnd_idx = np.random.permutation(X.shape[0])[:self.num_centers]self.centers = [X[i, :] for i in rnd_idx]# 相當于計算RBF中的激活函數值G = self._calcAct(X)# 計算權重==> Y=GW ==> W = G^-1Yself.W = np.dot(pinv(G), Y)def test(self, X):""" x的維度必須是給定的n * input_dim"""G = self._calcAct(X)Y = np.dot(G, self.W)return Yif __name__ == '__main__':# 構造數據n = 100x = np.linspace(-1, 1, n).reshape(n, 1)y = np.sin(3 * (x + 0.5) ** 3 - 1)# RBF神經網絡rbf = RBF(1, 20, 1)rbf.train(x, y)z = rbf.test(x)plt.figure(figsize=(12, 8))plt.plot(x, y, 'ko', label="原始值")plt.plot(x, z, 'r-', linewidth=2, label="預測值")plt.legend()plt.xlim(-1.2, 1.2)plt.show()
效果圖片:
?
RBF訓練
RBF函數中心,擴展常數,輸出權值都應該采用監督學習算法進行訓練,經歷一個誤差修正學習的過程,與BP網絡的學習原理一樣.同樣采用梯度下降愛法,定義目標函數為:
ei為輸入第i個樣本時候的誤差。
這個等式輸出函數中忽略了閾值,為使目標函數最小化,各參數的修正量應與其梯度成正比。