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

Snoopy_Yuan發表於2017-05-02

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

SOM神經網路實驗

這裡寫圖片描述

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

1 基礎概述

1.1 SOM網路概念

SOM(Self-Organizing Map,自組織對映)網路是一種無監督競爭型神經網路,常用於資料的聚類和降維分析。它從仿生學中引出,模擬了面臨不同輸入模式時生物神經組織的興奮機理。SOM神經網路最初由Kohonen提出,所以也常把SOM網路稱為Kohonen網路

SOM神經網路通過自組織對映(SOM),將高維的輸入資料對映到低維空間,從而實現了特徵空間的降維,同時保持了輸入資料在高維空間中的拓撲結構。下圖為最常見的輸出層為二維的SOM神經網路:

這裡寫圖片描述

SOM網路經過訓練之後,輸出層各神經元及其引數反映的是輸入資料的模式聚合。

1.2 SOM網路工作機理

SOM工作機理分為三大部分:

  • 競爭(Competition)
  • 協同(Cooperation)
  • 適應(Adaption)

下面對工作機制進行概要討論(這裡以上圖5.11所示輸出層為二維的Kohonen網路為例):

1. 引數

先明確網路所涉及的資料和引數(即要通過資料學習的物件):

資料:
    輸入層:D 個輸入變數記為 x = {x_i: i=1,…,D};
    輸出層:N*M 個輸出變數記為 o = {o_jk: j=1,…,N;k=1,…,M};

引數:
    優勝鄰域係數(j1k1和j2k2) T = {T_j1k1j2k2: j1,j2=1,…,N;k1,k2=1,…,M},和距離遠近有關;    
    學習率 η,和迭代次數有關;
    輸出層第 jk 個神經元相對於輸入層的權重引數 w_jk = {w_jki: j=1,…,N;k=1,...,M;i=1,…,D},對應該神經元模式屬性;   

下面將進一步解釋這些引數及其使用。

2. 競爭機制(Competition)

我們需要一個判別函式來確定,在某條輸入樣本下,勝出的是輸出層的那一個神經元,這裡可採用歐氏距離來度量,通過計算輸出層神經元 o_jk 和 輸入之間的距離,越小的勝出。判別函式如下式,記勝出的神經元索引為 I(x),可以看出這裡起決定性作用的引數是權重 w:

這裡寫圖片描述

3. 協同機制(Cooperation)

SOM網路根據優勝鄰域進行權值調整(側抑制(lateral inhibition)機制),即對於所有輸出層神經元,越靠近勝出者權值調整幅度越大,我們可用下面的衰減函式來度量這樣一種權值調整幅度:

這裡寫圖片描述

可以繪製出該函式示意如下圖示(可以看出其取值規律符合側抑制機理):

這裡寫圖片描述

4. 引數更新機制(Adaption)

引數更新針對權重 w,直接給出更新公式如下:

這裡寫圖片描述

為優化收斂,防止振盪,可採用隨迭代次數衰減的學習率,同理可調整上面側抑制函式中的尺度係數 σ,一併給出其計算式樣例如下:

這裡寫圖片描述

1.3 SOM網路訓練演算法

根據上面的記述,給出SOM網路訓練演算法概略如下:

這裡寫圖片描述

2 簡單實驗(降維、聚類)

這裡我們採用西瓜資料集3.0a作為分析物件,採用SOM神經網路來分析其輸入變數的聚類情況,並與實際類別對比。

2.1 資料預處理

物件資料集(watermelon_3a)如下所示:

這裡寫圖片描述

資料樣本為二維連續輸入和一維標稱輸出,繪製其視覺化散點圖如下所示:

這裡寫圖片描述

從資料點的分佈可以得到一些基本資訊(如線性不可分,存在離群點,每類樣本量平衡等)。

由於演算法中涉及到距離的計算,這裡需要將資料集的每個屬性進行歸一化(正則化)(含糖率、密度)。

採用Z-score的歸一化的python程式樣例如下:

# data normalization (z-scale) based on column
X_train = np.zeros(X.shape)
for j in range(X.shape[1]):
    for i in range(X.shape[0]):
        X_train[i,j] = (X[i,j] - X[:,j].mean())/X[:,j].std()
X = X_train

採用Max-min歸一化的Matlab語句樣例如下:

X = mapminmax(X, 0, 1);

2.2 模型訓練

這裡我們採用兩種方式互補實現此處SOM網路的實驗:

  1. 基於python的pymvpa2機器學習包實現;
  2. 基於Matlab的神經網路工具箱(Neural Network Toolbox)實現;

下面主要講述實現思路:

  1. 為體現SOM的資料降維功能,搭建網路時設定其Kohonen層(競爭輸出層)為一維。
  2. 執行引數訓練的迭代過程,檢視輸出層(競爭層)的神經元類別所屬情況:

2.3 結果分析

首先檢視神經元權重引數(記憶引數) w 的變化結果(神經元記憶中心運動情況):

這裡寫圖片描述

在Matlab-神經網路工具箱上實現SOM網路並訓練得到競爭層(size = 10*1)的神經元對映結果圖:

這裡寫圖片描述

可以看出此時SOM網路競爭層以大致從輸入中提取出1,2兩類(且對應神經元數量相當),這與樣本真實情況相符,但是由於樣本中離群點的存在,導致出現了異類(3)。

進一步,若不考慮降維,取樣pymvpa2包搭建一個2維Kohonen層(競爭層),經過多次訓練後得出下面的權重著色圖:

這裡寫圖片描述

可以看到,權重值存在漸變,說明存在類簇的作用。

3. 總結

這裡對SOM網路進行初步的學習探索,可以看到它在資料降維聚類分析上的優勢。

進一步可知,SOM網路的聚類無需事先指定類別數量,是一種完全自主的實現(這點不同於K-means等聚類方法)。

經過訓練的SOM網路可以進一步實現分類預測等更多功能。

4. 參考

(注:sompy是本文實現過程中可用到的一個python軟體包,未在文中提出)

相關文章