R 9장. k-means 알고리즘
R(알) 2017. 9. 9. 13:49
- 머신러닝 종류 3가지
- 1. 지도학습 {입력값, 정답}
- 분류 : knn, 나이브베이즈, 결정트리, svm
- 회귀 : 선형회귀, 신경망
- 2. 비지도학습 {입력값}
:k-means
정답이 없으니 해법을 배우지 못하고 데이터의 형태를 가지고
유형을 나눠보는 것
- 3. 강화학습 {입력값, 출력값, 출력에 대한 보상 }
: 핑퐁 , 틱텍토
■ 9장. 목차
- k-means 란?
- k-means 실습1 ( 국영수 점수를 가지고 학생 분류)
- k-means 실습2 ( 쇼셜 미디어에 같은 성향을 갖는 사람들을 분류)
--> 책 실습 예제
■ 1. k-means란?
각 문서들 속에 들어있는 데이터 분석을 통해 유사하거나 관계가 높은 항목끼리의 집합(클러스터)를 만들고 싶을때
사용하는 알고리즘
- (처음 중심값 선택) 랜덤하게 중심값 (centroid)를 선태갛ㄴ다.
- (클러스터 할당) k 개의 중심값과 각 개별 데이터간의 거리를 측정한다. 가장 가까운 클러스터에 해당 데이터를 assign한다.
- (새 중심값 선택) 클러스터 마다 새로운 중심값을 계산한다.
- (범위 확인) 선택된 중심값이 변화가 어느정도 없다면 멈춘다.
■ 데이터 수에 따른 적당한 k 값 계산
k = sqrt(n/2)
■ k-means 의 한계점
- k 값 입력 파라미터를 직접 지정해줘야 한다.
- 이상치(outlier) 에 민감하다
■ 기본예제1
1. 기본 데이터 셋을 만든다.
c <- c(3,4,1,5,7,9,5,4,6,8,4,5,9,8,7,8,6,7,2,1)
row <- c("A", "B","C","D","E","F","G","H","I","J")
col <- c("X","Y")
data <- matrix(c, nrow=10, ncol=2,byrow=TRUE, dimnames=list(row,col))
data
2.위에서 만든 데이터 셋으로 plot 그래프를 그린다
plot(data)
km <- kmeans( data, 2)
km$cluster
cbind(data, km$cluster)
> km$cluster
A B C D E F G H I J
1 1 2 1 2 1 2 2 2 1
> cbind(data, km$cluster)
X Y
A 3 4 1
B 1 5 1
C 7 9 2
D 5 4 1
E 6 8 2
F 4 5 1
G 9 8 2
H 7 8 2
I 6 7 2
J 2 1 1
>
km$centers
> km$centers
X Y
1 3 3.8
2 7 8.0
3. km 파라미터 값들을 가지고 다시한번 시각화 하시오 !
plot(round(km$center) , col= km$center, pch = 22 , bg = "dark blue", xlim=range(0:10), ylim=range(0:10) )
4. 원래 데이터를 위의 그래프에 합쳐서 출력합시다.
plot(round(km$center) , col= km$center, pch = 22 , bg = "dark blue", xlim=range(0:10), ylim=range(0:10) )
par(new=T)
plot(data, col=km$cluster +1 , xlim = range(0:10), ylim=range(0:10))
머신러닝 음악 분류
문제243. 영어와 수학 점수로 크게 4 그룹의 학생 집합으로 분류하시오 !
1. 영어, 수학 둘다 잘하는 학생들
2. 영어, 수학 둘다 못하는 학생들
3. 영어는 잘하는데 수학은 못하는 학생들
4. 수학은 잘하는데 영어는 못하는 학생들
academy <- read.csv("academy.csv", stringsAsFactors= F, header = T)
academy <- academy[-1]
academy
academy2 <- academy[, c(2,3)]
plot(academy2)
km <- kmeans(academy2,4)
km
plot(round(km$center) , col= km$center, pch = 22, bg = "dark blue",
xlim=range(0:100), ylim=range(0:100) )
par(new=T)
plot(academy2, col=km$cluster +1 , xlim = range(0:100), ylim=range(0:100))
음악도 이렇게 분류가 될듯 한데 ㅋㅋ : 잘해보셈
문제244. 영어와 수학을 둘다 잘하는 학생들이 누구누구인가?
x<- cbind( academy, km$cluster)
> km
K-means clustering with 4 clusters of sizes 6, 18, 17, 11
Cluster means:
수학점수평균 영어점수평균
1 47.83333 44.16667
2 83.72222 65.00000
3 87.17647 85.64706
4 59.81818 77.27273
Clustering vector:
[1] 3 2 1 2 3 3 2 2 1 4 3 3 4 1 3 2 2 3 3 3 2 2 4 2 2 2 4 3 2 4 2 3 4 3 1 2 2 3 3 4 4 3 4 2 1 3 4 2 3 4 1 2
Within cluster sum of squares by cluster:
[1] 791.6667 1775.6111 1304.3529 1273.8182
(between_SS / total_SS = 79.4 %)
Available components:
[1] "cluster" "centers" "totss" "withinss" "tot.withinss" "betweenss" "size"
> x[km$cluster==3,]
국어점수평균 수학점수평균 영어점수평균 과학점수평균 학업집중도 km$cluster
1 90 75 85 60 70 3
5 88 89 80 82 90 3
6 90 92 90 96 100 3
11 70 93 77 89 60 3
12 99 80 95 70 80 3
15 90 77 92 60 70 3
18 90 89 80 92 90 3
19 76 90 80 92 70 3
20 70 92 80 95 70 3
28 84 88 90 92 90 3
32 88 80 85 88 90 3
34 90 77 82 65 80 3
38 93 90 89 91 90 3
39 92 97 90 89 80 3
42 90 92 88 94 90 3
46 78 91 77 90 80 3
49 97 90 96 90 90 3
>
*10대의 sns 데이터
30000명의 10대 관심사를 가지고 5개의 그룹으로 나눈다
1. 데이터를 준비한다.
teens <- read.csv("snsdata.csv")
2. 성별에 결측 데이터가 있는지 확인
table(teens$gender)
table(teens$gender, useNA="ifany")
3. age의 이상치 제거
teens$age <- ifelse(teens$age >= 13 & teens$age <20, teens$age, NA)
summary(teens$age)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
13.03 16.30 17.26 17.25 18.22 20.00 5523
4. 데이터 정제 (unknown인 성별값의 데이터를 1과 0으로 부여)
teens$female <- ifelse(teens$gender=="F" & !is.na(teens$gender),1,0)
teens$no_gender <- ifelse(is.na(teens$gender),1,0)
table(teens$gender, useNA="ifany")
table(teens$female, useNA="ifany")
table(teens$no_gender, useNA="ifany")
5. 집단별 평균나이
mean(teens$age)
mean(teens$age, na.rm=TRUE)
문제246. 졸업예정년도(gradyear), 졸업예정년도별 평균나이를 구하시오.
aggregate(data=teens, age~gradyear, mean, na.ram = TRUE)
gradyear age
1 2006 18.65586
2 2007 17.70617
3 2008 16.76770
4 2009 15.81957
6. 각 개인에 대한 예측된 나이 계산
(나이의 결측값들은 기존 데이터로 대충 예상해서 채워넣는다)
ave_age <- ave(teens$age, teens$gradyear, FUN = function(x), mean(x,na.rm=TRUE))
ave_age
teens$age <- ifelse(is.na(teens$age), ave_age, teens$age)
summary(teens$age)
7. teens 데이터셋에서 관심사에 해당하는 컬럼들만 따로 interest 라는 변수에 담는다.
interests <- teens[5:40]
8. 위의 interests 데이터를 정규화한다.
interests_z <- as.data.frame(lapply(interests, scale))
interests_z
9. kmeans로 위의 관심사를 5개의 군집으로 분류하시오.
teens_clusters <- kmeans(interests_z,5)
teens$cluster <-teens_clusters$cluster
10. 처음 5개의 데이터만 확인
teens[1:5, c("cluster","gender","age","friends")]
aggregate(data=teens, age ~cluster, mean)
문제247. 군집별 여성의 비율이 어떻게 되는가?
aggregate(data=teens, female ~cluster, mean)
문제248. 군집별 친구수의 평균은 어떻게 되는가?
aggregate(data=teens, friends ~cluster, mean)
'R(알) ' 카테고리의 다른 글
R 8장. 연관규칙 (apriori 알고리즘) (0) | 2017.09.23 |
---|---|
R 7장 신경망과 서포트 벡터 머신(발표자료) (0) | 2017.09.23 |
R 7장 신경망과 서포트 벡터 머신 (0) | 2017.09.09 |
R 5장. 결정트리 (0) | 2017.09.08 |
R 4장. 나이브 베이즈의 이해활용한 기계학습4 (0) | 2017.09.08 |