close_btn
조회 수 14854 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print

KNN 함수만들기 (3주차 과제) - 5기 방정훈 

 

# <과제 1>

# KNN 함수 만들기

rm(list = ls())

my_knn <- function(train,test,train_label,k){
  a <- as.matrix(dist(rbind(train,test)))[1:dim(train)[1],-(1:dim(train)[1])]
  b <- apply(a,2,sort)[1:k,]                                         # b : k개 가까운 순서대로 정렬
  d <- NULL
  if (k==1){for(i in 1:dim(a)[2]){d <- c(d,match(b[i],a[,i]))}}
  else {for(i in 1:dim(a)[2]){d <- c(d,match(b[,i],a[,i]))}}         # d : 몇 번째가 가까운지 (k개씩 끊어서 해석)
  value <- rownames(train)                                         # value : train data 이름값 저장
  result <- matrix(value[d],,k,T)                                  # test값이 어떤 train data와 가까운지
  e <- as.numeric(train_label[d])
  e <- matrix(e,,k,T)
  mo<-function(x){                                 # 최빈값 구해주는 함수
    w=table(x)
    as.numeric(names(w[max(w)==w]))
  }
  f<-apply(e,1,mo)
  if (class(f)!="numeric"){return("k를 다시 지정해주십시오")}      # 최빈값이 여러개인 경우 다음 메세지 출력
  else return(levels(train_label)[f])
}                                                  # cbind(test,"test_label"=levels(data$Species)[w])


 

# 거리에 가중치를 둔 KNN 함수 만들기

my_knn_weight <- function(train,test,train_label,k){            # 편의상 가중치를 1/distance 로 설정
  if (k==1){return(my_knn(train,test,train_label,1))}           # k=1 일경우 거리 가중치 주나 안주나 동일
  else {
    a <- as.matrix(dist(rbind(train,test)))[1:dim(train)[1],-(1:dim(train)[1])]
    b <- apply(a,2,sort)[1:k,]                                   
    d <- NULL
    if (k==1){for(i in 1:dim(a)[2]){d <- c(d,match(b[i],a[,i]))}}
    else{for(i in 1:dim(a)[2]){d <- c(d,match(b[,i],a[,i]))}}
    value <- rownames(train)                                         # value : train data 이름값 저장
    result <- matrix(value[d],,k,T)                                  # test값이 어떤 train data와 가까운지
    e <- as.numeric(train_label[d])
    e <- matrix(e,,k,T)
    ee <- matrix(0,dim(e)[1],length(levels(train_label)))
    for (i in 1:dim(e)[1]){
      for (j in 1:dim(e)[2]){
        ee[i,e[i,][j]] <- sum(ee[i,e[i,][j]]+t(1/b)[i,j])
      }}
   
    wh <- NULL                                                     # max(가중치값)이 2개 이상일 경우를 위해 아래과정(3줄)
    for (i in 1:dim(e)[1]){                                        # 이 과정(3줄) 없을 경우 가중치값 동일하면
      wh<-sum(wh,length(which(ee[i,] == max(ee[i,]))))}              # factor level 빠른 순으로 투표됨
   
    if (wh!=dim(e)[1]){return("k를 다시 지정해주십시오")}           # max(가중치값)이 2개 이상 : k값 재설정 메세지 출력
    else {
      f<-apply(ee,1,which.max)
    }
    return(levels(train_label)[f])
  }
}


# (1) iris data set 으로 각각 함수에 넣어보기

 

data <- iris
normalize <- function(x){
  return((x-min(x))/(max(x)-min(x)))
}
new.data <- as.data.frame(lapply(data[,-5],normalize))
label <- data$Species
set.seed(1)
index <- sample(1:150,0.8*150)

train <- new.data[index,]
test <- new.data[-index,]
train_label <- label[index]
test_label <- label[-index]

pred <- my_knn(train,test,train_label,3)
pred_weight <- my_knn_weight(train,test,train_label,3)

table(pred,true=test_label)
table(pred_weight,true=test_label)

 

 

# iris data에서 최적의 k값 찾기

 

aa <- NULL         # k값 전체 다 지정해주고 싶으면 아래 1:30 대신 1:dim(train)[1]
for (k in 1:30){                                   # my_knn_weight일 경우 : my_knn 대신 my_knn_weight 넣으면 됨
  if (length(my_knn(train,test,train_label,k))==1){}          # 경고메세지 출력시 length는 1, 이 경우는 제외
  else{
    pred <- my_knn(train,test,train_label,k)
    aa<-c(aa,sum(diag(table(pred,true=test_label))))          # 대각원소의 합이 클 수록 분류를 잘한 것으로 간주
  }}                                                 # 반복문 시간 오래 걸림... vectorlization 만드는 것 가능? 
# k 범위를 1~30와 같이 한정시켜놓으면 시간 빨라짐
which(aa == max(aa))                                      # 분류를 잘하는 k값들 출력
which.max(aa)                                             # 분류를 잘하면서 최소의 k를 얻고자 하는 경우


 

 

# wisc_bc_data로 각 함수에 넣어보기


data <- read.csv("F:\\투빅스\\DATA\\wisc_bc_data.csv")

data <- data[,-1]
table(data$diagnosis)

normalize <- function(x){
  return((x-min(x))/(max(x)-min(x)))
}

data2 <- as.data.frame(lapply(data[,-1],normalize))
train <- data2[1:455,]
test <- data2[456:569,]
label <- data$diagnosis
train_label <- label[1:455]
test_label <- label[456:569]

pred <- my_knn(train,test,train_label,3)
pred_weight <- my_knn_weight(train,test,train_label,3)

table(pred,true=test_label)
table(pred_weight,true=test_label)

 

 

# wisc_bc_data에서 최적의 k값 찾기

 

aa <- NULL
for (k in 1:30){                                      # k를 1~30 사이에서 결정한다고 가정
  if (length(my_knn(train,test,train_label,k))==1){}         
  else{
    pred <- my_knn(train,test,train_label,k)
    aa<-c(aa,sum(diag(table(pred,true=test_label))))         
  }}                                                  

which(aa == max(aa))                                    
which.max(aa)  


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 우수 코드 게시판 이용 관련 공지사항 DataMarket 2014.05.21 41264
87 투빅스 7&8기 6주차 과제 TF-IDF 문서유사도 측정 - 8기 최서현 최서현 2017.08.31 8103
86 투빅스 7&8기 5주차 과제 Selenium Crawling - 8기 김강열 김강열 2017.08.24 7365
85 투빅스 7&8기 5주차 과제 Image Augmentation - 8기 김민정 김소희 최수정 황다솔 file 민정e 2017.08.24 7262
84 투빅스 7&8기 5주차 과제 Beautiful Soup 이용한 Crawling - 8기 류호성 file 류호성 2017.08.24 7293
83 투빅스 7&8기 4주차 과제 tree, RF, bagging, boosting 이용 분석 - 8기 조양규 file dial123 2017.08.17 7633
82 투빅스 7&8기 4주차 과제 의사결정나무&랜덤포레스트 - 8기 김강열 김강열 2017.08.17 7575
81 투빅스 7&8기 3주차 과제 클러스터링 구현 - 8기 권문정 김강열 이현경 조양규 1 이현경 2017.08.10 8184
80 투빅스 7&8기 3주차 과제 PCA - 8기 이현경 file 이현경 2017.08.12 7191
79 투빅스 7&8기 2주차 과제 연관성 분석 - 8기 조양규 file dial123 2017.08.03 8345
78 투빅스 7&8기 2주차 과제 나이브베이즈 구현 - 8기 이현경 file 이현경 2017.08.03 8125
77 투빅스 7&8기 2주차 과제 로지스틱/Ridge/Lasso&알고리즘 - 8기 김강열 file 김강열 2017.08.03 7797
76 투빅스 7&8기 1주차 과제 알고리즘 - 8기 김강열 file 김강열 2017.07.27 7424
75 투빅스 7&8기 1주차 과제 회귀분석 - 8기 황다솔 file 다솔 2017.07.27 7637
74 투빅스 6&7기 8주차 과제 PCA(주성분 분석) - 7기 이동수 1 탱탱볼 2017.03.18 10321
73 투빅스 6&7기 8주차 과제 LBP 알고리즘 구현 - 7기 이광록 1 file 2017.03.16 9554
72 투빅스 6&7기 8주차 과제 SVM - 7기 이광록 1 file 2017.03.16 10342
71 투빅스 6&7기 6주차 과제 소멸언어 분류 예측 데이터분석 - 이동수(7기) 2 file 탱탱볼 2017.03.02 11957
70 투빅스 6&7기 5주차 과제 의사결정나무&앙상블 - 7기 최희정 2 file 히둥 2017.02.23 15496
69 투빅스 6&7기 4주차 과제 K-means 분석 및 구현 - 7기 이광록 2 2017.02.19 11069
68 투빅스 6&7기 4주차 과제 KNN 구현 - 전종섭(7기) 2 뻐엉 2017.02.16 10906
Board Pagination ‹ Prev 1 ... 2 3 4 5 6 7 8 9 ... 10 Next ›
/ 10

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5