# KNN - 최근접 알고리즘을 사용 d<-iris head(d) install.packages("ggvis") library(ggvis) #iris %>% ggvis(~Petal.Length, ~Sepal.Width, fill=~factor(Species)) %>% layer_points() # %>% iris %>% ggvis(~Petal.Length, ~Petal.Width, fill=~factor(Species)) %>% layer_points() #분류하기 iris[1:4] #데이터 정규화 min_max_normal <- function(x){ num <- x - min(x) m_n <- max(x) - min(x) print(num/m_n) #return(num/m_n) } normal_d<-as.data.frame(lapply(iris[1:4], min_max_normal)) #apply는 다른함수를 실행하는것, iris[1:4]를 가지고 min_max_normal로 가서 실행함 normal_d summary(normal_d) #min 0 , max 1 # 정규화 데이터 + 꽃 종류 df <- data.frame(normal_d, Species= iris$Species) head(df,3) #학습, 검정 데이터로 분리 set.seed(123) idx <-sample(1:nrow(df),0.7*nrow(df)) ir_train <- df[idx,] ir_test <- df[-idx,] nrow(ir_train); nrow(ir_test) # KNN 모델 적용 #모델 만듬 library(class) model <- knn(train=ir_train[,-5], test=ir_test[,-5],cl=ir_train$Species, k=3) model summary(model) #모델 평가 t <-table(model,ir_test$Species) t (12+16+14)/nrow(ir_test) #93퍼센트 acc <-(t[1,1] + t[2,2] + t[3,3])/nrow(ir_test) #93퍼센트 acc library(gmodels) CrossTable(x = ir_test$Species, y=model, prop.chisq = F) # 최적의 k값 구하기 sqrt(length(ir_train$Sepal.Length)) # k :9 , 11 model2 <-knn(train = ir_train[,-5],test = ir_test[,-5],cl=ir_train$Species,k=11) summary(model2) t<-table(model2,ir_test$Species) t acc <-(t[1,1]+t[2,2]+t[3,3])/nrow(ir_test) acc