46. 비지도 학습(unSupervised Learning)
in Study on R Programming
Overview
비지도 학습(unSupervised Learning)은 입력 데이터에 의한 학습을 통하여 사전 지식이 없는 상태에서 컴퓨터 스스로 공통점과 차이점 등의 패턴을 찾아서 규칙(rule)을 생성하고, 이를 통해서 결과를 도출해내는 방식이다.
군집 분석
데이터를 몇 개의 그룹으로 나누고, 그룹 간의 비교 분석을 통해 전체 구조에 대한 이해를 돕고자 하는 탐색 기법이다.
군집 분석은 계층적 군집 분석(탐색적)과 비계층적 군집 분석(확인적)으로 나누어 진다.
군집 분석의 특징
- 전체적인 데이터 구조를 파악하는 데 이용된다.
- 유사한 특성을 가진 항목들을 합쳐 가면서 유사한 특성을 군집을 찾아낸다.
- 분류하려고 하는 항목에 대한 사전 지식이 없는 상태에서 이루어지므로 비지도 학습이다.
- 유사도에 근거하여 군집들을 분석하는 데, 유사성은 유클리디안 거리를 사용한다.
- 분석 결과에 대한 가설 검정이 없다.
- 규칙을 기반으로 계층적인 트리 구조를 생성한다.
유사도(Similarity)
특정 데이터들을 분류하려면 분류를 위한 판단 근거가 필요하다.
다음과 같이 두 가지 속성의 값을 이용하여 분류하는 예시를 살펴 보자.
참고하고자 하는 두 가지 속성은 “단맛”과 “아삭거림”이다.
x축은 단맛의 정도를, y축은 아삭거림의 정도를 나타내는 좌표계로 그려 보면 다음과 같다.
그림에서 “바나나”와 “오렌지”의 거리는 가깝지만, “상추”와 “바나나”의 거리는 비교적 멀다.
즉, 두 객체간의 물리적 거리가 가까운 항목들은 동일 집단으로 묶을 수 있다라는 의미이다.
이때 필요한 것이 거리를 구하는 함수의 개념이 필요하다.
일반적으로 유클리디안 거리 공식이 많이 사용된다.
유사도 측정 방법
특성을 기반으로 유사도를 측정하는 방법은 여러 가지가 존재한다.
주로 특성 값을 벡터 공간에 맵핑한 후, 벡터간의 거리를 기반으로 계산하는 방법이 많이 사용된다.
유클리디안 거리, 코사인 거리, 자카드 거리, 맨해튼 거리 등이 있다.
Euclidean similarity
유클리디안(Euclidean distance) 거리는 두 점 사이의 거리를 계산하는 방법이다.
관측 대상 p와 q의 대응하는 변량 값의 차가 작으면, 두 개의 관측 대상은 유사하다고 정의하는 방식이다.
유클리디안 거리는 두 점 사이의 거리를 계산할 때 흔히 쓰는 방법으로 두 문서 벡터의 상대적인 거리 차를 측정하는 방법이다.
유클리디안 유사도는 거리 값이 작을 수록 두 문서가 유사함을 나타낸다.
유클리디안 거리 계산식
임의의 점p = (p1, p2, ..., pn)
와q = (q1, q2, ..., qn)
의 유클리디안 거리는 다음과 같이 구한다.
Euclidean distance = \(\sqrt{(p1-q1)^2 + (p2-q2)^2 + ... + (pn-qn)^2} = \sqrt{\sum_{i=1}^{n}(pi-qi)^2}\)
즉, 유클리디안 거리 계산식은 p와 q의 대응하는 변량 값의 차가 작으면, 두 관측 대상은 유사하다고 정의하는 식이다.
변량의 차가 작다는 것은 거리가 가깝다는 것을 의미한다.
코사인 유사도
특성 값을 나타내는 벡터 a 와 b 가 있을 때, 두 벡터 간 각도의 코사인 값을 이용하여 벡터 간의 유사도를 측정하는 방법이다.
코사인은 단위가 1 인 벡터 x 와 y 사이의 각도(코사인)값에 해당된다.
벡터 x 와 y 가 유사한 경우 각도가 작아지고, 즉 코사인 값이 1 에 가까워지고 유사하지 않는 경우 각도가 커진다.
즉 a와 b의 각도인 \(\theta\)가 최소(0에 가까울수록)일수록 값이 유사하다고 판단하는 방식이다.
벡터 a 와 b로 각도 \(\theta\)를 구하는 법을 알아본다.
벡터의 내적을 사용하면 이 \(\theta\)가 크고 작음을 알아낼 수 있는데 기본 원리는 다음과 같다. \[\cos(\theta) = a \cdot b / |a| \times |b\]
a\(\cdot\)b은 벡터 a행렬의 각 항의 값 ai와 b행렬의 각 항의값 ai를 순차적으로 곱하여 더하면 된다.
a\(\cdot\)b = (a1 * b1 + a2 * b2 + … + an * bn)
|a| 는 a 벡터의 길이를 의미하는데, $$ | a | =\sqrt{a1^2 + a2^2 + … + an^2}$$의 공식으로 구하면 된다. |
벡터 a와 b의 코사인 유사도는 다음과 같이 구할 수 있다.
cosine similarity = cos(\(\theta\)) = $$a \cdot b \over | a | b | \(=\)\sum_{i=1}^{n}ai\times bi \over \sqrt{\sum_{i=1}^{n}(ai^2)} \times \sqrt{\sum_{i=1}^{n}(bi)^2}$$ |
유클리디안 거리 생성 함수
matrix 객체에 대하여 dist()
함수를 사용하면 유클리디안 거리를 생성할 수 있다.
matrix 객체 내의 값이 서로 가까울수록 적은 값으로 나타난다.
- 사용 형식
dist(x, method, diag)
- x
- 행렬, data frame
- method
- 거리를 측정하는 방법
- ‘euclidean’, ‘maximun’, ‘manhattan’, ‘canbrerra’ 등
- diag
- 대각 행렬 출력 여부
클러스터링 방법
군집 분석을 위한 클러스트링 방법에는 다음과 같은 방법이 있다.
표에 method는 hclust()
함수의 method 옵션에 사용되는 값을 의미한다.
- 최단 연결법
- single
- 군집 A와 군집 B에 속하는 데이터 중에서 가장 가까운 데이터들을 군집으로 묶는 방법
- 최장 연결법
- complete
- 군집 A와 군집 B에 속하는 데이터 중에서 가장 먼 데이터들을 군집으로 묶는 방법
- 와드 연결법
- ward.D2
- 군집을 묶을 때 생기는 새로운 군집의 오차 제곱합을 이용한 방식
- 평균 연결법
- average
- 군집 A의 요소와 군집 B의 요소 각각의 거리를 모두 구하여 평균값을 이용하는 방식
최단 연결법 클러스터링 예시
- A와 B와의 거리가 가장 가까워 둘을 하나의 군집으로 처리
- C와 D와의 거리가 가장 가까워 둘을 하나의 군집으로 처리
- C와 D와의 거리가 가장 가까워 둘을 하나의 군집으로 처리한 결과
- 동일한 방식으로 계속 반복 한다.
클러스터 생성 함수
클러스터를 만들기 위해서는 hclust()
함수를 사용하면 된다.
계층적 군집 분석을 위하여 클러스트링을 수행하는 함수이다.
- 사용 형식
hclust(dist, method='complete', member)
- dist
- 거리 매트릭스를 의미
dist()
함수에 의해 구해진 객체를 사용
- method
- clustering 방법
- ward, single, complete, average, median, centroid
- member=NULL
- 군집 수
동일 군집에 테두리 입히기 함수
덴드로그램에 다른 군집과 분류하기 위하여 사각형을 그려 준다.
즉, 군집 별로 묶음 처리할 때 테두리를 입힐 수 있다.
- 사용 형식
rect.hclust(hc, k=3, border='red')
- hc
- hclust 객체
- k
- 클러스터의 개수
- border
- 테두리의 색상 결정 Vector
군집수 자르기
계층형 군집 분석 결과에서 분석자가 원하는 군집의 개수 만큼 잘라서 인위적으로 군집을 만들 수 있다.
cutree()
함수는 군집 수만큼 그룹을 지어 잘라 내어 주는 함수이다.
- 사용 형식
cutree(hc, k = 3)
- hc
- hclust 객체(군집 분석 결과)
- k
- 군집의 수