RBF神經網絡


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個樣本時候的誤差。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM