main
hy.kim 1 year ago
parent dddf5f73ed
commit 5d287c1723

@ -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
Loading…
Cancel
Save