上圖左為一個初使化的隨機顏色分布矩陣,隨著輸入資料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);
沒有留言:
張貼留言