|
|
|
@ -46,14 +46,13 @@
|
|
|
|
|
|
|
|
|
|
![SOM Algorithm](./images/SOM2.png)
|
|
|
|
|
|
|
|
|
|
### 참고[¶]()
|
|
|
|
|
|
|
|
|
|
[https://untitledtblog.tistory.com/5](https://untitledtblog.tistory.com/5)
|
|
|
|
|
|
|
|
|
|
### SOM 예제 코드 1[¶]()
|
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
<summary>Code View</summary>
|
|
|
|
|
|
|
|
|
|
<summary>입력 데이터 생성</summary>
|
|
|
|
|
<div markdown="1">
|
|
|
|
|
|
|
|
|
@ -264,6 +263,7 @@ array(\[\[0.76959259, 0.03105338\],
|
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
<summary>Code View</summary>
|
|
|
|
|
|
|
|
|
|
<summary>Randomize 함수</summary>
|
|
|
|
|
<div markdown="1">
|
|
|
|
|
|
|
|
|
@ -404,9 +404,102 @@ array(\[\[0.76959259, 0.03105338\],
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<summary>결과</summary>
|
|
|
|
|
<div markdown="1">
|
|
|
|
|
|
|
|
|
|
![result1](./images/a1.png)
|
|
|
|
|
![result2](./images/a2.png)
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### SOM 예제 코드 3[¶]()
|
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
<summary>Code View</summary>
|
|
|
|
|
<div markdown="1">
|
|
|
|
|
|
|
|
|
|
````python
|
|
|
|
|
import os
|
|
|
|
|
import logging
|
|
|
|
|
import numpy as np
|
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
import matplotlib.font_manager as fm
|
|
|
|
|
import matplotlib as mpl
|
|
|
|
|
|
|
|
|
|
# 마이너스 기호 표시 설정
|
|
|
|
|
mpl.rcParams['axes.unicode_minus'] = False
|
|
|
|
|
|
|
|
|
|
# 한글 폰트 설정 - Windows
|
|
|
|
|
# font_location = fm.findfont(fm.FontProperties(family='Malgun Gothic'))
|
|
|
|
|
# fm.FontProperties(fname=font_location)
|
|
|
|
|
# plt.rcParams['font.family'] = 'Malgun Gothic'
|
|
|
|
|
|
|
|
|
|
# 로거 수준을 ERROR로 설정하여 경고 메시지를 제거
|
|
|
|
|
matplotlib_logger = logging.getLogger("matplotlib")
|
|
|
|
|
matplotlib_logger.setLevel(logging.ERROR)
|
|
|
|
|
# 한글 폰트 설정 - Linux
|
|
|
|
|
font_dir = "/usr/share/fonts/truetype/nanum"
|
|
|
|
|
nanum_gothic_ttf = os.path.join(font_dir, "NanumGothic.ttf")
|
|
|
|
|
nanum_gothic = fm.FontProperties(fname=nanum_gothic_ttf)
|
|
|
|
|
# plt.rcParams["font.family"] = nanum_gothic.get_name()
|
|
|
|
|
plt.rcParams["axes.unicode_minus"] = False
|
|
|
|
|
|
|
|
|
|
# 초기 연결 가중치 개수
|
|
|
|
|
num_rows = 15
|
|
|
|
|
num_cols = 15
|
|
|
|
|
a = 0.20 # 이웃 크기(G)와 학습률(eta)의 감소를 위한 인자
|
|
|
|
|
|
|
|
|
|
# 초기 가중치 값 설정
|
|
|
|
|
dx = 0.1
|
|
|
|
|
m = dx * (1 - 2 * np.random.rand(num_rows, num_cols)) + dx * (1j - 2j * np.random.rand(num_rows, num_cols))
|
|
|
|
|
|
|
|
|
|
for cycle in range(1, 5001):
|
|
|
|
|
eta = cycle ** (-a)
|
|
|
|
|
G = 0.5 + 10 * cycle ** (-a) # 가우시안 폭 관련 파라미터
|
|
|
|
|
x = 1 - 2 * np.random.rand()
|
|
|
|
|
y = 1 - 2 * np.random.rand()
|
|
|
|
|
|
|
|
|
|
inp = x + y * 1j # 입력 데이터(복소수로 2차원 표현)
|
|
|
|
|
|
|
|
|
|
dist_mat = (np.real(m) - np.real(inp)) ** 2 + (np.imag(m) - np.imag(inp)) ** 2
|
|
|
|
|
win_rows, win_cols = np.unravel_index(np.argmin(dist_mat, axis=None), dist_mat.shape)
|
|
|
|
|
|
|
|
|
|
col_idx, row_idx = np.meshgrid(range(1, num_cols + 1), range(1, num_rows + 1))
|
|
|
|
|
grid_dist = np.abs(row_idx - win_rows) + np.abs(col_idx - win_cols)
|
|
|
|
|
f = eta * np.exp(-(grid_dist / G) ** 2)
|
|
|
|
|
|
|
|
|
|
if cycle in [1, 10, 30, 50, 100, 200, 400, 600, 800, 1000, 3000, 5000]:
|
|
|
|
|
plt.clf()
|
|
|
|
|
plt.plot(np.real(m), np.imag(m), 'w-', np.real(m.T), np.imag(m.T), 'w-')
|
|
|
|
|
plt.gca().set_facecolor('k')
|
|
|
|
|
plt.title('훈련 횟수: {}, 이웃의 크기: {:.2f}, 학습률: {:.2f}'.format(cycle, G, eta), fontproperties=nanum_gothic)
|
|
|
|
|
plt.draw()
|
|
|
|
|
plt.pause(0.001)
|
|
|
|
|
|
|
|
|
|
m = m + f * (inp - m)
|
|
|
|
|
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
````
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<summary>결과</summary>
|
|
|
|
|
<div markdown="1">
|
|
|
|
|
|
|
|
|
|
![result1](./images/b1.png)
|
|
|
|
|
![result2](./images/b2.png)
|
|
|
|
|
![result3](./images/b3.png)
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
<details>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 참고[¶]()
|
|
|
|
|
|
|
|
|
|
- 머신러닝 프로그래밍 과목, 김성수 교수
|
|
|
|
|
- [https://untitledtblog.tistory.com/5](https://untitledtblog.tistory.com/5)
|
|
|
|
|
- ChatGPT
|