Quiet Time

  • 머신러닝 종류 3가지
  • 1. 지도학습 {입력값, 정답}
    • 분류 : knn, 나이브베이즈, 결정트리, svm
    • 회귀 : 선형회귀, 신경망

  • 2. 비지도학습 {입력값}

               :k-means 
     정답이 없으니 해법을 배우지 못하고 데이터의 형태를 가지고 
     유형을 나눠보는 것

  • 3. 강화학습 {입력값, 출력값, 출력에 대한 보상 }
               : 핑퐁 , 틱텍토


■ 9장. 목차
  1. k-means 란?
  2. k-means 실습1 ( 국영수 점수를 가지고 학생 분류)
  3. k-means 실습2 ( 쇼셜 미디어에 같은 성향을 갖는 사람들을 분류)
                    --> 책 실습 예제 


■ 1. k-means란? 
 각 문서들 속에 들어있는 데이터 분석을 통해 유사하거나 관계가 높은 항목끼리의 집합(클러스터)를 만들고 싶을때 
사용하는 알고리즘
  1. (처음 중심값 선택) 랜덤하게 중심값 (centroid)를 선태갛ㄴ다.
  2. (클러스터 할당) k 개의 중심값과 각 개별 데이터간의 거리를 측정한다. 가장 가까운 클러스터에 해당 데이터를 assign한다. 
  3. (새 중심값 선택) 클러스터 마다 새로운 중심값을 계산한다. 
  4. (범위 확인) 선택된 중심값이 변화가 어느정도 없다면 멈춘다. 

■ 데이터 수에 따른 적당한 k 값 계산 

     k = sqrt(n/2)
■ k-means 의 한계점 
  1. k 값 입력 파라미터를 직접 지정해줘야 한다. 
  2. 이상치(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)