RBF神經網絡
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神經網絡代碼實現
# norm求模,pinv求逆 from scipy.linalg import norm, pinv import numpy as np from matplotlib import pyplot as plt import matplotlib as mpl 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_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): 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: """ # 隨機初始化中心點 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^-1Y self.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 Y
測試上面的代碼:
# 構造數據 n = 100 x = 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個樣本時候的誤差。