반응형
[파이썬] k-means clustering with numpy. 넘파이를 사용한 kmeans 클러스터 수행¶
In [1]:
import numpy as np
from collections import defaultdict
200개 데이터를 대상으로 3개 클러스터 생성을 위해 k-mean 클러스터 기법을 사용합니다.¶
step 0 : 200개 데이터 생성하고 클러스터 갯수 정의합니다.
In [2]:
N = 200
data1 = np.random.randn(N//3,2) + np.array([5,6])
data2 = np.random.randn(N//3,2) + np.array([-5,-6])
data3 = np.random.randn(N//3,2) + np.array([-10,3])
data = np.concatenate((data1, data2, data3))
K=3
step 1 : 200개의 데이터 각각에 무작위로 클러스터 번호를 할당합니다. 3개의 클러스터를 정의하였기 때문에, 0, 1, 2 로 할당 됩니다.
In [3]:
class point():
def __init__(self, data):
self.data = data
self.k = np.random.randint(0,K)
def __repr__(self):
return str({"data":self.data, "k":self.k})
points = [point(d) for d in data]
points[:3]
Out[3]:
[{'data': array([4.60683228, 4.94883263]), 'k': 0}, {'data': array([5.75110025, 3.94652743]), 'k': 2}, {'data': array([4.11672573, 5.87773725]), 'k': 2}]
step 2 : 할당된 번호를 별 데이터를 정리합니다.
In [4]:
def make_k_mapping(points):
# 타입이 리스트로 고정된 dict 생성
point_dict = defaultdict(list)
for p in points:
point_dict[p.k] = point_dict[p.k] + [p.data]
return point_dict
point_dict = make_k_mapping(points)
step 3 : 각 번호별 데이터의 평균을 계산합니다. 총 3개의 클러스트를 설정하였기 때문에 총 3개의 평균값이 도출 됩니다.
In [5]:
def calc_k_means(point_dict):
means = [np.mean(point_dict[k],axis=0) for k in range(K)]
return means
means = calc_k_means(point_dict)
means
Out[5]:
[array([-4.05381658, 0.88981764]), array([-3.13816701, 1.31788105]), array([-2.97362954, 0.80863065])]
step 4 : 모든 데이터를 대상으로 각 평균과의 거리를 계산 합니다. 총 3개의 거리를 도출하고 그중 평균과 거리가 가장 가까운 번호를 찾아 데이터를 다시 할당 합니다.
In [6]:
def update_k(points,means):
for p in points:
dists = [np.linalg.norm(means[k]-p.data) for k in range(K)]
p.k = np.argmin(dists)
In [7]:
update_k(points, means)
step 5: 다시 할당된 클러스터 번호를 이용하여 평균을 산출 하는 것부터 반복하여 결과를 정교화 합니다.
In [8]:
def fit(points, epochs=10):
for e in range(epochs):
point_dict = make_k_mapping(points)
means = calc_k_means(point_dict)
update_k(points, means)
return means, points
In [9]:
means, points = fit(points)
반응형
'python' 카테고리의 다른 글
chatGPT 로 real-time graph 그리기 matplotlib.animation (0) | 2023.02.15 |
---|---|
python append 파이썬 리스트 값 추가 (0) | 2023.02.14 |
pandas 의 numpy nan 값을 파이썬 None으로 전환하기(db에 넣을때 유용, numpy where) (0) | 2023.02.14 |
넘파이, 파이썬 어레이 0보다 큰 값 찾기(numpy array masking) (0) | 2023.02.06 |
plotly.express 그래프 그리기 (막대 그래프, 점 그래프, 라인 그래프, 파이 그래프) plotly 그래프 (0) | 2023.02.05 |
댓글