使用4x4 SOM網路,將英文字母 “A~L” 進行分類與辨識。
設定SOM 網路4x4個神經元,每個神經元含35個w。
並計算$q(x)$優勝神經元,並轉換成座標。
$$q(x) = \min\limits_{\forall j} ||X - w_{j}||_2$$1
2
3
4
5
6
7
8
9
10
11
12w = np.random.randn(k, 35) # (16,35)
N = np.zeros([len(X), k]) # (12,16)
for i in range(len(X)): # 12
for j in range(len(w)): # 16
N[i, j] = (np.linalg.norm(X[i] - w[j])) # (12,16)
rq = np.zeros([len(X), 1, 2]) # (12,1,2)
for i in range(12):
x = np.argmin(N[i, :]) # (12,1) 12 data 距 16 neuron最小距離 index (0~15)
p = lambda x: (x // 4, x % 4) # 轉成4x4的座標
rq[i, :, :] = np.array([p(x)]) # 輸入與最短神經元的座標(12,1,2)
建立16個神經元的初始座標
1
2
3
4ri = np.zeros([k, 1, 2])
for i in range(k):
q = lambda x: (x // 4, x % 4)
ri[i] = np.array(q(i)) # ri 4*4 座標 (16,1,2) [0,0],[0,1]...->[3,3]利用迴圈更新Weight
$h_{qj}(k) = exp(\displaystyle\frac{||r_j-r_q||_2}{2R^2(k)})$
$w_j(k+1) = w_j(k) + _\Delta w_j$
$_\Delta w_j = \eta(k)h_{qj}(k)(x(k)-w_j(k))$1
2
3
4
5
6
7
8
9
10
11
12h = np.zeros([len(rq), len(ri)]) # 初始h(12,16)
for k in range(Epochs):
lr = lr0 * np.exp(-k / t2)
R = R0 * np.exp(-k / t)
for q in range(len(rq)): # X 12
for j in range(len(ri)): # 16
d = ((np.linalg.norm(ri[j] - rq[q]))**2)
h[q, j] = np.exp(-d / (2 * (R**2)))
for q in range(len(X)): # X 12
for j in range(len(w)): # 16
w_grad = lr * h[q, j] * (X[q, :] - w[j, :])
w[j, :] = w[j, :] + w_grad #(16, 35)
Result
- 利用matshow印出w的結果 :
一開始的結果只能看出”F” “L” “C”
經過調整參數及 Epochs = 10000後
能明顯看出更多字母。
相關參數:
$R_0 = 1.5$
$lr_0 = 0.1$
$lr = \frac{\displaystyle lr_0}{\displaystyle exp(R_0)}$
$ $
$t = \frac{\displaystyle 1000}{\displaystyle exp(\frac{-k}{t_2})}$
$t2 = 1000$
1 | def Draw_w(m, x=4, y=4): |