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







沒有留言:
張貼留言