1. K-Means

- Expectation과 Maximization을 중심점 값이 최적값으로 고정될 때까지 반복

- 클러스터링으로 군집을 모으고 가장 각 클러스터에서 가장 중요한 값을 토픽으로 찾는다.

 

 

2. 실습

1) 랜덤 좌표값, 랜덤 중심 좌표값 생성

# K-Means
# rnk, muk(random) => Parameter, K => HypterParamater
# data = point = instance => Random(N)

from random import randrange

K = 3
N = 100 #[[?, ?], [], []]

centroid = list()
for i in range(K): # 랜덤 중심점 좌표 K개 만큼 생성
    centroid.append((randrange(1, 100), randrange(1, 100)))
    
data = list()
for i in range(N): # 랜덤 좌표 N개 만큼 생성
    data.append((randrange(1, 100), randrange(1, 100)))

 

 

2) 그리기

import matplotlib.pyplot as plt

colorMap = ['r', 'g', 'b', 'k']
for _ in data:
    plt.scatter(_[0], _[1], facecolor='none', alpha=.5, edgecolor=colorMap[-1])
    
for i, _ in enumerate(centroid):
    plt.scatter(_[0], _[1], color=colorMap[i])
plt.show()

 

3) 두 점 간의 거리, 각도 계산

from math import sqrt
def distance(x1, x2):
    return sqrt((x1[0]-x2[0]) ** 2 + (x1[1]-x2[1])**2)


def angle(x1, x2):
    return (x1[0]*x2[0] + x1[1]*x2[1]) / (distance(x1,(0,0)) * (distance(x2,(0,0))))

 

 

4) 각 좌표의 클러스터링 집합 결정

# EM Algorithm
# E-Expectation = rnk assignement => distance
# M-Maximization = centroid update
def expectation(x, c):
    candidates = list()
    rnk = list() # => [0,0,1]
    for _ in c:
        candidates.append(distance(x, _))
    return candidates.index(min(candidates))

 

 

5) 새로운 중심 좌표 값 계산

# 클러스터 내 데이터 좌표의 합 / 클러스터 내 데이터 갯수
def maximization(X):
    return (sum([x[0] for x in X])/len(X), sum([x[1] for x in X])/len(X))

 

6) 클러스터링 해보기

rnk = list(list(0 for _ in range(K)) for _ in range(N)) # 빈 공간 생성(각 클러스터에 소속 가능한 갯수만큼 초기값 0

for i in range(N):
    j = expectation(data[i], centroid)
    rnk[i][j] = 1

rnk

 

7) 새로운 리스트 만들고 재귀적으로 실행

rnk = list(list(0 for _ in range(K)) for _ in range(N)) # 빈 공간 생성(각 클러스터에 소속 가능한 갯수만큼 초기값 0
for i in range(N):
    j = expectation(data[i], centroid)
    rnk[i][j] = 1
    
for k in range(K):
    X = [data[i] for i in range(N) if rnk[i][k]]
    print(centroid[k])
    centroid[k] = maximization(X)
    print(centroid[k])
    print()

 

8) 그리기

import matplotlib.pyplot as plt

colorMap = ['r', 'g', 'b', 'k']
for i in range(N):
    plt.scatter(data[i][0], data[i][1], facecolor='none', alpha=.5, edgecolor=colorMap[rnk[i].index(max(rnk[i]))])
    
for i, _ in enumerate(centroid):
    plt.scatter(_[0], _[1], color=colorMap[i])
plt.show()

 

 

[3번 실행해서 찍어준 결과]

 

 

 

9) 각 점들과 중심간의 거리의 합 구하기

def sse(X, c):
    error = 0
    for x in X:
        error += distance(x, c)
    return error

 

10) 10번 반복하고 오차율 변화 살펴보기

errorRate = list()
for _ in range(10):
    rnk = list(list(0 for _ in range(K)) for _ in range(N)) # 빈 공간 생성(각 클러스터에 소속 가능한 갯수만큼 초기값 0
    for i in range(N):
        j = expectation(data[i], centroid)
        rnk[i][j] = 1
    _sse = 0
    for k in range(K):
        X = [data[i] for i in range(N) if rnk[i][k]]
        _sse += sse(X, centroid[k])
        centroid[k] = maximization(X)
    errorRate.append(_sse)
    

plt.plot(range(10), errorRate, "r-")
plt.show()

 

 

11) angle로 할 때 주의사항

- Angle에서는 expectation가 min이 아닌 Max로만 바뀌면 된다.

'데이터 분석가 역량' 카테고리의 다른 글

day 28 ] 성능평가  (0) 2019.06.11
Day 27 ] 기사 분류  (0) 2019.06.10
Day 25 ] Naive Bayes  (0) 2019.06.05
Day 22 ] Classification  (0) 2019.05.30
Day 21 ] Project2 유사도 분석  (0) 2019.05.29

+ Recent posts