728x90
반응형
k- means 군집 분석의 특징
- 연속형 변수에 활용 가능
- 초기 중심값은 임의로 선택가능
- 장점 : 알고리즘 단순, 빠름, 계층보다 많은 데이터 가능
- 단점 : 군집 수 , 가중치 ,거리 정의 어렵, 결과 해석 어렵, 이상값 영향 큼
from sklearn.datasets import make_blobs # 가상의 데이터셋을 만들어주는 함수
# 필요 데이터 로딩
import pandas as pd
import numpy as np
import math
import scipy as sp
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_palette("Set2")
# make_blobx : 보통 클러스링 용 가상데이터를 생성하는데 사용하는 함수
## n_samples : sample 수 ,
## n_features : 독립변수의 수 default : 20
## centers : 생성할 클러스터의 수 혹은 중심
## x : [n_samples,n_features] 크기의 배열 ( 독립변수 )
## y : [n_samples] 크기의 배열 ( 종속변수 )
x,y = make_blobs (n_samples = 100, centers = 4 , n_features = 2 , random_state = 6)
points = pd.DataFrame(x,y).reset_index(drop = True) ## 왚의 열을 가져온다.
points.columns = ["x","y"]
x
#### step 1 . k 값 설정하기
# 만든 데이터 셋을 scatter plot으로 그려봄
# 데이터 결과를 보면 대충 4개의 군집이 적당할 것 같음
sns.scatterplot(x = "x", y = "y", data = points, palette= "Set2")
#### step 2 . 중심점 (Centroid) 구하기
# 클러스터의 중심점은 각 cluster의 x 좌표의 평균과 y좌표의 평균이 된다.
# 클러스팅 시작 전에는 클러스터가 생성되지 않아 중심점을 구할 수 없기 때문에 전체 데이터 중에서 k = 4 로 임시로 데이터를 sample 추출하여 중심점으로 활용한다.
centroids = points.sample(4, random_state=1)
centroids
#### step 3 . 각 중심점으로부터의 거리를 구해 가까운 중심점의 cluster로 할당하기
# 각 데이터에 대하여 각 중심점과의 유클리드 거리 계산
# 100 * 4 --> 4개의 중심점과 거리
distance = sp.spatial.distance.cdist(points, centroids, "euclidean")
# 가장 거리가 짧은 중심점의 cluster로 할당
cluster_num = np.argmin(distance, axis = 1 ) # 최솟값 색인의 위치를 반환한다.
cluster_num
# 결과 확인
results = points.copy ()
results["cluster"] = np.array (cluster_num)
results.head()
#### step 4 . 그래프로 군집확인
sns.scatterplot(x="x", y="y", hue="cluster", data=results, palette="Set2");
# 잘분류된 cluster도 있고 아닌 것도 있다.
### step 45 변경된 cluster에 대해서 중심점 구하기
# x좌표의 평균과 y 좌표의 평균으로 다시 중심점 계산
centroids_2 = results.groupby ("cluster").mean()
centroids_2
distance2 = sp.spatial.distance.cdist(points, centroids_2, "euclidean")
cluster_num_2 = np.argmin(distance2, axis = 1 ) # 최솟값 색인의 위치를 반환한다.
cluster_num_2
results_2 = points.copy ()
results_2["cluster"] = np.array (cluster_num_2)
results_2.head()
sns.scatterplot(x="x", y="y", hue="cluster", data=results_2, palette="Set2");
# 2번째 결과
results_2.tail()
### step 6. 반복해서 시도
# x좌표의 평균과 y 좌표의 평균으로 다시 중심점 계산
centroids_4 = results_3.groupby ("cluster").mean()
centroids_4
distance4 = sp.spatial.distance.cdist(points, centroids_4, "euclidean")
cluster_num_4 = np.argmin(distance4, axis = 1 ) # 최솟값 색인의 위치를 반환한다.
results_4 = points.copy ()
results_4["cluster"] = np.array (cluster_num_4)
sns.scatterplot(x="x", y="y", hue="cluster", data=results_4, palette="Set2");
4번째, 5번째 수행 차이 별로 없어서 실행 종료
### 수동으로 하지 말고 Scikit - Learn 을 이용해보자
Scikit - Learn 에서 k-means clustering 관련 함수를 제공한다.
from sklearn.cluster import KMeans
# k-means clustering 실행
kmeans = KMeans(n_clusters=4)
kmeans.fit(points)
# 결과 확인
result_by_sklearn = points.copy()
result_by_sklearn["cluster"] = kmeans.labels_
result_by_sklearn.head()
sns.scatterplot(x="x", y="y", hue="cluster", data=result_by_sklearn, palette="Set2");
출처 :
반응형