diff --git a/README.md b/README.md index c60ab11..c20b0f4 100644 --- a/README.md +++ b/README.md @@ -46,14 +46,13 @@ ![SOM Algorithm](./images/SOM2.png) -### 참고[¶]() -[https://untitledtblog.tistory.com/5](https://untitledtblog.tistory.com/5) ### SOM 예제 코드 1[¶]()
Code View + 입력 데이터 생성
@@ -264,6 +263,7 @@ array(\[\[0.76959259, 0.03105338\],
Code View + Randomize 함수
@@ -404,9 +404,102 @@ array(\[\[0.76959259, 0.03105338\],
+결과 +
+ +![result1](./images/a1.png) +![result2](./images/a2.png) + +
+
+### SOM 예제 코드 3[¶]() + +
+Code View +
+ +````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() + +```` + +
+ +결과 +
+ +![result1](./images/b1.png) +![result2](./images/b2.png) +![result3](./images/b3.png) + +
+
+ + ### 참고[¶]() +- 머신러닝 프로그래밍 과목, 김성수 교수 +- [https://untitledtblog.tistory.com/5](https://untitledtblog.tistory.com/5) - ChatGPT \ No newline at end of file