周志華《機器學習》課後習題解答系列(六):Ch5.7 - RBF網路實驗

Snoopy_Yuan發表於2017-04-30

相關答案和原始碼託管在我的Github上:PY131/Machine-Learning_ZhouZhihua.

5.7. RBF神經網路實驗

這裡寫圖片描述

注:本題程式基於Python實現(這裡檢視完整程式碼和資料集)。

1. RBF網路基礎

RBF網路採用RBF(Radial Basis Function函式)作為隱層神經元啟用函式,是一種區域性逼近神經網路,下面先分析其啟用函式RBF,然後分析RBF神經網路的結構。

1.1. 徑向基函式(RBF)

徑向基函式是一類取值依賴樣本於到中心點距離的函式,本題基於常用的高斯徑向基函式(gaussian RBF)開展實驗。下面是高斯徑向基函式形式書p108式(5.19):

這裡寫圖片描述

這裡的 β 為尺度係數, c_i 為中心點(維度由輸入決定),函式的取值取決於樣本 x 到中心點的距離(2-範數),該函式的引數為 (β, c_i)。

如下圖示為高斯徑向基函式示意圖(繪圖程式):

這裡寫圖片描述

1.2. RBF網路

RBF神經網路一般指一種單隱層前饋神經網路,它使用徑向基函式作為隱層神經元啟用函式,而輸出是隱層輸出的線性組合,網路結構示意如下:

這裡寫圖片描述

參考書p108式(5.18),該神經網路的輸出為:

這裡寫圖片描述

進一步分析,一般函式均可表示成一組基函式的線性組合,而RBF網路相當於用隱層神經元構建了這樣一組基函式,由輸出層進行線性組合,從而實現函式逼近的功能。

2. RBF網路實現

檢視完整程式碼

這裡RBF神經網路建模的過程分一下兩步:

1. 確定神經元對應的高斯徑向基函式中心 c ;
2. 利用BP演算法來訓練剩餘引數 w, β ;

下面依次討論其實現:

2.1. RBF中心獲取

RBF的中心引數 c 的獲取方法有以下一些:

  • 從輸入資料樣本中抽取,這就要求輸入樣本具有較好的代表性;
  • 自組織生成,如聚類法生成,採用聚類中心來作為中心引數 c ,同時根據各中心的距離來初始化尺度係數 β ;

2.2. RBF-BP演算法推導

參考神經網路基礎 - Python程式設計實現標準BP演算法,這裡隱層啟用函式為RBF,輸出層神經元數為 1 ,啟用函式為 y=f(x)=x 。

BP演算法採用梯度下降法進行引數迭代更新,參考書p102-103,進行RBF-BP演算法中基於梯度下降的引數更新推導如下:

這裡寫圖片描述

在完成基礎推導之後,給出RBF網路的BP演算法如下所示:

這裡寫圖片描述

2.3. RBF-BP演算法實現

樣例程式碼如下:

def BackPropagateRBF(self, x, y):
    '''
    the implementation of special BP algorithm on one slide of sample for RBF network
    @param x, y: array and float, input and output of the data sample
    '''

    # dependent packages
    import numpy as np 

    # get current network output
    self.y = self.Pred(x)

    # calculate the gradient for hidden layer 
    g = np.zeros(self.h_n)
    for h in range(self.h_n):
        g[h] = (self.y - y) * self.b[h]    

    # updating the parameter
    for h in range(self.h_n):
        self.beta[h] += self.lr * g[h] * self.w[h] * np.linalg.norm(x-self.c[h],2)
        self.w[h] -= self.lr * g[h]

3. 異或問題實驗

檢視完整程式碼

3.1. 準備資料

首先基於numpy.array生成異或資料,該資料為2輸入,1輸出,如下所示:

樣例程式碼:

# train set
X_trn = np.random.randint(0,2,(100,2))
y_trn = np.logical_xor(X_trn[:,0],X_trn[:,1])

樣例資料:

>>> X_trn
array([[0, 0],
       [1, 1],
       ...
>>> y_trn
array([False, False, ...

3.2. 引數之-RBF中心點

這裡由於採用異或資料,其中心點可以簡單設定如下:

centers = np.array([[0,0],[0,1],[1,0],[1,1]])

同時取隱節點數目為4。

3.3. 生成模型並訓練

樣例程式碼如下:

# construct the network
rbf_nn = RBP_network()  # initial a BP network class
rbf_nn.CreateNN(4, centers, learningrate=0.05)  # build the network structure

# parameter training(這裡迭代10次)
for i in range(10): 
    rbf_nn.TrainRBF(X_trn, y_trn)

繪製出訓練過程中的均方誤差變化曲線如下圖:

這裡寫圖片描述

由上圖可以看到,曲線收斂十分迅速,說明這裡的RBF網路訓練異或資料集十分輕鬆,這也和我們所生成的資料的完備無誤有關。

3.4. 測試模型

按照訓練集資料生成方法生成測試集資料,通過模型預測,得出結果如下:

test error rate: 0.000

即測試錯誤率為0,可知我們的模型預測十分準確的,泛化效能優秀(主要得益於XOR預測模型對RBF網路來說太過簡單)。

4. 小結

回顧RBF網路工作原理,如參考書p108式(5.18)-(5.19)。RBF網路建模類似於非線性模型中的基函式建模,進一步,我們可將其與廣義可加模型聯絡起來。RBF網路採用徑向基函式作為單隱層啟用函式(即核函式),又可將其與SVM with RBF kernel聯絡起來。

回顧RBF網路實現過程,我們或可將該方法視為一種半監督的學習方法,具體有:

  • step 1:無監督的學習,從資料中獲取中心引數,常用聚類方法;
  • step 2:有監督的學習,基於資料訓練引數,過程一般基於BP演算法實現;

5. 參考

下面列出一些參考內容:

相關文章