스펙트럴 클러스터링(Spectral Clustering)이란? AI에서 그래프의 연결 구조로 데이터를 묶는 방법
TL;DR
스펙트럴 클러스터링은 데이터 사이의 유사도를 그래프로 나타내고, 그래프 라플라시안의 고유벡터로 만든 좌표에서 군집을 찾는 방법입니다. 중심점 하나로 설명하기 어려운 곡선형 묶음이나 연결망을 나눌 때 검토합니다. 같은 데이터도 이웃 연결과 유사도 계산에 따라 결과가 달라집니다. 군집 수, 거리와 유사도의 구분, 연결이 끊긴 그래프와 계산 비용을 함께 확인해야 합니다.
핵심 3줄 요약
- 핵심 1
그래프의 연결을 봅니다. 사례를 점으로, 서로 비슷한 정도를 선의 가중치로 나타냅니다. 강하게 이어진 사례들이 같은 묶음이 되도록 찾습니다. - 핵심 2
새 좌표에서 군집을 정합니다. 라플라시안의 고유벡터로 데이터를 옮긴 뒤 K-means 같은 방법으로 라벨을 붙입니다. 원본 좌표에서 바로 묶는 것과 다릅니다. - 핵심 3
그래프 설계가 결과를 바꿉니다. 군집 수와 이웃 수, RBF 계수를 구분해 선택합니다. 결과 번호는 집단 이름이나 소속 확률이 아닙니다.
이 글에서 다룰 내용
- 스펙트럴 클러스터링의 한 문장 정의
- 두 문서 묶음과 약한 연결로 이해하는 예시
- 유사도 그래프·라플라시안·고유벡터의 역할
- 군집 수·이웃 수·라벨 배정 설정의 차이
- K-means·계층적 군집화·DBSCAN과의 비교
- 실전 활용과 입력·연결·재현성 점검 순서
- 거리 행렬·메모리·새 데이터 처리 주의점
스펙트럴 클러스터링을 한 문장으로 정의하면 무엇인가요?
스펙트럴 클러스터링(Spectral Clustering)은 유사도 그래프의 라플라시안에서 얻은 고유벡터를 이용해 사례를 낮은 차원의 좌표로 표현한 뒤 군집을 나누는 비지도학습 방법입니다.
한국어로 스펙트럴 군집화라고도 부릅니다. 여기서 스펙트럴은 색이나 음성의 주파수만을 가리키지 않습니다. 행렬의 고유값과 고유벡터를 이용한다는 뜻입니다. 입력은 일반적인 특징 행렬일 수도 있고 사례 사이의 연결을 이미 계산한 유사도 행렬일 수도 있습니다.
scikit-learn의 SpectralClustering은 정규화한 라플라시안의 투영을 이용합니다. 그래프를 만드는 단계와 그 그래프에서 군집을 꺼내는 단계를 나눠 이해하면 됩니다. 정답 라벨을 학습하는 분류 모델과 달리 주어진 사례들 안의 연결 구조를 탐색합니다.
한 줄 정리: 데이터의 위치만 보고 묶기 어려울 때, 서로 얼마나 연결돼 있는지를 새 좌표로 바꿔 군집을 찾습니다.
쉬운 예시로 이해해 볼까요?
AI 글 여섯 편을 정리한다고 가정해 보겠습니다. 세 편은 이미지 편집을 다루고 나머지 세 편은 음성 전사를 다룹니다. 문서 임베딩을 비교했더니 같은 주제 안에서는 유사도가 높고 두 주제 사이에는 약한 연결만 남았습니다. 이는 원리를 설명하기 위한 가상 사례입니다.
각 글을 그래프의 점으로 놓고 유사도가 높을수록 강한 선으로 연결합니다. 이미지 글과 음성 글 사이에 선이 하나 있다고 해서 곧바로 같은 군집으로 합치지는 않습니다. 묶음 안의 강한 연결과 묶음 사이의 약한 연결을 함께 살펴 나눌 후보를 찾습니다.
고유벡터로 만든 새 좌표에서 두 묶음이 구분되면 최종 라벨을 붙입니다. 이미지와 음성이라는 이름은 대표 글을 읽은 사람이 붙입니다. 알고리즘이 주제 이름을 이해하거나 실제 업무 분류의 정답을 증명한 것은 아닙니다.
쉬운 예시: 사람들의 자리 배치보다 자주 연락하는 관계를 보고 모임을 나누는 것과 비슷합니다. 어떤 관계를 선으로 기록했는지가 중요합니다.
왜 AI에서 스펙트럴 클러스터링이 중요한가요?
중심점으로 설명하기 어려운 모양을 다룹니다
K-means는 각 군집의 중심과 거리를 기준으로 사례를 배정합니다. 원이 서로 둘러싸거나 길게 휘어진 데이터는 중심만으로 분리하기 어렵습니다. 유사도 그래프가 이런 국소 연결을 잘 반영하면 스펙트럴 방법을 검토할 수 있습니다. 모든 복잡한 모양에서 자동으로 더 좋은 결과가 나오는 것은 아닙니다.
이미 계산한 관계를 입력으로 활용합니다
문서의 유사도나 대상 사이 연결 가중치를 이미 구했다면 이를 인접행렬 형태로 넣어 그래프를 나눌 수 있습니다. 원본 특징을 다시 중심점과 비교하는 대신 관계를 직접 분석합니다. 다만 일반적인 이 구현에 넣는 유사도는 음이 아닌 값이며 클수록 가까운 관계여야 합니다.
이미지의 이웃 영역을 나누는 데 쓰입니다
scikit-learn 공식 예제는 이미지를 연결된 픽셀의 그래프로 바꾸고 영역을 나눕니다. 공간상 이웃 관계와 밝기 변화가 가중치 설계에 쓰입니다. 이 예제는 물체 마스크 안에서 물체들을 서로 분리하는 상황이므로 배경까지 자동으로 찾아 제거했다고 해석하면 안 됩니다.
스펙트럴 클러스터링은 어떻게 작동하나요?
1. 사례 사이의 유사도 그래프를 만듭니다
RBF 커널을 쓰면 거리가 가까운 쌍에 큰 유사도를 줍니다. 최근접 이웃 방식을 쓰면 정한 수의 이웃과 연결한 그래프를 만듭니다. 같은 특징이라도 두 방식은 다른 그래프를 만들 수 있습니다. 특징의 단위와 전처리는 이 단계의 거리에 직접 영향을 줍니다.
2. 그래프 라플라시안을 구성합니다
가중치 행렬을 W, 각 점의 연결 가중치 합을 대각선에 둔 행렬을 D라고 하면 비정규화 라플라시안은 L=D-W입니다. 정규화 라플라시안은 연결량 차이를 반영해 이를 다시 조정합니다. SciPy의 laplacian은 일반 형태와 대칭 정규화 형태를 구분해 제공합니다.
3. 고유벡터로 새 좌표를 얻습니다
라플라시안의 작은 고유값에 대응하는 고유벡터들을 이용해 각 사례를 표현합니다. 원본 특징의 열을 그대로 고르는 것이 아니라 그래프에서 새 좌표를 만드는 과정입니다. 정규화 방식과 알고리즘 변형에 따라 좌표를 다루는 절차가 달라지므로 서로 다른 구현의 중간 배열을 무조건 같게 비교하지 않습니다.
4. 새 좌표에서 라벨을 배정합니다
scikit-learn은 K-means, discretize, cluster_qr 방식을 지원합니다. 기본 K-means는 새 좌표의 행들을 군집으로 묶으며 초기화 영향을 받습니다. cluster_qr은 고유벡터에서 군집을 직접 추출하는 대안입니다. 어느 방식을 써도 앞에서 잘못 만든 그래프가 자동으로 고쳐지지는 않습니다.
핵심 인사이트: 그래프 구성, 좌표 변환, 라벨 배정은 서로 다른 단계입니다. 결과가 흔들리면 어느 단계의 설정을 바꿨는지부터 확인합니다.
군집 수와 주요 설정은 무엇을 뜻하나요?
n_clusters와 n_components는 역할이 다릅니다
n_clusters는 최종적으로 구할 군집 수입니다. n_components는 스펙트럴 임베딩에 사용할 고유벡터 수이며 None이면 군집 수를 따릅니다. 같은 숫자가 기본적으로 연결돼 있어도 하나는 결과 묶음 수이고 다른 하나는 중간 표현의 크기입니다. 군집 수가 자동으로 발견된다고 생각하면 안 됩니다.
gamma와 n_neighbors는 그래프를 조절합니다
RBF의 gamma가 커지면 같은 양의 거리에서도 유사도가 더 빠르게 작아집니다. n_neighbors는 최근접 이웃 그래프를 만들 때 연결할 이웃 수입니다. RBF에서는 이웃 수를 사용하지 않고 최근접 이웃 방식에서는 gamma를 사용하지 않습니다. 현재 affinity에 실제로 적용되는 설정인지 확인하세요.
assign_labels와 random_state는 라벨 배정에 관여합니다
assign_labels가 kmeans이면 서로 다른 초기화로 여러 번 실행하는 n_init가 사용됩니다. random_state를 고정하면 관련 무작위성의 영향을 통제하는 데 도움이 됩니다. amg 고유값 풀이를 쓰는 경우에는 공식 문서가 전역 NumPy 시드도 고정하라고 안내하므로 정수 시드 하나로 모든 계산 환경이 같아진다고 단정하지 않습니다.
스펙트럴 클러스터링과 헷갈리는 용어는 무엇이 다른가요?
K-means와의 차이
일반 K-means는 입력 특징 공간에서 중심을 찾습니다. 스펙트럴 클러스터링은 먼저 그래프에서 새 좌표를 만든 뒤 그 공간에 K-means를 적용할 수 있습니다. 마지막 단계에 같은 알고리즘이 들어가도 입력 공간과 목적이 달라 전체 방법이 같지는 않습니다.
계층적 클러스터링과의 차이
계층적 클러스터링은 군집을 합치거나 나누는 중첩 관계를 트리로 남깁니다. 스펙트럴 클러스터링은 유사도 그래프의 고유벡터를 이용해 정한 수의 군집을 찾습니다. 여기서 설명하는 구현은 병합 높이가 있는 덴드로그램을 결과로 만들지 않습니다.
DBSCAN과의 차이
DBSCAN은 충분히 밀집된 영역을 확장하고 노이즈 사례를 따로 남깁니다. 스펙트럴 클러스터링은 그래프를 바탕으로 군집 수를 정해 라벨을 붙이며 DBSCAN처럼 기본 노이즈 라벨을 제공하는 방식은 아닙니다. 곡선형 데이터에 쓸 수 있다는 공통점만으로 두 방법을 바꿔 부르면 안 됩니다.
고유값 분해와 스펙트럴 임베딩의 차이
고유값 분해는 행렬의 고유값과 고유벡터를 구하는 수학 연산입니다. 스펙트럴 임베딩은 이를 써서 사례의 새 좌표를 만듭니다. 스펙트럴 클러스터링은 그래프 구성과 좌표 생성에 더해 군집 라벨 배정까지 포함하는 분석 방법입니다.
실전에서는 어디에 쓰이나요?
문서와 콘텐츠의 관계를 탐색합니다
문서 임베딩의 유사도로 그래프를 만든 뒤 비슷한 글 묶음을 살피는 데 응용할 수 있습니다. 제목만 썼는지 본문까지 썼는지, 긴 글을 어떤 방식으로 표현했는지 기록합니다. 대표 문서와 경계 문서를 읽어 묶음의 의미를 검토하는 단계는 남겨 둡니다.
이미지 안의 연결된 영역을 구분합니다
공식 이미지 분할 예제처럼 인접한 픽셀을 연결하고 밝기 차이를 유사도로 바꿔 영역을 나눕니다. 영역이 분리됐다고 사물의 이름을 알아낸 것은 아닙니다. 정규화 컷의 균형 성질 때문에 예제에서도 크기가 다른 원들을 기대한 대로 분리하지 못하는 한계를 설명합니다.
가중 연결망을 군집으로 나눕니다
대상 사이의 관계가 음이 아닌 대칭 가중치로 정리돼 있다면 특징 좌표 대신 그 관계망을 입력으로 검토합니다. 한쪽 방향으로만 기록된 관계를 합칠지 평균낼지는 분석 목적에 맞춰 정합니다. 유향 관계의 중요한 의미를 지운 채 대칭화하면 다른 문제를 푸는 셈이 됩니다.
스펙트럴 클러스터링을 적용할 때 어떤 순서로 확인하나요?
1. 입력이 특징인지 유사도인지 구분합니다
일반 입력은 사례 수와 특징 수로 이뤄진 행렬입니다.
affinity="precomputed"
에서는 사례끼리 비교한 정사각 유사도 행렬을 받습니다. 별도 옵션인
affinity="precomputed_nearest_neighbors"
는 사전 계산 거리의 희소 그래프를 받으므로 두 입력을 혼동하지 않습니다.
2. 그래프의 값과 연결 상태를 점검합니다
행과 열의 사례 순서, 대칭성, 음수, NaN과 무한대를 확인합니다. 고립된 점이나 분리된 연결 성분이 있는지도 봅니다. 의도한 독립 집단인지 이웃 수가 너무 작아 생긴 단절인지 구분해야 합니다. 연결이 끊겼다는 경고를 없애려고 무작정 선을 추가하지 않습니다.
3. 군집 수와 유사도 설정을 나눠 비교합니다
군집 수를 고정하고 이웃 수나 gamma를 바꾼 결과와, 그래프를 고정하고 군집 수를 바꾼 결과를 따로 봅니다. 모든 설정을 한꺼번에 바꾸면 결과 변화의 원인을 알기 어렵습니다. 군집 크기와 대표 사례, 경계 사례가 얼마나 유지되는지 확인합니다.
4. 재현 조건과 새 데이터 정책을 기록합니다
전처리, 그래프 구성, 군집 수, 라벨 배정 방식, 시드와 라이브러리 버전을 저장합니다. 새 문서가 들어오면 전체를 다시 묶을지 별도 배정 모델을 쓸지도 정합니다. scikit-learn의 SpectralClustering은 일반적인 predict 메서드로 새 입력을 바로 배정하는 모델이 아닙니다.
실전 팁: 라벨 숫자가 바뀌어도 같은 사례들이 함께 묶였다면 같은 분할일 수 있습니다. 번호 자체보다 사례들의 소속 관계를 비교하세요.
사용할 때 무엇을 주의해야 하나요?
첫째, 거리 행렬을 유사도 행렬로 넣지 않습니다. 거리는 작을수록 가깝고 유사도는 클수록 가까운 관계를 뜻합니다. precomputed 옵션에 거리 값을 그대로 넣으면 의도와 반대로 관계를 읽습니다. 음수가 있는 코사인 점수도 사용 조건에 맞는지 점검합니다.
둘째, 조밀한 행렬의 메모리 비용을 확인합니다. 모든 사례 쌍의 값을 저장하면 사례 수의 제곱에 비례하는 공간이 필요합니다. 희소 이웃 그래프가 저장량을 줄일 수 있지만 그래프 생성과 고유값 풀이 비용까지 없어지는 것은 아닙니다. 작은 표본에서 메모리와 시간을 먼저 측정합니다.
셋째, 균형 잡힌 군집이 항상 정답이라고 보지 않습니다. 정규화 컷은 잘리는 연결과 군집의 연결량을 함께 고려합니다. 실제로 크기가 크게 다른 집단이 있을 때 원하는 구분과 어긋날 수 있습니다. 같은 크기처럼 보이는 결과를 근거 없이 더 좋은 분석이라고 평가하지 않습니다.
넷째, 그룹 번호를 확률이나 등급으로 읽지 않습니다. labels_는 사례의 군집 식별자입니다. 신뢰도나 정답일 확률을 반환한 것이 아닙니다. 데이터 표현과 그래프 설정에 따른 탐색 결과이므로 민감한 사람 평가나 자동 제재로 곧바로 연결하지 않습니다.
주의: 고유값 계산이 끝났다는 사실과 군집이 업무상 유용하다는 판단은 별개입니다. 그래프의 의미, 대표 사례와 실제 활용 기준을 함께 확인합니다.
자주 묻는 질문
Q1. 스펙트럴은 이미지 색상 분석이라는 뜻인가요?
아닙니다. 이 문맥에서는 행렬의 고유값과 고유벡터를 이용한다는 뜻입니다. 수치 데이터, 문서 유사도와 일반적인 가중 그래프에도 적용할 수 있습니다.
Q2. 군집 수를 자동으로 찾아 주나요?
scikit-learn의 SpectralClustering은 n_clusters를 정해서 사용합니다. 고유값의 변화 등을 탐색에 참고할 수는 있지만 함수가 업무에 맞는 정답 군집 수를 자동 보장하지는 않습니다.
Q3. 마지막에 K-means를 쓰면 그냥 K-means 아닌가요?
K-means에 넣는 공간이 다릅니다. 스펙트럴 방법은 그래프에서 만든 좌표를 먼저 준비합니다. 원래 특징에 곧바로 K-means를 적용한 결과와 달라질 수 있으며 라벨 배정에 다른 방법도 선택할 수 있습니다.
Q4. 유사도 행렬은 어떤 모양이어야 하나요?
precomputed 방식에서는 같은 사례들을 행과 열에 둔 정사각행렬을 사용합니다. 행과 열의 순서를 맞추고 대칭성·음이 아닌 값·연결 상태를 확인합니다. 값이 클수록 서로 더 비슷하다는 의미여야 합니다.
Q5. 새 데이터는 predict로 바로 넣으면 되나요?
이 scikit-learn 구현은 주어진 데이터 집합을 묶는 전이적 군집화 방법으로 일반적인 predict를 제공하지 않습니다. 별도 배정 모델을 만들었다면 원래 군집화와 구분해서 정확성과 안정성을 검증합니다.
Q6. 실행마다 군집 번호가 달라지면 실패인가요?
번호만 바뀐 것인지 실제 소속 관계가 바뀐 것인지 나눠 봅니다. 번호에는 고정된 주제명이 없습니다. 시드와 설정을 기록하고 같은 사례들이 같은 그룹에 남는지 비교하는 편이 알맞습니다.
출처
마무리
스펙트럴 클러스터링은 사례의 유사도를 그래프로 나타내고 라플라시안의 고유벡터로 만든 좌표에서 군집을 찾는 방법입니다. 중심점으로 설명하기 어려운 구조를 다룰 때 도움이 되지만 어떤 연결을 만들었는지가 결과를 크게 좌우합니다.
처음에는 군집 수보다 입력의 의미부터 확인하세요. 거리와 유사도를 구분하고 그래프의 단절과 고립점을 살펴봅니다. 그다음 이웃 설정과 라벨 배정 방식을 비교하고 대표 사례를 읽습니다. 계산 비용과 새 데이터 처리 규칙까지 남기면 분석 결과를 다시 검토하기가 쉬워집니다.
