close_btn
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#KNN 구현! 
rm(list = ls())
 
wdbc <- read.csv('wisc_bc_data.csv', stringsAsFactors = F)
#id 지우기
wdbc <- wdbc[-1]
str(wdbc)
wdbc$diagnosis <- factor(wdbc$diagnosis, level=c("B","M"))
 
set.seed(1)
idx <- sample(1:nrow(wdbc), 0.8*nrow(wdbc))
wdbc_train <- wdbc[idx,]
wdbc_test <- wdbc[-idx,]
# 이 윗부분 까지만 동일하게 해주세요!
library(caret)
#distance 구하는 함수를 짰으나, 계산량이 많아 느려서 dist()를 활용했음.
#distance <- function(x1, x2) sqrt(sum((x1-x2)^2))
 
#weighted KNN 함수 구현!
Weighted_knn <- function(train_x, test_x, k){
    #결과물을 위한 공간 생성
    classify<-c()
    for(i in 1:length(test_x[,1])){
        #dist를 활용하기 위해 행렬을 합쳐준다.
        agg<-rbind(test_x[i,],train_x)
        agg_dist<-as.matrix(dist(agg))
        #dist가 가까운 것 순으로 인덱스를 구해준다.
        k_close_index<-order(agg_dist[-1,1])[1:k]#3=k
        k_distance<-as.matrix(dist(rbind(test_x[i,],train_x[k_close_index,])))
        #유사도를 구하기 위해 거리의 역수를 취해주고
        k_similarity<-1/k_distance[-1,1]
        #가중치를 계산해준다.
        k_weight<-k_similarity/sum(k_similarity)
        B<-0;M<-0       
            for(n in 1:k){
                if(train_x$diagnosis[k_close_index][n]=="B"){B<-B+k_weight[n]}
                else {M<-M+k_weight[n]}
            }
        classify[i]<-ifelse(B>M,"B","M")
    }       
    return(classify)
}
 
pred<-Weighted_knn(wdbc_train,wdbc_test,3)
#confusion matrix 생성
z<-table(pred,wdbc_test$diagnosis)
accuracy<-(z[1,1]+z[2,2])/sum(z)  #0.8947368
 
#max-min normalization feature 스케일링(optional)
normalize <- function(x) {
    numerator <- x - min(x);    denom <- max(x) - min(x)
    return (numerator/denom)
}
 
wdbc$diagnosis <- factor(wdbc$diagnosis, level=c("B","M"))
wdbc[2:31]<-as.data.frame(lapply(wdbc[2:31], normalize))
wdbc_train <- wdbc[idx,]
wdbc_test <- wdbc[-idx,]
 
pred<-Weighted_knn(wdbc_train,wdbc_test,3)
#confusion matrix 생성
z<-table(pred,wdbc_test$diagnosis)
accuracy<-(z[1,1]+z[2,2])/sum(z)  #0.9649123
 
#scaling 후 accuracy가 크게 증가했음을 확인할 수 있다.
 
##Cross Validation! 구현
 
#cross validation 후 kNN의 k가 first, second, third 일 때 중 accuracy가 가장 높은 k 리턴하는 함수 구현!
CrossValidation <- function(train,first, second, third){
    #cut 함수로 k-Fold 만큼 분할해준다. 이번에는 5 fold로 고정한다.
    folds <- cut(seq(1,nrow(train)),breaks=5,labels = FALSE)
    accuracy<-c()
    for(i in 1:5){
        #폴드별로 인덱스를 저장
        validation_index<-which(folds==i)
        #k가 3일때 KNN
        for_three<-Weighted_knn(train[-validation_index,],train[validation_index,],first)
        #confusion matrix 생성
        conf_mat<-table(for_three,train[validation_index,1])
        #accuracy 계사
        accuracy[i]<-(conf_mat[1,1]+conf_mat[2,2])/sum(conf_mat)
    }
    first_acc<-mean(accuracy)
    print(first_acc)
    
    for(i in 1:5){
        validation_index<-which(folds==i)
        for_five<-Weighted_knn(train[-validation_index,],train[validation_index,],second)
        conf_mat<-table(for_five,train[validation_index,1])
        accuracy[i]<-(conf_mat[1,1]+conf_mat[2,2])/sum(conf_mat)
    }
    second_acc<-mean(accuracy)
    print(second_acc)
    
    for(i in 1:5){
        validation_index<-which(folds==i)
        for_seven<-Weighted_knn(train[-validation_index,],train[validation_index,],third)
        conf_mat<-table(for_seven,train[validation_index,1])
        accuracy[i]<-(conf_mat[1,1]+conf_mat[2,2])/sum(conf_mat)
    }
    third_acc<-mean(accuracy)
    print(third_acc)
    if(order(c(first_acc,second_acc,third_acc))[3]==1){best_k<-first}
    if(order(c(first_acc,second_acc,third_acc))[3]==2){best_k<-second}
    if(order(c(first_acc,second_acc,third_acc))[3]==3){best_k<-third}
    return(best_k)
    
}
 
#과제는 3,5,7이었지만 조금 오바해서 3,7,9로 해본다.
 
best_k <- CrossValidation(wdbc_train,3,7,9)
#first accuracy:  0.9362637
#second accuracy: 0.9384615
#third accuracy:  0.9428571  <- best_k
 
#Cross Validation 하지 않았을 때와 비교해본다.
pred <- Weighted_knn(wdbc_train,wdbc_test, best_k)
confusionMatrix(pred, wdbc_test$diagnosis)
#w/o CV ->  accuracy: 0.9123
 
#Overfitting 이 됐는지 안됐는지 어느정도 가늠을 할 수 있다.
 
###############################################################################################################
# K-means 구현
 
rm(list=ls())
data <- iris[,1:4# 라벨 제거한 iris 데이터를 쓸게요!
 
k_means<-function(data,k,distance_method) # data, cluster의 갯수k, 거리측정 방법을 인자로 받는다.
    {
    set.seed(8)    
    #forgy intialization: 임의로 선택된 데이터를 초기 centroid로 설정
    centroid<-matrix(sample(1:10,ncol(data)*k,replace=TRUE),ncol=ncol(data))
    cluster<-list()
    for(i in 1:10000){
        #dist 함수를 통한
        bind<-rbind(centroid,as.matrix(data));   distance<-as.matrix(dist(bind, method=distance_method))
        #예외처리와 break를 위한 임시 저장
        temp<-centroid
#센트로이드 할당:각 점들과 가장 가까운(min) 센트로이드로 할당
        assign_to <- apply(distance[-(1:k),1:k],1,which.min)
        names(assign_to)<-NULL
        #예외처리 + cluster 주소 저장
        #센트로이드가 어느 곳에도 클러스터링 되지 않을 경우, 이전 센트로이드 값을 이용한다.
        for(j in 1:k){
            ifelse(sum(assign_to==j)==0, cluster[[j]]<-NA, cluster[[j]]<-which(assign_to==j))
        }
#센트로이드 이동
        for(m in 1:k){
            centroid[m,]<-colMeans(data[cluster[[m]],])
            if(is.na(cluster[[m]][1])){centroid[m,]<-temp[m,]
            }
                    
        }
#특정 오차(0.01)보다 낮을 때 iteration stop.
        if(sum(abs(temp[1:k,]-centroid[1:k,]))<0.01){break}
        print(i)
    }
    cluster[[1]]<-rep(1,length(cluster[[1]]))
    cluster[[2]]<-rep(2,length(cluster[[2]]))
    cluster[[3]]<-rep(3,length(cluster[[3]]))
    pred<-unlist(cluster)
    return(pred) 
}
 
pred_label<-k_means(data,3,"canberra")
confusion_matrix <- table(pred_label, iris$Species)
accuracy=sum(confusion_matrix[1,1],confusion_matrix[2,2],confusion_matrix[3,3])/sum(confusion_matrix)
#pred setosa versicolor virginica
#1     50          0         0
#2      0         49         0
#3      0          1        50
#accuracy= 0.9933333              <-canberra distance가 accuracy가 높음
pred_label<-k_means(data,3,"euclidean")
#pred setosa versicolor virginica
#1     50          0         0
#2      0         50        11
#3      0          0        39
#accuracy= 0.9266667
pred_label<-k_means(data,3,"manhattan")
#pred setosa versicolor virginica
#1     50          0         0
#2      0         50        13
#3      0          0        37
#accuracy:0.9133333
 
 
 
 
 
 
cs

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 R 소스 공유 게시판 이용 관련 공지사항 1 DataMarket 2014.05.21 25223
110 투빅스 8&9기 8주차 LDA - 9기 전민규 file 전민규 2018.03.25 2298
109 투빅스 8&9기 8주차 SVM - 9기 최영제 file :) 2018.03.25 2033
108 투빅스 8&9기 8주차 과제 PCA -9기 신용재 file 신용재 2018.03.23 1961
107 투빅스 8&9기 7주차 과제 논문 요약 - 9기 배현주 file 배현주 2018.03.16 2064
106 투빅스 8&9기 7주차 과제 논문 요약 - 8기 김강열 file 김강열 2018.03.15 2093
105 투빅스 8&9기 7주차 과제 - 9기 김수지 file 김수지 2018.03.15 2086
104 투빅스 8&9기 6주차 과제 - 9기 서석현 file 스르륵 2018.03.08 2056
103 투빅스 8&9기 설 알고리즘 과제 - 9기 백광제 file 백광제 2018.02.25 2469
102 투빅스 8&9기 설 분석 과제 16' 뉴욕 택시 운행시간 예측 - 9기 최영제 :) 2018.02.24 2739
101 투빅스 8&9기 4주차 과제 Random Forest -9기 이잉걸 잉걸 2018.02.15 2380
100 투빅스 8&9기 4주차 과제 Naive Bayes Classification -9기 서석현 file 스르륵 2018.02.14 2338
» 투빅스 8&9기 3주차 과제 K-Nearest Neighbor, K-means 구현 -9기 신용재 1 신용재 2018.02.08 2842
98 투빅스 8&9기 3주차 과제 연관성 분석 - 9기 최영제 :) 2018.02.08 2550
97 투빅스 8&9기 2주차 과제 Gradient Descent, Softmax, Cross Entropy - 9기 서석현 file 스르륵 2018.02.02 2412
96 투빅스 8&9기 2주차 과제 회귀분석/로지스틱 - 9기 최영제 file :) 2018.02.02 2865
95 투빅스 8&9기 2주차 과제 Gradient Descent, Softmax, Cross Entropy - 9기 김명진 file kimji 2018.02.02 2290
94 투빅스 8&9기 1주차 과제 R 9기-신용재 file 신용재 2018.01.25 2685
93 투빅스 8&9기 1주차 과제 R 알고리즘 - 9기 서석현 file 스르륵 2018.01.25 2717
92 투빅스 7&8기 9주차 과제 Neural Network를 이용한 MNIST 분류 - 8기 김민정 민정e 2017.09.23 4078
91 투빅스 7&8기 9주차 과제 Neural Network를 이용한 MNIST 분류 - 8기 최서현 최서현 2017.09.22 3934
Board Pagination ‹ Prev 1 2 3 4 5 ... 6 Next ›
/ 6

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5