Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
군집분석 (Clustering) 군집 분석 (Clustering) 설명모델 (description model) 2 실습 데이터 Iris Data datasets 패키지 Wine Data Hdclassif 패키지 AdultUCI Data arules 패키지 setosa virginica Iris Data versicolor Iris Data 꽃받침 4가지 속성 1. Sepal.Length 2. Sepal.Width 3. Petal.Length 4. Petal.Width 꽃잎 Clustering 결과 평가 3개 class 존재 => 3개 cluster를 생성하게 함 clustering ... 각 cluster가 원래 class에 속한 데이터를 복원할 수 있는지를 측정 군집분석 알고리즘의 유형 거리함수(distance function) 기반 계층형 Hierarchical clustering Complete-linkage Single-linkage Centroid-linkage Average-linkage Ward’s method 평면형 Partitional clustering k-means k-medoids 밀도(density) 기반 DBScan 평면형 Clustering: i 단계 k-means : centroid (i+1) 단계 Data Mining Lab., Univ. of Seoul, Copyright ® 2008 8 Iris 데이터의 군집분석 K-means 알고리즘의 활용 data(iris) library(stats) myiris <-iris myiris$Species <-NULL # Species 컬럼 제거 myiris.kmeans <- kmeans(myiris, centers=3) myiris.kmeans <- kmeans(myiris, 3) # 위와 동일한 표현 3개의 cluster를 생성 Iris 데이터의 군집분석 K-means 알고리즘의 평가: 기존 class분류결과와 비교 table(iris$Species, myiris.kmeans$cluster) conf.mat <- table(iris$Species, myiris.kmeans$cluster) (accuracy <- sum(diag(conf.mat))/sum(conf.mat) * 100) new.mat <- data.frame("c1"=conf.mat[,1], "c3"=conf.mat[,3], "c2"=conf.mat[,2]) new.mat <- as.matrix(new.mat) (accuracy <- sum(diag(new.mat))/sum(new.mat) * 100) as.OOO 형태 의 함수 Cluster 배치 변경 # 사실은, 아래와 같이 간단하게 > new.mat <- conf.mat[, c(1,3,2)] Iris 데이터의 군집분석 클러스터링은 “설명모델 (description model)”을 생성 클러스터링 결과를 담은 객체변수를 출력 Iris 데이터의 군집분석 K-means 모델의 시각화 클러스터 번호를 col속성에 할당 데이터 항목별로 color값을 할당 plot(myiris[c("Sepal.Length", table(iris$Species, myiris.kmeans$cluster) "Sepal.Width")], col=myiris.kmeans$cluster) conf.mat <- table(iris$Species, myiris.kmeans$cluster) points(myiris.kmeans$centers[,c("Sepal.Length","Sepal.Width")], col=1:3, pch=“*”, cex=5) Iris 데이터의 군집분석 K-means 모델의 해석 myiris.kmeans$centers # 각 cluster의 중심값을 출력 ave <- 0 for(i in 1:ncol(myiris)) ave[i]<- sum(myiris.kmeans$centers[,i])/nrow(myiris.kmeans$centers) ave # 출력 Iris 데이터의 군집분석 K-medoids 알고리즘의 활용 library(cluster) myiris.pam <- pam(myiris,3) table (myiris.pam$clustering, iris$Species) VS. K-means 모델 K-medoids 모델 outlier에 강함 outlier에 약함 계층형 clustering 0step a 1step 2step 3step Bottom-up (agglomerative) ab b abcde c cde e de d 4step 4step 3step 2step 1step 0step Top-down (divisive) Data Mining Lab., Univ. of Seoul, Copyright ® 2008 15 Hierarchical Agglomerative Clustering 5가지 유형 Simple linkage Complete linkage Average linkage Centroid linkage Ward’s method Ward’s method Sum of Square Error (SSE) 계산 거리함수 Euclidean 거리함수 Manhattan 거리함수 Minkowski 거리함수 Canberra 거리함수 Iris 데이터의 군집분석 HAC 알고리즘의 활용: single linkage table(iris$Species, cls$cluster) sim_eu <- dist(myiris, method="euclidean") conf.mat <- table(iris$Species, cls$cluster) dendrogram <-hclust(sim_eu^2, method=“single”) plot(dendrogram) cluster <- cutree(dendrogram, k=3) table(iris$Species, cluster) sim_eu <- dist(myiris, method="euclidean") "euclidean","manhattan", "canberra", "minkowski" dendrogram <-hclust(sim_eu^2, method=“single”) "ward.D2", "single", "complete", "average" , "median“, "centroid" Iris 데이터의 군집분석 HAC 모델의 시각화: dendrogram Cutting line에 따라 cluster 개수가 결정 Iris 데이터의 군집분석 small iris 데이터의 군집분석 iris.num <- dim(iris)[1] # nrow(iris) 와 동일 idx <-sample(1:iris.num, 50) smalliris <- iris[idx,] smalliris$Species <-NULL sim <- dist(smalliris) den <- hclust(sim^2, method="single") plot(den, hang= -1) plot(den, hang= -1, labels=iris$Species[idx]) Iris 데이터의 군집분석 HAC 모델의 시각화: dendrogram plot(den, hang= -1) plot(den, hang= -1, labels=iris$Species[idx]) Iris 데이터의 군집분석 HAC 알고리즘의 활용: average linkage sim_eu <- dist(myiris, method="euclidean") dendrogram <-hclust(sim_eu^2, method=“average”) plot(dendrogram) cluster <- cutree(dendrogram, k=3) conf.mat <- table(iris$Species, cluster) HAC 알고리즘의 활용: complete linkage * 100) (accuracy <- sum(diag(conf.mat))/sum(conf.mat) Iris 데이터의 군집분석 HAC 알고리즘의 활용: complete linkage sim_eu <- dist(myiris, table(iris$Species, cls$cluster) method="euclidean") conf.mat <- table(iris$Species, dendrogram <-hclust(sim_eu^2, cls$cluster) method=“complete”) plot(dendrogram) cluster <- cutree(dendrogram, k=3) conf.mat <- table(iris$Species, cluster) (accuracy <- sum(diag(conf.mat))/sum(conf.mat) * 100) HAC 알고리즘의 활용: complete linkage new.mat <- data.frame("c1"=conf.mat[,1], "c3"=conf.mat[,3], "c2"=conf.mat[,2]) new.mat <- as.matrix(new.mat) (accuracy <- sum(diag(new.mat))/sum(new.mat) * 100) Cluster 배치 변경 Iris 데이터의 군집분석 HAC 알고리즘의 활용: Ward’s method sim_eu <- dist(myiris, method="euclidean") dendrogram <-hclust(sim_eu^2, method=“ward.D”) plot(dendrogram) cluster <- cutree(dendrogram, k=3) conf.mat <- table(iris$Species, cluster) HAC 알고리즘의 활용: complete linkage * 100) (accuracy <- sum(diag(conf.mat))/sum(conf.mat) Iris 데이터의 군집분석 HAC 알고리즘의 활용: centroid linkage sim_eu <- dist(myiris, method="euclidean") dendrogram <-hclust(sim_eu^2, method=“centroid”) plot(dendrogram) cluster <- cutree(dendrogram, k=3) conf.mat <- table(iris$Species, cluster) HAC 알고리즘의 활용: complete linkage * 100) (accuracy <- sum(diag(conf.mat))/sum(conf.mat) Iris 데이터의 군집분석 HAC 알고리즘의 활용: centroid linkage 거리함수 변경 sim_mi <- dist(myiris, method="minkowski") dendrogram <-hclust(sim_mi^2, method=“centroid”) plot(dendrogram) HAC 알고리즘의 k=3) 활용: complete linkage cluster <- cutree(dendrogram, conf.mat <- table(iris$Species, cluster) (accuracy <- sum(diag(conf.mat))/sum(conf.mat) * 100) 밀도기반 Clustering DBSCAN: Cluster를 “density-connected set”으로 정의 density: 정해진 반경()내에 데이터의 개수 Data Mining Lab., Univ. of Seoul, Copyright ® 2008 Iris 데이터의 군집분석 Density-based clustering 알고리즘의 활용 library(fpc) myiris <- iris[-5] myiris.ds <- dbscan(myiris, eps=0.42, MinPts=5) table(myiris.ds$cluster, iris$Species) Iris 데이터의 군집분석 Density-based clustering 모델의 평가 plot(myiris.ds, myiris) Iris 데이터의 군집분석 Density-based clustering 모델의 평가 plot(myiris.ds, myiris[c(1,4)]) Iris 데이터의 군집분석 Density-based clustering 모델의 평가 plotcluster(myiris, myiris.ds$cluster) # projection 화학성분 함유량 Red Wine White Wine RoséWine Wine Data Wine Data 13가지 속성: 화학성분 함유량 1. Alcohol 2. Malic acid 3. Ash 4. Alcalinity of ash 5. Magnesium 6. Total phenols 7. Flavanoids 8. Nonflavanoid phenols 9. Proanthocyanins 10.Color intensity 11. Hue 12.OD280/OD315 of diluted wines 13.Proline Wine 데이터의 군집분석 데이터 준비 및 전처리 library(HDclassif) data(wine) head(wine) mywine <- wine[,-1] # 1번째 컬럼 삭제 , mywine$class <- NULL mywine <-scale(mywine) Wine 데이터의 군집분석 K-means 알고리즘의 활용 km <- kmeans(mywine, centers=3) ss <-km$withinss 각 cluster 내부의 각 구성원 간 거리의 제곱의 합(sum of squares) 거리 값이 작을 수록 품질의 좋다고 평가 거리 ... Wine 데이터의 군집분석 K-means 모델의 평가 conf.mat <- table(wine$class, km$cluster) (accuracy <- sum(diag(conf.mat))/sum(conf.mat) * 100) Cluster Class Wine 데이터의 군집분석 K-means 알고리즘의 활용: 시각화 plot(mywine[c("V1","V2")], col=km$cluster) points(km$centers[ , c("V1","V2")], col=1:3, pch=8, cex=2) Wine 데이터의 군집분석 K-means 알고리즘의 활용: cluster 품질평가 ss <-0 for(i in 1:15) ss[i] <- sum(kmeans(mywine, centers=i)$withinss) plot(1:15, ss, type="b", xlab="클러스터 개수", ylab="각 클러스터 SS의 합") Wine 데이터의 군집분석 K-means 알고리즘의 활용: cluster 품질평가 ss <-0 for(i in 1:15) ss[i] <- sum(kmeans(mywine, centers=i)$withinss) plot(1:15, ss, type="b", xlab="클러스터 개수", ylab="각 클러스터 SS의 합") Wine 데이터의 군집분석 HAC 알고리즘의 활용 sim_eu <- dist(mywine, method="euclidean") dendrogram <-hclust(sim_eu^2, method="ward.D2") cluster <- cutree(dendrogram, k=3) conf.mat <- table(wine$class, cluster) (accuracy <- sum(diag(conf.mat))/sum(conf.mat) * 100) Cluster VS. K-means 모델 HAC 모델 Wine 데이터의 군집분석 특징 선택 (feature selection) 데이터 차별화를 높여주는 특징을 선별 mywine <- wine subfeatures <- cfs(class~., wine) subfeatures # 선택된 feature를 확인 mywine <- wine[subfeatures] 선택된 특징만을 사용하여 다시 클러스터링 km <-kmeans(mywine,3) conf.mat <- table(wine$class, km$cluster) (accuracy <- sum(diag(conf.mat))/sum(conf.mat) * 100) Cluster K-means 모델 Cluster K-means 모델 Wine 데이터의 군집분석 특징 선택 (feature selection) 데이터 차별화를 높여주는 특징을 선별 mywine <- wine subfeatures <- consistency(class~., wine) subfeatures # 선택된 feature를 확인 mywine <- wine[c(-1,-4)] 선택된 특징만을 사용하여 다시 클러스터링 km <-kmeans(mywine,3) conf.mat <- table(wine$class, km$cluster) (accuracy <- sum(diag(conf.mat))/sum(conf.mat) * 100) Cluster K-means 모델 Cluster K-means 모델 Feature Selection 범주형 데이터에 대한 feature selection weights <- chi.squared(Class~., HouseVotes84) weights <- information.gain(Species~., iris) weights <- gain.ratio(Species~., iris) weights <- symmetrical.uncertainty(Species~., iris) subset <- cutoff.k.percent(weights, 0.75) subset <- cutoff.biggest.diff(weights) 범주형, 연속형 데이터에 대한 feature selection subset <- cfs(Species~., iris) weights <- relief(Species~., iris, neighbours.count = 5, sample.size = 20) weights <- random.forest.importance(Class~., HouseVotes84, importance.type = 1) 연속형 데이터에 대한 feature selection weights <- linear.correlation(medv~., d) weights <- rank.correlation(medv~., d) poor rich Adult Data Adult Data 14가지 속성: 인구학적 정보 1. age: 2. workclass 3. fnlwgt 4. education 5. education-num. 6. marital-status 7. occupation 8. relationship 9. race 10. sex 11. capital-gain 12. capital-loss 13. hours-per-week 14. native-country AdultUCI 데이터의 군집분석 K-means 알고리즘의 활용 library(arules) data(AdultUCI, package=“arules”) idx <-sample(nrow(AdultUCI[complete.cases(AdultUCI),]), 1000) #cc <- complete.cases(AdultUCI) # 누락된 값이 없는 행만을 선택 complete.Adult <-AdultUCI[idx,] adult.km <-kmeans(complete.Adult[,c(1,3,5,11,12,13)],2) # 숫자 타입 컬럼 table(adult.km$cluster, complete.Adult[,"income"]) K-means 모델 AdultUCI 데이터의 군집분석 K-medoids 알고리즘의 활용 library(arules) data(AdultUCI, package=“arules”) idx <-sample(nrow(AdultUCI[complete.cases(AdultUCI),]), 1000) #cc <- complete.cases(AdultUCI) # 누락된 값이 없는 행만을 선택 complete.Adult <-AdultUCI[idx,] adult.pam <-pam(complete.Adult[,c(1,3,5,11:13)],2) table(adult.pam$clustering, AdultUCI[idx, "income"]) VS. K-medoids 모델 K-means 모델