close_btn
조회 수 14395 추천 수 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 39655
53 투빅스 5&6기 2주차과제 1번 회귀분석 -6기 한동훈 2 file 투빅스6기한동훈 2016.08.04 11245
52 투빅스 5&6기 2주차 과제 2번 마방진 만들기 - 6기 임진주 4 file 진주 2016.08.04 10959
51 투빅스 5&6기 1주차 과제 2번 재석 2016.07.28 9418
50 5&6기 1주차 과제 1번 - 6기 이윤섭 겨뽀 2016.07.28 10123
49 투빅스 5&6기 1주차 과제코드 Alan 2016.07.27 9558
48 크롤링 - 전국 이디야 매장정보를 중심으로 (5기 이승은) 2 file 켜져있는멀티탭 2016.03.26 26750
47 crawling - 5기 이제형 4 trevor 2016.03.24 14413
46 PCA (주성분 분석) - 5기 이제형 trevor 2016.03.09 14750
45 NBA data 회귀분석 / Adult data 로지스틱 회귀분석, 나이브베이즈, 의사결정나무 - 5기 정현재 2 file 정현재 2016.03.03 17937
44 NBA 회귀분석 / adult 로지스틱회귀, 나이브베이즈, 의사결정나무 - 5기 최도현 3 file 알빈 2016.03.03 20271
43 K-Means Funtion (5기 이제형) 3 trevor 2016.02.25 13735
42 박이삭_기초스터디__반복문 및 apply함수 및 데이터프레임다루기 지니상 2016.02.12 10686
41 최도현_기초스터디_R기초 지니상 2016.02.12 11378
40 양우식_기초스터디_dplyr_sqldf 지니상 2016.02.12 12172
39 이정민_기초스터디_stringr패키지 지니상 2016.02.12 17661
38 고가영_기초스터디_파일불러오기 및 Rmarkdown 지니상 2016.02.12 13564
37 입출금 처리 프로그램 (4주차 과제) - 5기 방정훈 file Alan 2016.02.10 12431
36 연관성 분석(3주차 과제) & KNN 함수만들기(3주차 과제) - 4기 김선지 순지 2016.02.09 13667
35 연관성 분석(3주차 과제) - 5기 이정민 1 file 쩡마 2016.02.07 14119
» KNN 함수만들기 (3주차 과제) - 5기 방정훈 Alan 2016.02.03 14395
Board Pagination ‹ Prev 1 ... 2 3 4 5 6 7 ... 8 Next ›
/ 8

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5