main
hy.kim 1 year ago
parent 27d875fa63
commit be0bb58cfb

@ -1,23 +1,24 @@
# SOM (Self Organizing Map, 자기조직화지도)
==================================================================================================================================
======================================================================================
### 개요[¶](#%EA%B0%9C%EC%9A%94)
### 개요[¶]()
* 비지도학습 중 하나로, 대뇌피질의 시각피질의 학습 과정을 모델화한 인공신경망으로써 자율 학습에 의한 클러스터링을 수행하는 알고리즘
### 역사[¶](#%EC%97%AD%EC%82%AC)
### 역사[¶]()
* 1980년대 후반에 핀란드의 컴퓨터 과학자 Teuvo Kohonen에 의해 개발
* SOM은 분류, 군집화, 데이터 시각화 등 다양한 분야에서 사용되며, 인공신경망 분야에서 가장 성공적인 알고리즘 중 하나로 평가됨
* 초기에는 이미지 인식과 음성 인식 분야에서 주로 사용되었으나 현재는 데이터 분석 등의 다양한 분야에서도 사용됨
### 특징[¶](#%ED%8A%B9%EC%A7%95)
### 특징[¶]()
* 인간의 뇌에서 발견된 "자기 조직화" 원리를 모델링하여 입력 데이터의 유사성을 기반으로 뉴런들을 2D 혹은 3D 지도상에 배치함
* Topological Ordering (위상적 순서)에 따라 지도상에서 인접한 뉴런들이 입력 데이터의 유사성을 반영하여 군집화(Clusturing)함 입력 데이터에 대한 어떤 사전 정보나 라벨이 없이도, 데이터가 가지고 있는 패턴과 특성을 스스로 학습하고 이를 지도상으로 표현함
* 주로 데이터의 시각화 및 차원 축소에 사용되며, 입력 데이터의 분포를 파악하여 그룹화하여 시각적으로 표현하므로, 복잡한 데이터를 시각적으로 이해하고 분석하는 데 도움을 줌
### 주요 용어[¶](#%EC%A3%BC%EC%9A%94-%EC%9A%A9%EC%96%B4)
### 주요 용어[¶]()
* 클러스터링(clustering): 데이터의 유사성에 기초하여 데이터를 몇몇의 그룹으로 분류하는 기법
* 입력층(input layer): 입력 벡터를 입력받는 층
@ -27,7 +28,7 @@
![SOM Layer Structure](./images/SOM1.png)
### 알고리즘[¶](#%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98)
### 알고리즘[¶]()
1-1) 가중치 행렬 각 원소의 값을 임의의 0보다 크고 1보다 작은 값으로 초기화
@ -45,29 +46,26 @@
![SOM Algorithm](./images/SOM2.png)
### 참고[¶](#%EC%B0%B8%EA%B3%A0)
### 참고[¶]()
[https://untitledtblog.tistory.com/5](https://untitledtblog.tistory.com/5)
### SOM 예제 코드[¶](#SOM-%EC%98%88%EC%A0%9C-%EC%BD%94%EB%93%9C)
In \[ \]:
### SOM 예제 코드[¶]()
import numpy as np
import matplotlib.pyplot as plt
<details>
<summary>Code View</summary>
<div markdown="1">
````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\[ \]:
</div>
<summary>Result</summary>
<div markdown="1">
````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\]\])
````
</div>
<summary>SOM 파라미터 설정</summary>
<div markdown="1">
````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
````
</div>
<summary>SOM 초기화</summary>
<div markdown="1">
````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 \[ \]:
</div>
<summary>SOM 학습</summary>
<div markdown="1">
````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])
````
</div>
<summary>SOM 시각화</summary>
<div markdown="1">
````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
</div>
</details>
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 [¶]()
### 참고[¶]()
<details>
<summary>Code View</summary>
<div markdown="1">
````python
````
- ChatGPT
</div>
</details>
Loading…
Cancel
Save