머신러닝에서 K-평균 클러스터링 알고리즘 이해하기
K-평균 클러스터링 또는 K-평균 알고리즘 또는 K-평균 클러스터링 알고리즘—자, 클러스터링 알고리즘이 무엇인지 자세히 살펴보기 전에, 현대 기업이 데이터를 이해하는 데 이것들이 얼마나 필수적인지 이해해야 합니다—제품에 대한 데이터, 고객에 대한 데이터, 거래에 대한 데이터 등입니다.
기술이 비즈니스 환경을 재정의하는 세상에서, 기업들은 더 효율적이 되고 수익을 높이는 데 도움이 되는 패턴을 개발하기 위해 데이터를 분석하는 데 수백만 달러를 지출합니다. 속성을 기반으로 객체를 함께 그룹화하는 것은 이러한 패턴을 도출하는 과정에서 수반되는 첫 번째 작업 중 하나입니다.
객체를 그룹화하면 기업이 다양한 상황에 대한 다양한 전략을 설계하는 데 도움이 됩니다. 고객, 제품, 거래는 이러한 과정에서 핵심적인 관심 대상입니다. 고객의 행동을 기반으로 고객을 그룹화하면 기업은 개인화된 제안을 설계할 수 있습니다. 제품을 그룹화하면 고객에게 대체 선택지를 제공하는 데 도움이 됩니다. 그리고 거래를 그룹화하면 더 면밀한 주의가 필요한 비정상적인 패턴을 식별하는 데 도움이 됩니다.
여기서 클러스터링이 등장합니다. 클러스터링은 속성을 기반으로 객체를 그룹화하는 비지도 머신러닝(ML) 알고리즘입니다.
프로덕션 준비가 된 AI를 위한 선도적인 벡터 데이터베이스 회사인 Zilliz의 이 종합적인 글에서는 머신러닝에서 K-평균 클러스터링 알고리즘이 무엇인지, 그리고 Python을 사용해 이를 구현하는 방법을 깊이 있게 다룹니다. 또한 K-평균 클러스터링 알고리즘을 언제 사용해야 하는지 살펴보고 실제 K-평균 클러스터링 예제를 제공합니다.
클러스터링이란 무엇인가요?
클러스터링은 특정 그룹의 각 요소가 다른 그룹의 요소보다 해당 그룹의 요소와 더 유사하도록 데이터 포인트를 그룹화하는 과정입니다. 클러스터링은 특정 알고리즘을 가리키지 않습니다. 이는 여러 알고리즘을 사용해 해결할 수 있는 일반적인 작업입니다. 클러스터링 알고리즘은 일반적으로 유사성을 체계적으로 정량화하기 위한 메트릭을 정의합니다. 클러스터링은 이미지 처리, 정보 검색, 추천 엔진, 데이터 압축 등 여러 분야에서 사용됩니다.
클러스터링은 클러스터링하는 객체의 속성을 기반으로 유사성을 설정합니다. 속성은 도메인에 따라 다릅니다. 예를 들어, 이미지의 경우 속성은 픽셀 값입니다. 사용자 프로필의 경우 속성은 나이, 성별, 구매 이력과 같은 세부 정보입니다. 제품의 경우 속성은 카테고리, 색상, 가격 등입니다. 클러스터링은 레이블이 지정된 데이터를 준비하는 사용자 모니터링 학습 과정이 없기 때문에 비지도 작업이라고 불립니다.
클러스터링 알고리즘은 어떻게 작동하나요?
대부분의 클러스터링 알고리즘은 모든 샘플 쌍 간의 유사성을 계산하여 작동합니다. 각 데이터 포인트는 거리 계산을 기반으로 가장 가까운 중심점에 할당되며, 이는 클러스터링 과정의 기본 단계입니다.
문제에 대한 클러스터링 알고리즘을 결정할 때 데이터 세트의 규모에 맞게 확장할 수 있는 능력은 고려해야 할 필수 요소입니다. 실행 시간은 요소 쌍의 수와 함께 증가합니다. 극단적인 경우에는 데이터 양의 제곱에 비례하여 달라질 수 있습니다.
클러스터링에 대한 네 가지 접근 방식
클러스터링에는 중심점 기반, 밀도 기반, 계층적, 분포 기반의 네 가지 일반적인 접근 방식이 있습니다. 하나씩 살펴보겠습니다.
1. 중심점 기반 클러스터링
이 방법은 클러스터 내 모든 데이터 포인트의 중심점을 기준으로 계층 구조 없이 데이터 포인트를 개별 클러스터로 구성합니다. 중심점은 객체의 기하학적 중심입니다. 간단히 말해, n차원 공간에서 해당 객체를 구성하는 모든 점의 산술 평균입니다. 여기서 클러스터는 중심점 주변에 위치한 점들의 모음입니다. 중심점 기반 클러스터링은 초기 할당 및 이상치와 관련된 문제를 겪습니다.
2. 밀도 기반 클러스터링
이름에서 알 수 있듯이, 이는 한 영역에서 점들의 밀도를 계산한 다음 높은 밀도가 발견되는 곳마다 데이터 포인트를 클러스터에 할당합니다. 이 경우 클러스터는 어떤 형태도 취할 수 있습니다. 밀도 기반 클러스터링은 데이터가 본질적으로 밀도에서 높은 분산을 가질 때 문제에 직면합니다. 데이터 차원이 높을 때는 클러스터와 인접 클러스터를 구분하는 데 어려움을 겪을 수 있으므로 잘 수행되지 않습니다.
3. 계층적 클러스터링
이 방법은 더 큰 클러스터 안에 위치한 클러스터가 있을 가능성을 포함해 클러스터의 트리를 제공합니다. 이 방법은 데이터가 본질적인 계층 구조를 보일 때 잘 맞습니다. 계층적 클러스터링은 실행 후 분석가가 필요한 지점에서 트리를 끊고 그 지점 이후의 클러스터만 고려할 수 있으므로 서로 다른 클러스터의 수를 원하는 대로 선택할 수 있게 해줍니다.
4. 분포 기반 클러스터링
이 방법은 클러스터를 찾기 위해 확률 분포의 개념을 사용합니다. 이는 클러스터 중심에서의 거리가 증가할 때 한 점이 클러스터에 속할 확률이 감소한다고 가정합니다. 개발자는 이 방법을 효과적으로 사용하려면 데이터의 분포를 알고 있어야 합니다.
K-means 클러스터링이란 무엇인가요?
K-means 클러스터링 알고리즘은 중심점 기반 클러스터링 알고리즘입니다. 레이블이 지정된 데이터에 의존하지 않으므로 비지도 학습 알고리즘입니다. K-means 클러스터링 알고리즘에서 ‘K’는 클러스터의 수를 나타냅니다.
K-means는 수렴하기 전에 평균 또는 중심점을 여러 번 계산하는 반복 알고리즘입니다. 수렴 시간은 초기 할당과 사용된 최적의 클러스터 수에 따라 달라집니다. 일반적으로 K-means의 시간 복잡도는
여기서 d는 차원의 수, k는 클러스터의 수, n은 데이터 요소의 k개 클러스터 수입니다.
K-means 클러스터링 알고리즘은 각 데이터 요소가 클러스터의 기하학적 중심으로부터 떨어진 거리를 계산하여 작동합니다. 그런 다음 특정 클러스터에 속한 점이 다른 클러스터의 중심점에 더 가까운 것으로 확인되면 클러스터를 재구성합니다. 그 후 클러스터 중심점을 다시 계산하고 더 이상의 클러스터 재할당이 없을 때까지 이 과정을 반복합니다.
알고리즘이 어떻게 작동하는지 살펴보겠습니다.
K-means 클러스터링 알고리즘은 어떻게 작동하나요?
K-means 클러스터링 알고리즘은 네 가지 주요 단계를 포함하는 반복 프로세스입니다. 이러한 단계를 이해하기 위해 2차원 클러스터링 문제를 고려해 보겠습니다. 점들이 (x1,y1),(x2,y2) 등이라고 가정해 보겠습니다. 클러스터 크기를 2로 시작해 보겠습니다.
초기 할당
이 단계는 각 점을 임의의 클러스터에 할당합니다. 한 가지 옵션은 임의의 점을 클러스터 중심점으로 할당하고 각 데이터 포인트와 중심점 사이의 거리를 계산하는 것입니다.
점들은 자신에게 가장 가까운 중심점을 가진 클러스터에 할당됩니다. 두 클러스터 사이의 거리는 유클리드 거리 공식을 사용하여 계산됩니다. 예를 들어 x3,y3이 임의로 할당된 중심점 중 하나라면, 이 공식을 사용하여 x1,y1과 x3,y3 사이의 거리를 계산할 수 있습니다:
Y vs. X
Y vs. X
빨간색과 초록색 점은 초기 임의 중심점 할당을 나타냅니다. 이러한 초기 클러스터 중심점만을 기반으로 하면, 초기 클러스터 할당은 아래와 같이 나타납니다:
Y vs. X
Y vs. X
중심점 계산
이 단계에서는 각 클러스터의 중심점을 다시 계산합니다. 클러스터의 중심점은 해당 클러스터에 있는 모든 요소의 산술 평균을 사용하여 계산됩니다. 예를 들어 x1,y1, x2,y2, x3,y3이 하나의 클러스터에 속한다고 해 보겠습니다. 해당 클러스터의 중심점은 다음과 같이 계산됩니다:
아래에 표시된 것처럼 다이아몬드 모양의 점들이 새로운 중심점이 됩니다.
Y vs. X
Y vs. X
클러스터 재할당
세 클러스터 모두에 대한 새로운 중심점을 찾으면, 각 점과 새로운 중심점 사이의 거리를 다시 계산합니다. 어떤 점이 현재 할당된 클러스터의 중심점보다 다른 클러스터의 중심점에 더 가깝게 위치한 경우, 해당 점들은 재할당됩니다.
Y vs. X
Y vs. X
수렴
클러스터를 재할당한 후, 중심점을 다시 계산하고 이 과정이 반복됩니다. 중심점 계산과 클러스터 재할당은 더 이상 새로운 재할당이 없을 때까지 실행됩니다. 이 경우 수렴된 클러스터링 작업은 아래와 같이 나타납니다:
Y vs. X
Y vs. X
클러스터 수 선택
이상적인 클러스터 수를 선택하기 위해 일반적으로 사용되는 두 가지 방법은 엘보 방법과 실루엣 방법입니다.
엘보 방법
엘보 방법은 WCSS(Within Cluster Sum of Squares)라는 지표를 계산합니다. WCSS는 각 점이 위에서 가장 가까운 클러스터의 중심점으로부터 떨어진 거리의 제곱합입니다. 클러스터 수에 따른 WCSS의 그래프는 최적의 클러스터 수를 선택하기 위한 지표로 사용됩니다.
개발자는 클러스터 수를 1부터 n까지 설정하여 K-means 클러스터링을 실행한 다음, 각 실행에 대해 WCSS를 계산합니다. WCSS는 단일 클러스터 실행에서 가장 높고, 클러스터 수가 증가하면 감소합니다. WCSS가 팔의 팔꿈치처럼 급격히 꺾이는 지점이 이상적인 최적 클러스터 수로 간주됩니다.
Elbow Method
엘보 방법
실루엣 방법
이 방법은 객체가 같은 클러스터의 다른 구성원들과 얼마나 유사한지, 그리고 객체가 다른 클러스터와 얼마나 분리되어 있는지를 이해하려고 합니다. 한 점의 실루엣 점수는 해당 점과 클러스터 내 다른 점들 사이의 평균 거리(a)와, 인접 클러스터를 포함하여 다른 클러스터에 속한 모든 점들과 해당 점 사이의 평균 거리(b)를 결합하여 계산됩니다. a와 b가 구해지면, 한 점의 실루엣 점수는 다음과 같이 계산됩니다
그런 다음 각 점의 점수를 평균하여 실루엣 점수를 구합니다. 점수는 최적 개수의 모든 후보에 대해 계산되며, 그중 k개의 점과 가장 높은 점수를 가진 것이 최적 개수로 선택됩니다.
Silhouette Method
실루엣 방법
K-means 클러스터링 알고리즘의 실제 예시(Python으로 K-means 클러스터링 구현)
이 튜토리얼은 Python을 사용하여 K-means 클러스터링을 구현하고 최적의 클러스터 크기를 찾는 방법을 보여줍니다. 이를 위해 전자상거래 도메인에서 흔한 문제 정의를 가정해 보겠습니다. 고객의 인구통계학적 속성과 지출 습관을 기반으로 고객을 클러스터링하는 것은 전자상거래 도메인에서 흔한 작업입니다. K-means 클러스터링 예제를 단순화하기 위해 여기서는 고객의 나이와 월평균 지출액이라는 두 가지 속성을 사용하겠습니다.
- 이를 위해 scikit-learn이라는 Python 머신 러닝 라이브러리와 matplotlib이라는 플로팅 라이브러리를 사용해 보겠습니다. 먼저 아래에 제공된 import 문을 사용하여 라이브러리를 초기화합니다:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette\_score
from sklearn.preprocessing import StandardScaler
- 다음 단계는 입력 데이터 프레임을 정의하는 것입니다. 여기서 첫 번째 속성은 나이이고 두 번째 속성은 인도 루피(INR) 기준 평균 월 지출액입니다. 단순화를 위해 코드 자체에서 배열을 초기화하겠습니다. 여기에는 16개의 데이터 포인트가 있습니다:
raw\_features = np.array([[22,200],[24,200],[24,200],[20,800],[24,800],[24,800],[25,200],[54,200],[24,200],[54,200],[50,800],[53,800],[24,800],[55,800],[53,800],[50,800]])
- 그런 다음 데이터 포인트를 정규화하여 한 속성의 변동이 다른 속성의 변동을 압도하지 않도록 합니다.
scaler = StandardScaler()
features = scaler.fit\_transform(raw\_features)
- 클러스터 수를 2에서 6까지 변화시키며 K-means 클러스터링을 시도하는 for 루프를 구현합니다. 그런 다음 제곱합을 계산하고 이를 클러스터 수에 대해 플로팅하여 최적의 클러스터 수를 식별합니다.
sse = []
s\_scores=[]
for i in range(2,6):
kmeans = KMeans(init = **"random"** ,n\_clusters = i,n\_init = 10,max\_iter = 300,random\_state = 42)
kmeans.fit(features)
sse.append(kmeans.inertia\_)
s\_scores.append(silhouette\_score(features, kmeans.labels\_))
- matplotlib 라이브러리를 사용하여 제곱합을 클러스터 수에 대해 플로팅합니다.
plt.style.use( **"fivethirtyeight"** )
plt.plot(range(1, 6), sse)
plt.xticks(range(1, 6))
plt.xlabel( **"Number of Clusters"** )
plt.ylabel( **"SSE"** )
plt.show()
- 위 코드를 실행하면 최적의 클러스터 수를 식별하는 데 사용할 수 있는 플롯이 생성됩니다.
K-means 클러스터링
K-means 클러스터링 알고리즘
위 산점도는 4에서 뚜렷한 '엘보'를 보여줍니다. 따라서 여기서 최적의 클러스터 수는 4입니다. 도메인 지식이 있다면 데이터 과학자는 이 숫자를 네 가지 조합, 즉 저연령 고지출, 저연령 저지출, 고연령 고지출, 고연령 저지출 고객으로 설명할 수 있습니다. 하지만 이러한 설명이 항상 가능한 것은 아니며, 최적의 클러스터 수는 문제 사양에 따라 달라집니다.
이것이 Python에서 K-means 클러스터링을 실행하는 전부입니다. scikit-learn 및 matplotlib 프레임워크를 사용하면 Python에서 클러스터링을 매우 쉽게 사용할 수 있습니다.
K-Means 클러스터링 알고리즘을 사용해야 하는 경우
앞서 배웠듯이, 클러스터링은 유사성을 기반으로 객체를 그룹화하는 데 도움이 되는 비지도 머신 러닝 알고리즘입니다. 이는 탐색적 데이터 분석을 위해 많은 산업 분야에서 널리 사용됩니다.
고객 세분화, 추천 엔진, 유사도 검색과 같은 영역에서 유용합니다. 그렇지만 K-means 클러스터링 알고리즘이 이러한 문제를 해결하는 데 사용할 수 있는 유일한 기법은 아닙니다. 이러한 문제를 해결하는 또 다른 방법은 각 객체의 속성을 기반으로 벡터 임베딩을 생성하는 것입니다.
딥 러닝 기반 학습 네트워크는 많은 수의 속성을 가진 객체에 대해 다차원 임베딩을 생성할 수 있습니다. 이러한 임베딩은 좋은 벡터 데이터베이스와 결합되어 유사성 기반 문제를 훨씬 더 잘 제어하며 해결할 수 있습니다.
이러한 문제를 다루고 있다면 Zilliz를 확인해 보세요. 특히 벡터 유사도 검색을 활용하는 AI/ML 애플리케이션을 구축하는 기업을 위해 비정형 데이터 처리의 과제에 대한 원스톱 솔루션을 제공합니다.
Zilliz는 전 세계 천 개 이상의 엔터프라이즈 사용자에게 널리 인정받는 인기 있는 오픈 소스 벡터 데이터베이스인 Milvus를 만들었습니다. 또한 이 회사는 엔터프라이즈가 인프라를 구축하고 관리하는 번거로움 없이 Milvus의 모든 성능을 경험할 수 있도록 지원하는 완전 관리형 벡터 데이터베이스 서비스인 Zilliz Cloud도 제공합니다.
벡터 데이터베이스란 무엇인가?가 궁금하다면, 심층 가이드를 확인해 보세요. 관련 주제에 대한 더 많은 정보를 찾고 계신가요? Approximate Nearest Neighbor Search (ANNS)에 대한 이 설명을 확인해 보세요. Zilliz가 어떻게 도움을 줄 수 있는지 더 알고 싶으신가요? 여기를 클릭해서 문의하기만 하면 됩니다!
계속 읽기

Zilliz Cloud Now Available in AWS Europe (Ireland)
Zilliz Cloud launches in AWS eu-west-1 (Ireland) — bringing low-latency vector search, EU data residency, and full GDPR-ready infrastructure to European AI teams. Now live across 30 regions on five cloud providers.

Milvus 2.6.x Now Generally Available on Zilliz Cloud, Making Vector Search Faster, Smarter, and More Cost-Efficient for Production AI
Milvus 2.6.x is now GA on Zilliz Cloud, delivering faster vector search, smarter hybrid queries, and lower costs for production RAG and AI applications.

Will Amazon S3 Vectors Kill Vector Databases—or Save Them?
AWS S3 Vectors aims for 90% cost savings for vector storage. But will it kill vectordbs like Milvus? A deep dive into costs, limits, and the future of tiered storage.



