close_btn
조회 수 144 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
Clustering : Assignment 1 : K-Means 구현 하기

1. 함수 구현
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
import numpy as np
import pandas as pd
import random
from copy import deepcopy
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
# K-means function
def KMEANS(data, k):
    '''
    data : np.array 또는 pd.Series
    k : 군집의 개수
    '''
    # 두 점간의 거리를 계산하는 함수
    def dst(A, B):
        '''
        A : centroid
        B : 거리를 계산할 한 점
        둘 다 array로 받아야함.
        '''
        return np.array([np.sqrt(np.sum((i - B)**2)) for i in A])
    
    # centroid를 저장하는 arrray 생성
    # centroid = np.array([0]*k)
    # 초기 centroid random 설정
    centroid = np.array([i for i in data[random.sample(range(0len(data)),k)]])
    count = 0
    # calculate distance 
    while count < 1:
        # 이전 centroid와 비교를 위한 변수
        pre_centroid = deepcopy(centroid)
        # 각 record의 군집 label
        label = np.array([np.argmin(dst(centroid, i)) for i in data])
        # cluster 별 centroid 계산
        centroid = np.array([np.array([ a for a, b in zip(data, label) if b== i ]).mean(axis=0for i in range(k)])
        # 만약 이전 centroid와 같다면 count + 1 하고 직전과 같다면 반복을 종료
        if (centroid == pre_centroid).all():
            count +=1
    return label
cs


2. 성능 확인

 2.1. 원래 label

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Plotting을 위한 값 할당
features = iris.data    # shape = (150, 4)
feature_names = iris.feature_names
target = iris.target
target_names = iris.target_names
 
# 2.1. 기존 lable
for t in range(3):
    if t == 0:
        c='r'
        marker='>'
    elif t == 1:
        c='g'
        marker='o'
    elif t == 2:
        c='b'
        marker='x'
    plt.scatter(features[target == t, 0],   # sepal length
                features[target == t, 1],   # sepal width
                marker = marker,
                c = c)
    plt.xlabel("sepal length")
    plt.ylabel("sepal width")
cs

다운로드.png

 2.2. K-means label


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2.2. K-means label
for t in range(3):
    if t == 0:
        c='r'
        marker='>'
    elif t == 1:
        c='g'
        marker='o'
    elif t == 2:
        c='b'
        marker='x'
    plt.scatter(features[label == t, 0],   # sepal length
                features[label == t, 1],   # sepal width
                marker = marker,
                c = c)
    plt.xlabel("sepal length")
    plt.ylabel("sepal width")

cs


다운로드 (1).png



Clustering : Assignment 2 : K-means로 파생변수 만들기

neighborhood란 변수의 class가 너무 많다. 각 클래스를 자료점으로 하여 클래스끼리 묶고 싶다.

각 class의 연속형 변수만, 대표값으로 median을 취한다.

1
2
all_data_Neighbor = all_data.groupby("Neighborhood")[colnm_iaf].median()
all_data_Neighbor
cs


구현한 함수를 가져와 K-means 실시 후 결과 확인

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
import random
 
# Kmeans 함수
def KMEANS(data, k):
    '''
    data : np.array 또는 pd.Series
    k : 군집의 개수
    '''
    # 두 점간의 거리를 계산하는 함수
    def dst(A, B):
        '''
        A : centroid
        B : 거리를 계산할 한 점
        둘 다 array로 받아야함.
        '''
        return np.array([np.sqrt(np.sum((i - B)**2)) for i in A])
 
    
    # centroid를 저장하는 arrray 생성
    # centroid = np.array([0]*k)
    # 초기 centroid random 설정
    centroid = np.array([i for i in data[random.sample(range(0len(data)),k)]])
    count = 0
 
    # calculate distance 
    while count < 1:
        # 이전 centroid와 비교를 위한 변수
        pre_centroid = deepcopy(centroid)
        # 각 record의 군집 label
        label = np.array([np.argmin(dst(centroid, i)) for i in data])
        # cluster 별 centroid 계산
        centroid = np.array([np.array([ a for a, b in zip(data, label) if b== i ]).mean(axis=0for i in range(k)])
        # 만약 이전 centroid와 같다면 count + 1 하고 직전과 같다면 반복을 종료
        if (centroid == pre_centroid).all():
            count +=1
 
    return label
 
# Neighborhood별로 Clustering 결과를 살펴보자.
all_data_Neighbor = all_data_Neighbor.reset_index()
all_data_Neighbor["KMEAN"= KMEANS(np.array(all_data_Neighbor.drop(["Neighborhood""SalePrice"], axis=1)),5)
 
# scatterplot을 썼어야 했는데...
sns.violinplot(all_data_Neighbor.Neighborhood, "KMEAN", data=all_data_Neighbor)

cs


다운로드 (2).png

전체 Data set에 클러스터링 결과를 적용하고 결과 확인

1
2
3
4
5
6
7
8
# 분류결과를 Dict로 저장
dic_Neighbor = dict(np.array(all_data_Neighbor[["Neighborhood","KMEAN"]]))
 
# 전체 Data Set에 분류 결과 적용
all_data["Neighborhood"].replace(to_replace=list(dic_Neighbor.keys()), value=np.array(list(dic_Neighbor.values())).astype(str),inplace=True)
 
# 군집화한 Neighborhood 별로 SalePrice의 분포 확인
sns.violinplot(x=all_data.Neighborhood, y="SalePrice", data=all_data)

cs



다운로드 (3).png


Ensemble2 파일안에 Clustering 내용이 포함되어 있습니다.

제가 배운바로는 K의 수를 임의로 지정하기 보다는 자료를 계층적 군집분석(HCA)을 통해 묶이는 군집의 모양을 살펴본 후 K-means로 묶고 싶은 군집의 개수를 묶어야한다고 알고 있습니다. 시간이 부족하여 그 과정은 생략하고 바로 적용만 하였습니다.


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 R 소스 공유 게시판 이용 관련 공지사항 1 DataMarket 2014.05.21 34570
149 투빅스 10기&11기 7주차 CNN (Alexnet) - 11기 심은선 file 심은선 2019.03.15 41
148 투빅스 10기&11기 7주차 - NLP - 11기 유기윤 file 유기윤 2019.03.14 51
147 투빅스 10기&11기 6주차 Advanced Neural Network - 11기 김대웅 file 김대웅 2019.03.12 45
146 투빅스 10기&11기 5주차 Neural Network - 11기 김대웅 file 김대웅 2019.03.07 82
145 투빅스 10기&11기 4주차 Algorithm - 10기 정윤호 UNOVATE 2019.03.04 56
144 투빅스 10기&11기 4주차 ML Performance Tuning - 11기 김대웅 김대웅 2019.02.22 92
143 투빅스 10기&11기 4주차 PCA - 11기 임채빈 임채빈 2019.02.22 94
142 투빅스 10기&11기 3주차 Clustering - 11기 한재연 file 한재연 2019.02.16 120
141 투빅스 10기&11기 3주차 Decision Tree - 11기 김유민 file 2019.02.15 111
» 투빅스 10기&11기 3주차 Clustering - 11기 김대웅 file 김대웅 2019.02.15 144
139 투빅스 10기&11기 3주차 Algorithm - 11기 한재연 file 한재연 2019.02.15 99
138 투빅스 10기&11기3주차 앙상블(Kaggle HousePrice) - 11기 이소라 file 소라찌 2019.02.15 119
137 투빅스 10기&11기 2주차 SVM, Naive Bayes, KNN - 11기 유기윤 file 유기윤 2019.02.02 197
136 투빅스 10기&11기 2주차 SVM, Naive Bayes, KNN - 11기 김대웅 file 김대웅 2019.01.31 226
135 투빅스 10기&11기 1주차 Algorithm - 11기 한재연 1 file 한재연 2019.01.31 257
134 투빅스 10기&11기 1주차 Algorithm - 11기 권혜민 file 권혜민 2019.01.31 196
133 투빅스 10&11기 1주차 Linear Regression - 11기 유기윤 file 유기윤 2019.01.24 303
132 투빅스 10&11기 1주차 Regression - 11기 강수민 file 수민 2019.01.24 283
131 투빅스 10&11기 1주차 Logistic Regression - 11기 김대웅 file 김대웅 2019.01.23 271
130 투빅스 9&10기 8주차 CNN - 10기 장유영 장유영 2018.09.20 2021
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