[R]2. 데이터 클러스터링 k-mean 알고리즘 #tdm #tweet 분석 #clustering #k-means #Elbow Method #Elbow Point
[연구 질문]
각 문서들 속에 들어 있는 데이터 분석을 통해 유사하거나 관계가 높은 항목끼리의 집합(클러스터)을 만들고 싶다
[개념]
k-means 클러스터링
: 분할법, 주어진 데이터를 여러 그룹으로 나눔
같은 그룹내의 단어들 끼리의 유사도는 증가하고, 다른 그룹에 있는 단서들과는 유사도가 가장 적은 형태로 나눔
알고리즘은 각 그룹의 중심점과 그 그룹 내의 단어들과의 거리 제곱합이 가장 최소화 되는 방향으로 그룹을 나눈다
n개의 단어 (x1, x2, …, xn)에서 개의 집합 S = {S1, S2, …, Sk}로 분할, μi가 집합 Si의 중심점일때 각 중심점으로
부터 각 집합의 단어까지의 거리의 제곱합을 최소로하는 집합 S를 찾는 것이 목표
근사 최적해를 찾는 것이므로 각 중심점을 랜덤으로 찍는 만큼 계속해서 각 그룹이 달라질 수 있다
적절한 k는?
Rule of thumb
Elbow Method
클러스트의 수를 순차적으로 늘려가면서 결과 모니터링
Within group 그래프에서 기울기가 완만해지는 곳을 Elbow Point라 하며 이때의 K가 적정값이라 판단
k-means 한계점
-
k 값을 입력 파라미터로 지정해줘야 함
-
지역 최소값에 수렴할 가능성이 있음 - 이를 방지하기 위해 담금질 기법 (Simulated Annealing) 을 수행하여 의도적으로 에러가 줄어드는 방향을 피하는 방식을 이용
-
이상값(outlier)에 민감함
-
구형(spherical)이 아닌 클러스터를 찾는 데 적절하지 않음
[필요 패키지]
[코드] *파란색은 스크립트, 검정색은 결과값입니다
#대표적인 테스트데이터인 iris을 읽어옴
data("iris")
#iris데이터와 나중에 비교하기위해 새로운 변수 niris에 복사
niris<-iris
#제대로 clustering하는지 확인하기 위해 종 분류는 우선 삭제하자
niris$Species<-NULL
#k는 3개의 종을 구별해내길 기대하며 3으로 설정. 아래에 적정 k를 찾는 부분 추가
kc<-kmeans(niris,3)
kc
K-means clustering with 3 clusters of sizes 62, 38, 50
Cluster means:
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.901613 2.748387 4.393548 1.433871
2 6.850000 3.073684 5.742105 2.071053
3 5.006000 3.428000 1.462000 0.246000
Clustering vector:
[1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[27] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1
[53] 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
[79] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 2
[105] 2 2 1 2 2 2 2 2 2 1 1 2 2 2 2 1 2 1 2 1 2 2 1 1 2 2
[131] 2 2 2 1 2 2 2 2 1 2 2 2 1 2 2 2 1 2 2 1
Within cluster sum of squares by cluster:
[1] 39.82097 23.87947 15.15100
(between_SS / total_SS = 88.4 %)
Available components:
[1] "cluster" "centers" "totss"
[4] "withinss" "tot.withinss" "betweenss"
[7] "size" "iter" "ifault"
# iris데이터의 종과 구별해낸 cluster를 비교해 얼마나 맞았는지 파악
table(iris$Species,kc$cluster)
1 2 3
setosa 0 0 50
versicolor 48 2 0
virginica 14 36 0
#클러스터별 색깔로 Sepal.Length와 Sepal.Width만 표시
plot(niris[c("Sepal.Length","Sepal.Width")], col=kc$cluster)
#각 클러스터의 중심점 그리기
points(kc$centers[,c("Sepal.Length","Sepal.Width")],col=1:3,pch=8,cex=2)
#Elbow Method
wss <- 0
#k를 1~15까지 변화시키면서 각 withinss 값을 wss에 저장
for(i in 1:15) wss[i]<-sum(kmeans(niris,centers = i)$withinss)
#withinss값을 그래프로 그리기, 기울기가 완만해지는 3~4가 Elbow point라는 것을 알수 있다
plot(1:15, wss, type="b",xlab = "Number of Clusters", ylab = "Within group sum of squares")
안되는 부분이나 궁금한 점이 있으면 댓글 달아주세요 :)
추가: Spark에서의 KMeans
'Data > R' 카테고리의 다른 글
[R]4.소셜 네트워크 감정 분석 sentiment analysis (6) | 2016.02.19 |
---|---|
[R]3. 결정 트리 Classification (9) | 2016.02.10 |
[R]1. 문서의 유사도 tdm, cosine similarity (2) | 2016.02.09 |
[R 기초] Tip & 기본 함수 Command (0) | 2016.02.09 |
[R 기초] 개요, 기초 데이터 구조 (0) | 2016.02.09 |