+Code View
+
+
+````python
-In \[ \]:
+````
-\# 입력 데이터 생성
-data \= np.random.rand(100, 2)
-\# data = np.array(\[\[0.8, 0.0064\],
-\# \[0.12, 0.2848\],
-\# \[0.24, 0.7472\],
-\# \[0.68, 0.3488\]\])
-data
-
-Out\[ \]:
+
+Result
+
+
+````planetext
array(\[\[0.76959259, 0.03105338\],
\[0.91933906, 0.8980492 \],
\[0.74919767, 0.46775453\],
@@ -168,71 +166,105 @@ array(\[\[0.76959259, 0.03105338\],
\[0.6372436 , 0.48780002\],
\[0.66962877, 0.44225145\],
\[0.48185839, 0.17663244\]\])
+````
+
+
+
+SOM 파라미터 설정
+
+
+````python
+ map_width = 10
+ map_height = 10
+ lr = 0.1
+ num_iterations = 1000
+ # map_width = 2
+ # map_height = 2
+ # lr = 0.1
+ # num_iterations = 1000
+
+````
+
+
+
+SOM 초기화
+
+
+````python
+ som_map = np.random.rand(map_width, map_height, 2)
+ print(som_map.shape)
+ fig, (ax1, ax2) = plt.subplots(1, 2)
+ ax1.imshow(som_map[:,:,0])
+ ax2.imshow(som_map[:,:,1])
+ plt.show()
+
+````
+![output1](./images/output1.png)
-In \[ \]:
+
+
+SOM 학습
+
+
+````python
+ for i in range(num_iterations):
+ # 랜덤한 입력 데이터 선택
+ input_data = data[np.random.choice(data.shape[0])]
+
+ # 가장 유사한 뉴런 찾기
+ # 3D som_map과 input_data의 차이^2를 구하여 z축으로 모두 합한 거리
+ distances = np.sum((som_map - input_data) ** 2, axis=2)
+ # 위에서 구한 z축의 거리들 중 가장 작은 뉴런
+ winner = np.argmin(distances)
+ # 3D z축에서 선택된 가장 작은 뉴런을 2D map으로 맵핑한 좌표
+ x, y = np.unravel_index(winner, (map_width, map_height))
+
+ # 학습률 계산
+ learning_rate = lr * (1 - i/num_iterations)
+
+ # 뉴런 가중치 업데이트
+ for j in range(map_width):
+ for k in range(map_height):
+ dist = np.sqrt((x-j)**2 + (y-k)**2)
+ if dist < 3:
+ som_map[j, k] += learning_rate * (input_data - som_map[j, k])
+
+````
+
+
+
+SOM 시각화
+
+
+````python
+ print(som_map.shape)
+ fig, (ax1, ax2) = plt.subplots(1, 2)
+ ax1.imshow(som_map[:,:,0])
+ ax2.imshow(som_map[:,:,1])
+ plt.show()
+
+````
+![output2](./images/output2.png)
-\# SOM 파라미터 설정
-map\_width \= 10
-map\_height \= 10
-lr \= 0.1
-num\_iterations \= 1000
-\# map\_width = 2
-\# map\_height = 2
-\# lr = 0.1
-\# num\_iterations = 1000
+
+
-In \[ \]:
-\# SOM 초기화
-som\_map \= np.random.rand(map\_width, map\_height, 2)
-print(som\_map.shape)
-fig, (ax1, ax2) \= plt.subplots(1, 2)
-ax1.imshow(som\_map\[:,:,0\])
-ax2.imshow(som\_map\[:,:,1\])
-plt.show()
+### 참고[¶]()
-(10, 10, 2)
+- ChatGPT
-![output1](./images/output1.png)
-In \[ \]:
-
-\# SOM 학습
-for i in range(num\_iterations):
- \# 랜덤한 입력 데이터 선택
- input\_data \= data\[np.random.choice(data.shape\[0\])\]
-
- \# 가장 유사한 뉴런 찾기
- \# 3D som\_map과 input\_data의 차이^2를 구하여 z축으로 모두 합한 거리
- distances \= np.sum((som\_map \- input\_data) \*\* 2, axis\=2)
- \# 위에서 구한 z축의 거리들 중 가장 작은 뉴런
- winner \= np.argmin(distances)
- \# 3D z축에서 선택된 가장 작은 뉴런을 2D map으로 맵핑한 좌표
- x, y \= np.unravel\_index(winner, (map\_width, map\_height))
-
- \# 학습률 계산
- learning\_rate \= lr \* (1 \- i/num\_iterations)
-
- \# 뉴런 가중치 업데이트
- for j in range(map\_width):
- for k in range(map\_height):
- dist \= np.sqrt((x\-j)\*\*2 + (y\-k)\*\*2)
- if dist < 3:
- som\_map\[j, k\] += learning\_rate \* (input\_data \- som\_map\[j, k\])
-
-In \[ \]:
-
-\# SOM 시각화
-print(som\_map.shape)
-fig, (ax1, ax2) \= plt.subplots(1, 2)
-ax1.imshow(som\_map\[:,:,0\])
-ax2.imshow(som\_map\[:,:,1\])
-plt.show()
-
-(10, 10, 2)
-![output2](./images/output2.png)
+### SOM [¶]()
-### 참고[¶]()
+