K평균 클러스터링(K-Means Clustering)
클러스터링이란 데이터에 주어진 레이블이 주어지지 않은 경우에, 데이터 간의 유사도를 판별하여 데이터를 그룹 별로 나누는 것을 말한다. K평균 알고리즘은 n개의 d차원 입력 데이터가 주어졌을 때, n개의 데이터를 k개의 집합으로 분할하여, 최종적으로는 각 그룹의 중심점-데이터 간의 거리의 제곱합의 최소화를 하는 알고리즘이다. 각 데이터 점 사이의 거리는 유클리드 거리를 사용한다.
K 평균 알고리즘의 흐름은 다음과 같다.
- 각 데이터와 클러스터의 중심 까지의 거리를 계산해 각 클러스터에 데이터를 할당한다
- 각 클러스터의 무게중심을 재설정 한다
- 클러스터의 변화가 존재하지 않을때까지 반복한다
K평균 알고리즘은 초기에 클러스터의 무게중심을 설정하는 방법에 따라 성능이 바뀐다. 초기화 기법으로는 각 데이터를 임의의 클러스터에 할당하는 랜덤 파티션 기법과, 임의의 k개의 데이터 점을 초기 무게중심으로 설정하는 Forgy기법이 존재한다. 이번 코드에서는 Forgy기법을 이용하여 초기화 하도록 한다.
import math
import random
def Euclidean_Distance(p:list, q:list)->float:
summation = 0
if len(p) != len(q):
raise ValueError
for x,y in zip(p,q):
summation += (x-y)**2
return math.sqrt(summation)
def Allocate_Cluster(input_data:list, centroid:list)->int:
distance_list = []
for center in centroid:
distance_list.append(Euclidean_Distance(input_data,center))
return distance_list.index(min(distance_list))
def Update_centroid(cluster:list)->list:
new_centroid = []
m = 0
for group in cluster:
tmp = []
if len(group) == 0:
pass
else:
for x in range(len(group[0])):
for i in range(len(group)):
m += group[i][x]
tmp.append(m/len(group))
new_centroid.append(tmp)
return new_centroid
def k_nearest_clustering(k:int, input_data:list, option="Forgy"):
clustered = False
if option == "Forgy":
centroid = random.sample(input_data,k)
new_cluster = [[] for _ in centroid]
while not clustered:
cluster = [[] for _ in centroid]
for data in input_data:
cluster[Allocate_Cluster(data,centroid)].append(data)
if cluster == new_cluster:
return centroid
else:
new_cluster = cluster
centroid = Update_centroid(cluster)
'파이썬으로 배우는 인공지능' 카테고리의 다른 글
| 의사결정 트리(Decision Trees) (0) | 2018.12.17 |
|---|---|
| 서포트 벡터 머신(Support Vector Machine) (1) | 2018.12.16 |
| 나이브 베이즈 분류기 (1) | 2018.11.29 |
| 로지스틱 회귀 분류기 (0) | 2018.11.24 |
| 데이터 전처리 (0) | 2018.11.22 |
WRITTEN BY
- 텐초
딥러닝 관련 논문들과 코드를 완벽분석 합니다
,




