반응형
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
'Machine Learning' 카테고리의 다른 글
[Machine Learning] 군집(Clustering)_1 (0) | 2019.11.24 |
---|---|
[Machine Learning] 분류(Classification)_3 (0) | 2019.11.23 |
[Machine Learning] 분류(Classification)_2 (0) | 2019.11.23 |
[Machine Learning] 분류(Classification)_1 (0) | 2019.11.11 |
[Machine Learning] 회귀분석(Regression)_3 (0) | 2019.11.07 |