[R 군집분석 (Cluster Analysis)] 유사성, 비유사성 측도 - 거리 계산 R 예제 (Distance using R)
R 분석과 프로그래밍/R 군집분석(Clustering) 2016. 6. 10. 01:08지난번 포스팅에서는 (구간식 또는 비율식 데이터 속성의 다변수일 경우의) 유사성, 비유사성 측도로서 다양한 거리의 정의에 대해서 알아보았습니다.
이번 포스팅에서는 하나의 예를 가지고 R을 사용하여 각 거리 종류별 거리를 계산, 비교해보도록 하겠습니다.
예로 사용할 데이터는 5명의 학생의 '선형대수(linear algebra)'와 '기계학습(machine learning)' 기말고사 시험성적입니다. 이 중에서 1번째와 2번째 학생(아래 산점도의 빨간점)의 선형대수와 기계학습 시험점수의 거리를 (1) 맨하탄 거리(manhattan distance), (2) 유클리드 거리(euclidean distance), (3) 표준화 거리(standadized distance), (4) 마할라노비스 거리(mahalanobis distance)로 계산해보도록 하겠습니다.
> ##---------------------------------- > ## Dis-similarity measure - Distance > ##---------------------------------- > > # 'linear algebra' and 'machine learning' score per student > st_1 <- c(70, 65) > st_2 <- c(90, 95) > st_3 <- c(65, 60) > st_4 <- c(85, 90) > st_5 <- c(60, 75) > > st_all <- rbind(st_1, st_2, st_3, st_4, st_5) > st_all [,1] [,2] st_1 70 65 st_2 90 95 st_3 65 60 st_4 85 90 st_5 60 75 > > # scatter plot > plot(st_all, xlab = "linear algebra", ylab = "machine learning", + xlim = c(50, 100), ylim = c(50, 100), + main = "scatter plot of final scores") > > # adding student label > text(st_all[,1], st_all[,2], labels = abbreviate(rownames(st_all)), + cex = 0.8, pos = 1, col = "blue") > > # marking student 1, student 2 with red point > points(st_all[1,1], st_all[1,2], col = "red", pch = 19) > points(st_all[2,1], st_all[2,2], col = "red", pch = 19)
|
1) 맨하탄 거리 (Manhattan distance)
dist(dataset, method = "manhattan") 함수를 사용하여 맨하탄 거리를 계산할 수 있습니다.
아니면 아래의 두번째 방법처럼 두 변수의 관측치별 차이 절대값을 더해주면 됩니다 ( <- 달랑 2개 관측치 거리를 계산하는 거니깐 이 방식도 사용할만 하지만요, 만약 관측치 학생 1,000 명의 거리를 구하는 것이라면요? ^^; 두 방식의 결과값 포맷이 조금 다르다는 점도 눈여겨 봐주세요.)
> ##-- Manhattan distance between 1st and 2nd student > ## (1) dist(dataset, method = "manhattan") function > dist_mht <- dist(st_all[1:2, ], method = "manhattan") > dist_mht st_1 st_2 50 > > ##-- Manhattan distance between 1st and 2nd student > ## (2) calculation > dist_mht_2 <- abs(st_all[1,1] - st_all[2,1]) + abs(st_all[1,2] - st_all[2,2]) > dist_mht_2 st_1 50 |
2) 유클리드 거리 (Euclidean distance)
dist(dataset, method = "euclidean") 함수를 사용하여 유클리드 거리를 계산할 수 있습니다.
> ##-- Euclidean distance between 1st and 2nd student > dist_euclid <- dist(st_all[1:2, ], method = "euclidean") > dist_euclid st_1 st_2 36.05551
|
3) 표준화 거리, 통계적 거리 (Standadized distance, Statistical distance)
표준화 거리는 2가지 방법을 사용해서 계산해보겠습니다.
(1) 데이터를 표준화한 후에 -> 유클리드 거리 계산
(2)
'2.501805' 로서 두 가지 계산 방법의 결과가 똑같습니다.
|
4) 마할라노비스 거리 (Mahalanobis distance)
마할라노비스 거리는 아래 식을 사용해서 계산해보겠습니다.
> ##-- Mahalanobis distance > # covariance : cov()
> cov_st_all <- cov(st_all)
> cov_st_all
[,1] [,2]
[1,] 167.5 165.0
[2,] 165.0 232.5 > dist_mahal <- sqrt(t(st_all[1,] - st_all[2,])%*%solve(cov_st_all)%*% + (st_all[1,] - st_all[2,])) > dist_mahal [,1] [1,] 1.975854
|
위에서 계산한 4가지 방법별 거리 계산 결과를 종합하면 아래와 같습니다.
맨하탄 거리가 가장 길고 > 유클리드 거리 > 표준화 거리 > 마할라노비스 거리 순으로 나왔네요.
> ## overall > dist_all <- cbind(dist_mht[1], dist_euclid[1], dist_stand, dist_mahal) > dist_all [,1] [,2] [,3] [,4] [1,] 50 36.05551 2.501805 1.975854 > > barplot(dist_all, + col = "blue", + names.arg = c("manhattan", "euclidean", "standadized", "mahalanobis"), + main = "Distance between st_1 and st_2's score")
|
이상으로 군집분석 들어가기 전에 기초 체력을 다지는 의미에서 비유사성 측도로서의 거리(distance)에 대해서 알아보았습니다.
다음번 포스팅에서는 본격적으로 군집분석 세부 내용으로 들어가 보겠습니다. 첫 테잎은 '계층적 군집(hierarchical clustering) 모형'이 끊는 것으로 해보겠습니다.
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'을 꾸욱 눌러주세요. ^^