Machine Learning

[Machine Learning] 군집(Clustering)_2

구루싸 2019. 12. 11. 22:57
반응형
SMALL

오늘도 공부를 해야겠죠-_-

지난 학습에 이어 주제는 군집(Clustering) 알고리즘 중

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)인데

데이터가 위치하고 있는 공간 밀집도를 기준으로 클러스터를 구분하는 방식입니다

간단히 설명하자면 Noise(Outlier)를 제외한

코어 포인트(Core point)와 경계 포인트(Border point)를 클러스터로 구성하는 것입니다

코어 포인트는 데이터 분포를 점으로 찍었을 때

어느 한 점을 기준으로 반지름(R)인 원을 그려서

그 원 안에 최소 M개의 데이터가 존재하는 점이고

경계 포인트는 자신이 코어 포인트가 아닌데

반지름(R)안에 다른 코어 포인트가 있는 점을 의미합니다

Noise는 위의 두 점을 제외한 나머지 점입니다

역시 이해가 안되도 직진하는 것이 바람직하겠죠-_-

# 판다스(Pandas)
import pandas
import folium

# Prepare Data 
filepath = "/Users/dennis_sa/Documents/"
df = pandas.read_excel(filepath + "중학교졸업생진로현황.xlsx", header = 0)
pandas.set_option('display.width', None)
pandas.set_option('display.max_row', 50)
pandas.set_option('display.max_columns', 10)
pandas.set_option('display.max_colwidth', 20)
pandas.set_option('display.unicode.east_asian_width', True)

print(df.columns.values, end = '\n')

mschool_map = folium.Map(location=[37.55,126.98], 
                         tiles='Stamen Terrain', 
                         zoom_start=12)
for name, lat, lng in zip(df.학교명, df.위도, df.경도):
    folium.CircleMarker([lat, lng],
                        radius=5,              # 원의 반지름
                        color='brown',         # 원의 둘레 색상
                        fill=True,
                        fill_color='coral',    # 원을 채우는 색
                        fill_opacity=0.7,      # 투명도    
                        popup=name).add_to(mschool_map)

mschool_map.save(filepath + 'mschool_location.html')

# One-hot encoding
from sklearn import preprocessing    

label_encoder = preprocessing.LabelEncoder()     # label encoder 생성
onehot_encoder = preprocessing.OneHotEncoder()   # one hot encoder 생성

onehot_location = label_encoder.fit_transform(df['지역'])
onehot_code = label_encoder.fit_transform(df['코드'])
onehot_type = label_encoder.fit_transform(df['유형'])
onehot_day = label_encoder.fit_transform(df['주야'])

df['location'] = onehot_location
df['code'] = onehot_code
df['type'] = onehot_type
df['day'] = onehot_day

print(df.head())   
print('\n')

# DBSCAN 
from sklearn import cluster

# Choose Data
columns_list = [9, 10, 13]
X = df.iloc[:, columns_list]
print(X[:5])
print('\n')

# Normalization
X = preprocessing.StandardScaler().fit(X).transform(X)
dbm = cluster.DBSCAN(eps=0.2, min_samples=5)
dbm.fit(X)

cluster_label = dbm.labels_   
print(cluster_label)
print('\n')

df['Cluster'] = cluster_label
print(df.head())   
print('\n')

# Grouping
grouped_cols = [0, 1, 3] + columns_list
grouped = df.groupby('Cluster')
for key, group in grouped:
    print('* key :', key)
    print('* number :', len(group))    
    print(group.iloc[:, grouped_cols].head())
    print('\n')

colors = {-1:'gray', 0:'coral', 1:'blue', 2:'green', 3:'red', 4:'purple', 
          5:'orange', 6:'brown', 7:'brick', 8:'yellow', 9:'magenta', 10:'cyan',
          11: 'white'}

cluster_map = folium.Map(location=[37.55,126.98], 
                         tiles='Stamen Terrain', 
                         zoom_start=12)

for name, lat, lng, clus in zip(df.학교명, df.위도, df.경도, df.Cluster):  
    folium.CircleMarker([lat, lng],
                        radius=5,                   # 원의 반지름
                        color=colors[clus],         # 원의 둘레 색상
                        fill=True,
                        fill_color=colors[clus],    # 원을 채우는 색
                        fill_opacity=0.7,           # 투명도    
                        popup=name
    ).add_to(cluster_map)

cluster_map.save(filepath + 'mschool_cluster.html')

이 코드를 돌려보면 지도 위에 클러스터 별로 다른색으로 표시되네요-_-

다른 할 일이 생겨 오늘은 여기서 이만-_-

반응형
LIST