탐색적 데이터 분석
유클리디안 거리 구하기 (for문 이용)
소스 코드
set.seed(1)
n = nrow(iris)
ind = sample(1:n, size = floor(0.7*n))
X = as.matrix(iris[ind,1:4])
y = iris[ind,5]
X_new = as.matrix(iris[-ind,1:4])
s <- Sys.time()
Euclidean <- function(x,y)
{
return(sqrt(sum((x-y)^2)))
}
ind <- c()
tmp <- c()
for(i in 1:length(X_new[,1]))
{
tmp = 0
for(j in 1:length(X[,1]))
{
tmp[j] <- Euclidean(X_new[i,],X[j,])
}
ind[i] <- which.min(tmp)
}
ind
e <- Sys.time()
e-s
행렬에 있는 각 행들을 이용해 유클리디안 거리를 구하고, 가장 작은 값을 가지는 위치를 tmp 변수에 넣습니다. X_new의 차원이 45 by 4 이므로, 45개의 값이 tmp에 들어갑니다.
실행 결과
[1] 59 59 25 33 37 28 16 41 71 44 46 44 27 28 33 93 55 82 74 96 12
[22] 60 93 6 86 102 55 55 22 19 53 85 18 6 2 32 65 17 34 39 2 32
[43] 65 103 95
Time difference of 0.4783821 secs
유클리디안 거리 구하기 (apply 이용)
소스 코드
set.seed(1)
n = nrow(iris)
ind = sample(1:n, size = floor(0.7*n))
X = as.matrix(iris[ind,1:4])
y = iris[ind,5]
X_new = as.matrix(iris[-ind,1:4])
s <- Sys.time()
tmp <- c()
for(i in 1:length(X_new[,1]))
tmp[i] <- which.min(sqrt(apply(t(t(X)-X_new[i,])^2,1,sum)))
tmp
e <- Sys.time()
e-s
동일한 문제를 apply를 이용해 구현했습니다. 직관적이지는 않지만 실행 속도가 유의미하게 빠르고, 차지하는 공간도 줄었을 뿐더러 코드의 길이도 짧습니다.
실행 결과
[1] 59 59 25 33 37 28 16 41 71 44 46 44 27 28 33 93 55 82 74 96 12
[22] 60 93 6 86 102 55 55 22 19 53 85 18 6 2 32 65 17 34 39 2 32
[43] 65 103 95
Time difference of 0.1595731 secs