Data Navigator

R을 이용한 머신러닝 - SOM(Self Organizing Map) 분석 본문

R

R을 이용한 머신러닝 - SOM(Self Organizing Map) 분석

코딩하고분석하는돌스 2021. 1. 5. 22:28

1. R에서 SOM(Self Organizing Map) 분석 하기

SOM에는 오직 숫자형 데이터만 입력할 수 있으며 모델 파라미터는 거리 함수

(보통의 경우, 유클리드 거리 사용), 그리고 격자 또는 래티스(lattice),

파라미트(폭과 높이 또는 래티스에 존재하는 셀의 수) 등을 사용

① 경쟁 단계 :

이 단계의 각 뉴런의 가중치와 입력 데이터의 벡터간의 거리를 산출 및 비교하여 뉴런간에 경쟁#### 입력 데이터의 할당 여부를 결정할 때, 입력 데이터와 거리가 가까운 뉴런들을 선정

② 협력 단계:

경쟁에서 선정한 뉴런은 토폴로지 이웃(Topological neighborhood) 영역에서 가장 좋은 공간 위치를 차지하게 된다.

③ 적응 단계:

이 단계에서는 승리한 뉴런의 가중치와 토폴로지 이웃 뉴런을 업데이트.

가중치 업데이트는 다음과 같은 함수를 사용

$\Delta w_{ji}\ =\ \eta \left(t\right)T_{j,I\left(x\right)}\left(t\right)\left(x_i-w_{ji}\right)$Δwji​ = η(t)Tj,I(x)​(t)(xi​−wji​)​

위의 식에서 η(t)는 t 스탭에서 학습률.

원하는 학습횟수만큼 ② ~ ③을 반복하여 적용하여 가중치를 업데이트

 

2. SOM 모델의 장점 및 단점

SOM 모델의 장점 및 단점을 나열하면 다음과 같다.

- SOM의 최대 장점은 통합거리매트릭스(Unified Distance Matrix, U-Matrix)를 이용하여 손쉽게 2차원 데이터의 클러스터를 생성하고 데이터가 암시하는 패턴, 흥미로운 사실을 이해할 수 있음.

- 어떤 유사성/거리 함수를 선택하느냐에 따라 클러스터의 내용이 매우 크게 달라질 수 있음.

- SOM 모델의 수학 연산상의 복장성으로 인해 수천 개 이상의 데이터세트는 분석하는 것이 불가능함.

 

3. 아이리스(iris)데이터를 이용한 SOM 분석

SOM 모델을 적용하는 목적은 위의 "Sepal.Length", "Sepal.Width", "Petal.Length",

"Petal.Width" 수치형 4개를 독립변수로 이용하여 아이리스의 종류(Species)를

예측하는 것.

kohonen 패키지의 somgrid() 함수와 som() 함수를 이용하여 SOM 모델 학습시키기

kohonen 패키지의 somgird() 함수와 som() 함수로 SOM 모델을 학습시킴

somgrid() 함수 = 뉴런층(출력층)의 x차원, y차원, topology 형태 등을 설정하는 함수

som()함수는 입력데이터를 통해 각 뉴런의 가중치를 학습하는 함수

 

4. kohonen 패키지의 somgrid() 함수의 입력인자

xdim = x의 차원

ydim = y의 차원

topo 형태 ("hexagonal", "rectangular")

 

5. kohonen 패키지의 supersom() 함수의 입력인자

data = 학습할 데이터

grid = 출력층 표현(somgrid() 함수의 출력값을 넣음)

rlen = 학습횟수

alpha = 학습계수

radius = 뉴런의 반경

init = 초기치

toroidal = map의 단말부 표현여부

n.hood = 주변부 표현형태("circular" or "square")

keep.data = 자료수용여부

 

 

colnames(iris)
str(iris)
head(iris)
  1. 'Sepal.Length'
  2. 'Sepal.Width'
  3. 'Petal.Length'
  4. 'Petal.Width'
  5. 'Species'
'data.frame':    150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
A data.frame: 6 × 5
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
  <dbl> <dbl> <dbl> <dbl> <fct>
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
levels(iris$Species)
  1. 'setosa'
  2. 'versicolor'
  3. 'virginica'

SOM 모델을 적용하는 목적은 위의 "Sepal.Length", "Sepal.Width", "Petal.Length",

"Petal.Width" 수치형 4개를 독립변수로 이용하여 아이리스의 종류(Species)를 예측

아이리스 데이터는 150개 셋이 있기 떄문에 교차확인을 위해서 100개를 학습데이터로 추출

나머지를 테스트 데이터로 사용

install.packages('kohonen')
Warning message:
"package 'kohonen' is in use and will not be installed"
library(kohonen)
train  <- sample(1:150, 100)  #트레이닝 데이터 100개를 무작위 추출
train_set  <-  list(x = as.matrix(iris[train,-5]), Species = as.factor(iris[train,5])) # 트레이닝데이터
test_Set <- list(x = as.matrix(iris[-train,-5]), Species = as.factor(iris[-train,5])) #테스트 데이터 list형
gr <- somgrid(xdim = 3, ydim = 5, topo = "hexagonal") #grid 갯수 및 모양 설정
ss <- supersom(train_set, gr, rlen = 200, alpha = c(0.05, 0.01)) #som 학습하기

 

 

plot() 함수 인자인 type를 "change" 로 뉴런과 학습데이터 거리 보기

supersom() 함수의 rlen(학습횟수)을 200로 지정하였기 때문에 200회 SOM 알고리즘이 돌면서 각 뉴련의 가중치가 업데이트.

학습을 거듭하면서 뉴런과 학습 데이터의 거리가 짧아지는데, 이러한 경과를 plot() 함수 인자인 type를 "change" 로 설정하여 학습된 som 모델을 입력하면 시각적으로 나타낼 수 있다..

plot(ss,type="changes")


plot() 함수의 type를 "count"로 지정

학습된 som 모델의 각 뉴런이 몇 개의 학습 데이터와 맵핑이 되는 지를 그림으로 확인 가능.

som 모델의 질(quality)를 평가할 수 있는 하나의 지표

각 뉴런이 비슷한 갯수의 학습데이터와 맵핑이 되는 것이 좋다.

맵핑이 되지 않는 뉴런이 있다면 som 모델의 신경망 크기가 크다는 것는 것을 의미

plot(ss, type="count", main="Node Counts")


plot() 함수의 type를 "dist.neighbours"로 설정

통상 통합거리메트릭스(U-matrix)를 그릴 수 있다.

U-matirx는 각 뉴런의 이웃간 거리

값이 높을 수록 그 뉴런은 이웃뉴런와 (dissimilar) 유사성이 적다고 할 수 있다.

plot(ss, type="dist.neighbours", main = "SOM neighbour distances", shape = "straight")
plot(ss, type="dist.neighbours", palette.name=grey.colors, shape = "straight")


각 뉴런에 대한 학습 데이터의 가중치 기여율을 확인

plot() 함수의 type를 codes로 설정하면 각 뉴런에 대한 학습 데이터의 가중치 기여율을 확인할 수 있다.

# Weight Vector View
plot(ss, type="codes", shape = "straight")


위의 그림처럼 각 뉴런에서 Species의 속성들 가중치 기여율(Representative)을 알 수 있다.