2012年4月21日 星期六

Self-Organizing Map


SOM可以將N維(N-dimension)的資料映射到2維(2-dimension)的空間上(如上圖所示)並且維持輸入資料中的拓撲(topology)特性.將資料映射到2 維空間時則可以使用視覺化(visualization)的方式呈現, 以方便後續的觀察及分析.最常見的就是把輸入color data分群藉此觀察輸入color的分佈情形


上圖左為一個初使化的隨機顏色分布矩陣,隨著輸入資料SOM漸漸的秀出了輸入資料的分佈情形

SOM 演算法
1. 初始化(initialization)
2. 輸入資料集(dataset)
3. 從輸入資料集挑選一個資料並尋找x-w最接近的神經元為Best Matching Unit (BMU)
4. 更新BMU神經元的權重及其"鄰近"神經元
5. 重複步驟3~4, 直到結束


其中
假設x輸入為V1~Vn,權重w為W1~Wn
尋找最接近的神經元可用以下公式表示
需要更新的"鄰近"神經元的鄰近半徑定義如下
σ0可預設為圖形尺寸的1/2,t為當下第幾次iteration,λ為iteration的總數可見其半徑會隨時間增加逐漸由size/2減少到1,示意圖如下
更新BMU神經元的權重公式
其中L為learning rate表示如下
L0可取0.1,t為當下第幾次iteration,λ為iteration的總數可見L會隨時間增加而由0.1下降至接近0
Θ為一個墨西哥帽函數表示離BMU越遠的鄰近神經元更新影響越小
dist為當下的鄰近神經元和BMU距離,σ為上述鄰近半徑函數



有一個二維的聚類問題,其範例資料共有10筆,且在二維樣本空間上的分佈如圖所示:

            x 1     x 2
D1      -0.9    -0.8
D2     -0.8    0.6
D3     0.9     0.6
D4     0.7     -0.4
D5     -0.2    0.2
D6     -0.7    -0.6
D7     -0.9    0.8
D8     0.7     0.6
D9     0.8     -0.8
D10   0.1      -0.2

以一個輸出層為3×3個單元之SOM網路解此一問題
先隨機給定每一個輸出層單元加權值

載入第一個訓練範例D1,計算後得知輸出層處理單元的優勝神經元為 9,調整單元 9 及鄰近單元 5, 6, 8之連結加權值矩陣。
|123|
|456| 中9的鄰近為5,6,8
|789|












載入第二個訓練範例,計算後得知輸出層處理單元的優勝神經元為 4,調整優勝單元 4 及鄰近單元 1, 5, 7之連結加權值矩陣。












反覆載入上述十個訓練範例 (如:50個學習循環)可知:
輸出單元 1 代表左上角聚類特徵;單元 3 代表右上角聚類特徵;單元 5 代表中間聚類特徵;單元 7 代表左下角聚類特徵;單元 9 代表右下角聚類特徵。
其餘輸出單元不具任何聚類的特徵。
















ˇ

下圖左為輸出的3維加權值一開始的隨機初始化狀況,隨著訓練過程網子會逐漸打開線與線不會有重疊或交叉情形
然而,若相關參數設定得不恰當,則訓練過程中,很可能發生網子打結或纏繞在一起的現像

例如:如果學習速率在整個訓練過程中沒有適時地下降,則很可能會在某次疊代時,原本網子已張開,但因為學習速率還是很大,而發生網子又再度纏繞的現像。


底下是matlab代碼


clear;
width  = 50;
height = 50;
numinput = 500;
data = rand(height,width,3);
figure(1);
imshow(data);
red = [1,0,1];green = [0,1,0];dk_green = [0,0.5,0.25];blue = [0,0,1];dk_blue = [0,0,0.5];yellow = [1,1,0.2];orange = [1,0.4,0.25];purple = [1,0,1];
color = [red;green;dk_green;blue;yellow;orange;purple];
sample = rand(numinput,1);
inputdata = color(ceil(sample*7),:);
m_dMapRadius = max(width, height)/2;  %最大鄰近半徑σ
m_dTimeConstant = numinput/log(m_dMapRadius); %最大時間總數λ
for i=1:numinput;
    x=inputdata(i,:);
    x = reshape(x,1,1,3);
    bestwj=0;
    bestwk=0;
    minerror=[1,1,1];
    m_dNeighbourhoodRadius = m_dMapRadius * exp(-i/m_dTimeConstant);   %鄰近半徑σ
    m_dLearningRate = 0.1 * exp(-i/m_dTimeConstant);                       %Learning rate
    for j = 1:width
        for k = 1:height        
               error= x-data(j,k,:);
                error = reshape(error,1,3);
               dist = norm(error);
               if (dist < norm(minerror)) 
                  minerror = error;
                   bestwj=j;
                   bestwk=k;
              end
        end
    for j = max(1,floor(bestwj-m_dNeighbourhoodRadius)):min(height,floor(bestwj+m_dNeighbourhoodRadius))
        for k = max(1,floor(bestwk-m_dNeighbourhoodRadius)):min(width,floor(bestwk+m_dNeighbourhoodRadius))
            d2 = (j - bestwj)^2+(k-bestwk)^2;                    %dist^2
            theda = exp(-d2/(2*m_dNeighbourhoodRadius^2));       %墨西哥帽函數Θ
            data(j,k,:) = data(j,k,:) + theda*m_dLearningRate.*(x-data(j,k,:));   %更新權重函數         
        end
    end
    end
end
figure(2);
imshow(data);

沒有留言:

張貼留言