Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

류동균의 R 공부방입니다.

K-최근접 이웃(K-Nearest Neighbor) 본문

Machine Learning

K-최근접 이웃(K-Nearest Neighbor)

R쟁이 2019. 9. 25. 18:37

K-최근접 이웃 이하 "KNN"에 대해 공부해보자. KNN은 문자 그대로 가장 근접해 있는 이웃을

 

찾는 알고리즘이다. 이는 현대에 추천시스템에 많이 사용되고 있다.

 

KNN의 개념을 쉽게 이해하기 위해  하나의 예시와 그래프를 통해 알아보자.


다음과 같이 분류된 군집에 하나의 x와 y라는 새로운 데이터가 나왔다.

 

그러면 우리는 x와 y라는 데이터가 어떤 집단에 속해있는지를 파악해야한다.

그럼 다음과 같이 데이터를 중심으로 원을 그려 어떤 집단의 데이터가 많은지 확인한다.

 

원에 들어오는 데이터의 개수는 분석가의 역량으로 판단하지만 일반적으로는 전체 데이터의

 

제곱근값을 가진다고 한다.

SVM모델로 분류를 한다면 x는 setosa, y는 versicolor라는 종으로 분류가 된다고 추측해 볼 수

 

있다.

 

그러면 이제 RStudio에서 한번 모델을 만들어보자.

 

모델을 만들기전에 한가지 해야할 일이 있다. 바로 정규화이다. 정규화의 목적은 데이터의 값들

 

을 비슷한 위치에 놓이기위함이라고 할 수 있다.

 

먼저 필요한 패키지들을 가져오자

 

library(class)

 

이제 정규화를 해야하는데 normalize라는 정규화 함수를 생성하고 sapply함수로 iris데이터를

 

정규화해주자.

#정규화 함수 생성
normalizer <- function(x) {
  return_value <- (x - min(x)) / (max(x) - min(x))
  return(return_value)
}


# sapply(df, function)
normal_iris <- sapply(iris[,1:4] , normalizer) %>% 
  as.data.frame()

 

이제 training_set, test_set으로 나누어주자, 여기서 Species가 있는 label데이터와 Species가

 

없는 unlabel데이터로 분류 해주도록 한다.

 

 

# data 생성
df <- cbind(normal_iris, Species = iris[,5])

# train/test sampling
training_sampling <- sort(sample(1:nrow(df), nrow(df) * 0.7 ))
test_sampling <- setdiff(1:nrow(df),training_sampling)

# traning_set, test_set
training_set <- df[training_sampling,]
test_set <- df[test_sampling,]

training_set_unlabel <- training_set[,1:4]
training_set_label <- training_set[,5]


test_set_unlabel <- test_set[,1:4]
test_set_label <- test_set[,5]

 

이제 KNN모델로 분류를 해보자

 

# KNN
knn_m <- knn(train = training_set_unlabel, test = test_set_unlabel, cl = training_set_label, k = 3)

# ConfusionMatrix
confusionMatrix(knn_m, test_set_label$Species)