벡터 임베딩을 눈으로 보는 법: t-SNE, UMAP, DBSCAN 완전 정복
RAG 파이프라인을 구축하거나 텍스트 분류 모델을 디버깅하다 보면, 어느 순간 1536차원짜리 숫자 배열을 들여다보며 멍해지는 경험을 하게 된다. 이 숫자들이 실제로 의미 있는 구조를 갖고 있는지, 유사한 문서들이 정말 가까이 모여 있는지, 아니면 임베딩 모델이 엉뚱한 방향으로 훈련된 건지 — 숫자만으로는 알 수가 없다.
이 글은 그 1536개의 숫자를 눈으로 볼 수 있도록 만드는 도구들을 다룬다. 차원 축소로 고차원 공간을 2D 평면에 투영하고, 클러스터링으로 숨겨진 구조를 찾아내고, 유사도 측정으로 두 벡터의 관계를 수치화하는 방법 — 이 세 갈래의 도구를 각각의 수학적 원리부터 실전 해석법까지 하나씩 풀어나간다.
벡터 임베딩이란 무엇인가
임베딩(embedding)은 의미를 숫자의 방향으로 인코딩한 결과물이다. “고양이”라는 단어를 모델이 처리하면 [0.23, -0.71, 0.04, ...] 같은 수백 개의 실수 배열이 나온다. 이 배열에서 중요한 것은 개별 숫자의 값이 아니라, 두 벡터 사이의 방향과 거리다.
Google 검색을 생각해보면 감이 온다. “파이썬 웹 크롤링”을 검색하면 Google은 이 검색어를 벡터로 변환한 뒤, 이미 벡터로 변환해둔 수십억 개의 웹페이지 중에서 방향이 가장 비슷한 것들을 골라 보여준다. “웹 스크래핑 Python”이라고 검색해도 비슷한 결과가 나오는 이유는, 두 검색어의 벡터가 거의 같은 방향을 가리키기 때문이다.
이때 각 벡터의 차원 수가 곧 의미를 표현하는 해상도다. OpenAI의 text-embedding-3-small은 1536차원, sentence-transformers의 all-MiniLM-L6-v2는 384차원을 사용한다. 차원이 높을수록 미묘한 의미 차이를 구분할 수 있지만, 사람이 직접 눈으로 볼 수 있는 건 3차원이 한계다. 1536개의 숫자를 보고 “이 문서들이 잘 분류되어 있나?”를 판단할 수 있는 사람은 없다. 그래서 고차원 공간을 2D/3D로 압축해서 보는 도구가 필요해진다.
차원 축소: PCA, t-SNE, UMAP
PCA — 분산이 가장 큰 방향을 찾아라
PCA(Principal Component Analysis)는 1901년 Karl Pearson이 고안한 방법으로1, 데이터를 가장 잘 설명하는 축을 찾아내는 기법이다.
1536차원의 데이터를 2차원으로 줄여야 한다고 하자. 어떤 방향으로 “잘라낼” 것인가? PCA는 데이터가 가장 넓게 퍼져 있는 방향(분산이 큰 방향)을 먼저 선택한다. 데이터가 넓게 퍼진 방향이 정보가 많은 방향이기 때문이다. 첫 번째 축(PC1)이 가장 정보가 많고, 그 다음 축(PC2)은 PC1에 직교하면서 두 번째로 정보가 많은 방향이다.
수학적으로는 공분산 행렬의 고유값 분해로 이 축을 찾는다.
고유벡터 v가 새로운 축의 방향이고, 고유값 λ가 그 축의 중요도(설명하는 정보량)다. λ가 클수록 해당 축이 데이터의 변화를 많이 담고 있다는 뜻이다.
주요 파라미터와 해석
n_components=2로 설정하면 2D 산점도를 얻는다. 이때 반드시 확인할 것이 Explained Variance Ratio(설명된 분산 비율)다. 이 값이 PC1=42%, PC2=18%라면 두 축이 전체 정보의 60%를 담고 있다는 뜻이다. 80% 이상이면 2D 시각화를 꽤 신뢰할 수 있고, 30% 이하라면 “이 그림은 전체 그림의 30%만 보여주고 있다”는 뜻이므로 해석에 주의가 필요하다.
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
reduced = pca.fit_transform(embeddings) # shape: (n, 2)
print(pca.explained_variance_ratio_) # [0.42, 0.18] 같은 값
결과 해석: PCA 산점도에서 클러스터가 뚜렷하게 분리된다면 임베딩이 선형적으로 분리 가능한 구조를 갖고 있다는 뜻이다. 점들이 긴 축을 따라 늘어진다면(cigar shape) 특정 의미 방향이 지배적임을 나타낸다.
장단점: 빠르고 결정론적(실행마다 같은 결과)이며 역변환이 가능하다. 단, 선형 관계만 포착하므로 비선형 구조가 풍부한 임베딩 공간에서는 클러스터가 뭉개져 보일 수 있다. 대규모 데이터의 전처리 단계(예: 512차원 → 50차원으로 먼저 줄이고 t-SNE 적용)로 쓰기에 적합하다.
t-SNE — 이웃 관계를 확률로 보존하라
t-SNE(t-distributed Stochastic Neighbor Embedding)는 2008년 van der Maaten과 Hinton이 발표한 방법으로2, PCA와는 완전히 다른 철학을 갖고 있다.
PCA가 “전체 데이터의 분산을 보존하자”였다면, t-SNE는 “가까운 이웃 관계를 보존하자”다. 고차원에서 점 A와 점 B가 이웃이었다면, 2D로 줄인 뒤에도 A와 B는 이웃이어야 한다. 반면 고차원에서 멀리 있던 점들이 2D에서 어디에 위치하는지는 신경 쓰지 않는다. 이것이 t-SNE의 가장 중요한 특성이자 함정이다.
수학적으로는 고차원과 저차원에서 각각 “이 점이 저 점의 이웃일 확률”을 계산하고, 두 확률 분포의 차이를 줄여나간다.
고차원 유사도(가우시안 분포):
저차원 유사도(t-분포, 자유도=1):
비용 함수(KL Divergence 최소화):
왜 고차원에서는 가우시안을, 저차원에서는 t-분포를 사용할까? 이것이 t-SNE의 핵심 트릭이다. 고차원 공간에는 “차원의 저주”라는 문제가 있다. 차원이 높아지면 모든 점 사이의 거리가 비슷해지는 현상이 발생하고, 이웃과 비이웃의 구분이 흐려진다. 저차원에서 t-분포(가우시안보다 꼬리가 두꺼운 분포)를 쓰면, 먼 점들을 더 강하게 밀어내는 효과가 생겨 클러스터 간 분리가 명확해진다. 이름에 “t”가 붙은 이유가 바로 이 t-분포다.
주요 파라미터
| 파라미터 | 기본값 | 영향 |
|---|---|---|
perplexity | 30 | 각 점의 유효 이웃 수. 낮으면 국소 구조 강조, 높으면 전역 구조 강조 |
n_iter | 1000 | 최적화 반복 횟수. 수렴 안 하면 늘릴 것 |
learning_rate | 200 | 너무 낮으면 공처럼 뭉침, 너무 높으면 흩어짐 |
perplexity에 따른 모양 변화: perplexity는 “각 점이 몇 개의 이웃을 의식할 것인가”를 결정한다. perplexity=5이면 바로 옆 5개 점만 신경 쓰므로 아주 작은 소그룹들이 선명하게 나뉜다. perplexity=50이면 50개 점을 의식하므로 작은 클러스터들이 합쳐지면서 큰 구조가 보인다. 같은 데이터를 perplexity 5, 30, 100으로 각각 돌려보는 것이 좋은 관행이다. 하나의 값만으로 “정답”을 볼 수 없기 때문이다.
결과 해석의 함정: t-SNE에서 클러스터 간 거리는 아무 의미가 없다. 두 클러스터가 화면상에서 가까워 보여도 원래 고차원 공간에서 가깝다는 보장이 없다. t-SNE가 보존하는 것은 이웃 관계이지 전역 거리 구조가 아니다. 또한 실행마다 다른 결과가 나오며(random_state 고정 필수), 새 데이터 포인트를 기존 결과에 추가할 수 없다(out-of-sample extension 불가).
[!KEY] t-SNE 시각화에서 “두 클러스터가 화면상에서 멀다”는 사실이 실제 의미적 거리가 멀다는 뜻은 아니다. 클러스터의 형태와 밀도에 집중하고, 클러스터 간 거리는 무시해야 한다.
UMAP — 위상 공간의 퍼지 단순집합체
UMAP(Uniform Manifold Approximation and Projection)은 2018년 McInnes와 Healy가 발표한 방법으로3, 리만 기하학(Riemannian geometry)과 퍼지 위상수학(fuzzy topology)을 기반으로 한다. GitHub에 8,100개 이상의 스타를 받으며 t-SNE의 주요 대안으로 자리잡았다.
t-SNE가 “이웃 관계”만 보존했다면, UMAP은 한 단계 더 나아간다. 데이터가 고차원 공간에서 어떤 구부러진 표면(다양체, manifold) 위에 놓여 있다고 가정하고, 그 표면의 모양 자체를 저차원에서 재현하려 한다. 덕분에 t-SNE와 달리 클러스터 간 거리도 어느 정도 의미를 갖는다.
수학적으로 UMAP은 각 점을 중심으로 퍼지(fuzzy) 이웃 그래프를 만들고, 이 그래프의 구조를 저차원에서 복원한다. 각 점 x_i에서 가장 가까운 이웃까지의 거리 ρ_i가 로컬 스케일을 결정한다:
파라미터 a와 b는 min_dist와 spread 설정에 의해 자동으로 맞춰진다.
주요 파라미터
| 파라미터 | 기본값 | 영향 |
|---|---|---|
n_neighbors | 15 | t-SNE의 perplexity와 유사. 낮으면 국소 구조, 높으면 전역 구조 |
min_dist | 0.1 | 저차원에서 점들이 얼마나 밀집되어 표현될지. 낮을수록 꽉 뭉침 |
metric | euclidean | 거리 함수. cosine으로 바꾸면 임베딩에 더 적합할 때가 많음 |
spread | 1.0 | 전체 임베딩 공간의 스케일 |
t-SNE와의 결정적 차이: UMAP은 전역 구조를 어느 정도 보존한다. 두 클러스터 사이의 거리가 상대적으로 의미를 갖는다. 고차원에서 실제로 멀리 떨어진 군집들은 UMAP 시각화에서도 멀리 위치하는 경향이 있다. 또한 속도가 훨씬 빠르고(대규모 데이터에서 t-SNE 대비 수십 배), out-of-sample extension이 가능하며(transform() 호출), n_components를 2 이상으로 설정하면 클러스터링 전처리로도 쓸 수 있다.
결과 해석: min_dist=0.0으로 설정하면 같은 클러스터 안의 점들이 한 덩어리로 뭉쳐 보여 클러스터 경계가 선명해진다. min_dist=0.5이면 클러스터 내부 구조도 보인다. 임베딩 분석에서는 metric='cosine'이 종종 더 나은 결과를 낸다. 코사인 유사도가 고차원 공간에서 의미 유사성을 더 잘 반영하기 때문이다.
[!KEY] UMAP은 t-SNE보다 전역 구조를 더 잘 반영한다. 단,
n_neighbors가 너무 작으면(5 이하) 아티팩트가 생기고, 너무 크면(100 이상) 클러스터 경계가 흐릿해진다. 20–50이 임베딩 분석에서 일반적으로 좋은 출발점이다.
클러스터링: K-Means, DBSCAN, HDBSCAN
차원 축소가 “눈으로 볼 수 있게” 만드는 과정이라면, 클러스터링은 “컴퓨터가 자동으로 그룹을 나누는” 과정이다. UMAP 시각화에서 눈으로 보면 덩어리가 3개 있는 것 같은데, 정말 3개인지, 실은 5개인지 — 이걸 수치적으로 판별하는 것이 클러스터링의 역할이다.
K-Means — 중심점을 기준으로 분할하라
K-Means는 가장 직관적인 클러스터링이다. “K개의 그룹으로 나눠라”고 지정하면, 각 그룹의 중심(centroid)을 찾아서 모든 점을 가장 가까운 중심에 배정한다. 최적화 목표는 각 점과 자기 그룹 중심 사이의 거리 합을 최소화하는 것이다.
알고리즘은 단순하다. 중심점 K개를 무작위로 초기화하고 → 각 점을 가장 가까운 중심에 할당하고 → 중심을 재계산하는 과정을 수렴할 때까지 반복한다.
주요 파라미터
K를 미리 정해야 한다는 것이 핵심 제약이다. “3개로 나눠”라고 했는데 실제로는 5개 그룹이면 억지로 합쳐버린다. 최적 K를 찾는 방법으로 Elbow Method(K를 1부터 늘려가며 비용 함수가 급격히 꺾이는 지점을 찾음)와 Silhouette Score가 쓰인다.
: 같은 클러스터 내 평균 거리, : 가장 가까운 다른 클러스터까지 평균 거리. 범위: – (높을수록 좋음).
장단점: 구현이 단순하고 빠르다. 단, 구형(convex) 클러스터만 탐지 가능하며, 이상치(outlier)에 민감하고, K를 미리 알아야 한다. 임베딩 분석에서 K-Means를 쓸 때는 유클리드 거리 대신 코사인 거리를 쓰는 Spherical K-Means가 더 적합하다.
DBSCAN — 밀도를 기준으로 클러스터를 찾아라
K-Means의 약점은 “동그란 클러스터”만 잘 찾는다는 것이다. 임베딩 공간에서 클러스터는 초승달 모양일 수도, 고리 모양일 수도 있다. DBSCAN(Density-Based Spatial Clustering of Applications with Noise)은 1996년 Ester, Kriegel, Sander, Xu가 발표한 알고리즘으로4, 이 문제를 밀도(density)로 해결한다.
아이디어는 단순하다. “점이 빽빽하게 모여 있는 곳이 클러스터다.” 두 파라미터가 “빽빽함”의 기준을 정의한다. eps(ε)는 “반경 얼마 안에 있으면 이웃인가”, min_samples는 “이웃이 최소 몇 개 있어야 핵심 지역인가”다.
직접 밀도 도달: 이고 가 핵심점이면 . 밀도 연결: 와 모두에 도달 가능한 점 가 존재하면 .
eps와 min_samples가 결과에 미치는 영향
eps를 너무 크게 잡으면 모든 점이 하나의 거대 클러스터로 합쳐진다. 너무 작으면 대부분의 점이 노이즈(-1)로 분류된다. min_samples를 높이면 더 조밀한 클러스터만 인정한다. 적절한 eps를 찾는 방법은 k-nearest neighbor distance plot을 그려보는 것이다. k=min_samples로 설정하고 각 점의 k번째 이웃까지 거리를 오름차순으로 정렬하면, 급격히 증가하는 “무릎(elbow)” 지점이 좋은 eps다.
장단점: 임의 형태의 클러스터를 탐지할 수 있고, K를 미리 지정할 필요가 없으며, 이상치를 자동으로 표시(-1)한다. 단, eps 선택이 까다롭고, 밀도가 다른 클러스터들이 공존할 때(이상치가 많은 임베딩 공간에서 흔함) 성능이 떨어진다.
HDBSCAN — 밀도의 계층을 탐색하라
DBSCAN의 가장 큰 약점은 eps를 직접 정해야 한다는 것이다. 서울 강남처럼 밀집된 지역과 강원도 산간 마을은 “밀도”의 기준이 다르다. 하나의 eps로는 밀도가 다른 클러스터를 동시에 잡아낼 수 없다.
HDBSCAN(Hierarchical DBSCAN)은 Campello, Moulavi, Sander(2013)5의 이론을 기반으로, McInnes, Healy, Astels가 2017년 구현한 라이브러리다6. eps를 아예 없애고, 대신 모든 밀도 수준을 한꺼번에 탐색한다. 밀도가 높은 곳의 작은 클러스터, 밀도가 낮은 곳의 큰 클러스터를 동시에 찾아낸다.
핵심은 상호 도달 거리(mutual reachability distance)와 응결 트리(condensed tree)다.
이 거리로 MST(최소 신장 트리) 구축 → 계층적 클러스터 트리 → 응결 트리 압축 → 안정적 클러스터 선택.
클러스터 안정성(stability) 공식:
(거리의 역수 = 밀도 수준). 는 클러스터가 생겨난 밀도 수준, 는 점이 클러스터를 떠나는 밀도 수준이다.
주요 파라미터
| 파라미터 | 기본값 | 영향 |
|---|---|---|
min_cluster_size | 5 | 최소 클러스터 크기. 클수록 더 적고 큰 클러스터만 인정 |
min_samples | None | 핵심점 기준. 높일수록 보수적 클러스터링 |
cluster_selection_method | eom | eom(default): 크고 안정적인 클러스터 선호 / leaf: 작은 클러스터들 |
장단점: eps 없이도 잘 작동하며, 밀도 불균형 클러스터를 잘 처리한다. 소프트 클러스터링(확률적 소속도) 지원으로 경계 점들의 소속 확신도를 알 수 있다. 임베딩 분석에서 DBSCAN보다 훨씬 강건하게 동작하는 경우가 많다.
유사도 측정: 코사인 유사도와 유클리드 거리
차원 축소와 클러스터링이 “전체 구조를 파악하는” 도구라면, 유사도 측정은 “이 문서 두 개가 얼마나 비슷한가?”를 수치 하나로 답하는 도구다. RAG에서 검색 결과의 관련도를 판단하거나, 중복 문서를 찾아내거나, 추천 시스템에서 유사 아이템을 고를 때 사용한다.
코사인 유사도
범위: – . 이면 완전히 같은 방향(의미적으로 동일), 이면 직교(무관), 이면 반대 방향이다.
코사인 유사도는 벡터의 방향만 비교하고 크기(길이)는 무시한다. 왜 이것이 임베딩에 적합한가? 임베딩 모델은 의미를 벡터의 방향으로 인코딩한다. “머신러닝 입문”이라는 짧은 문서와 “머신러닝 기초부터 고급까지 완벽 가이드”라는 긴 문서는 벡터 길이가 다를 수 있지만, 가리키는 방향은 거의 같다. 코사인 유사도는 이 두 문서를 “거의 같은 주제”로 판단한다.
유클리드 거리
범위: – . 이면 동일한 점, 값이 클수록 멀리 떨어진다.
유클리드 거리는 벡터의 절대적 위치 차이를 측정한다. L2 정규화된 임베딩(||v|| = 1)에서는 유클리드 거리와 코사인 유사도가 단조 관계를 갖는다.
그러므로 L2 정규화가 된 임베딩에서는 어느 쪽을 써도 랭킹이 같다. 하지만 정규화되지 않은 경우에는 코사인 유사도가 더 신뢰할 만하다. OpenAI 임베딩은 이미 L2 정규화가 되어 있으나, sentence-transformers는 모델에 따라 다르다.
실전에서의 선택 기준:
- RAG 검색, 의미 검색: 코사인 유사도
- K-Means 클러스터링: 정규화 후 유클리드 또는 Spherical K-Means
- 이상치 탐지: 유클리드 거리 (절대적 위치 중요)
- t-SNE/UMAP 전처리: 코사인 거리 (
metric='cosine')
실전 워크플로: 도구들의 조합
임베딩 공간을 탐색하는 전형적인 워크플로는 다음과 같다.
graph TD
A[원본 임베딩 수집] --> B[PCA로 50차원 축소]
B --> C{목적}
C --> D[시각화: UMAP 2D]
C --> E[클러스터링: HDBSCAN]
D --> F[클러스터 레이블 색상으로 표시]
E --> F
F --> G[이상치 및 경계 샘플 검토]
1단계 — 전처리: 수백만 개의 임베딩이라면 PCA로 50–100차원으로 먼저 줄인다. 1536차원에서 직접 UMAP을 돌리면 시간이 오래 걸리고, 노이즈가 많은 고차원 공간에서의 거리 계산은 정확도가 낮다(차원의 저주).
2단계 — 시각화: UMAP(n_neighbors=15, min_dist=0.1, metric='cosine')으로 2D 투영한다.
3단계 — 클러스터링: HDBSCAN(min_cluster_size=10)을 PCA 축소된 공간(2D 투영이 아닌!)에 적용한다. 2D 투영 결과에 클러스터링을 하면 투영 과정의 왜곡이 클러스터링에 영향을 미친다.
4단계 — 검증: 클러스터별로 Silhouette Score를 계산하고, 각 클러스터의 대표 샘플을 직접 읽어 레이블이 의미 있는지 확인한다. HDBSCAN의 probabilities_ 값이 낮은(0.5 미만) 점들은 경계 샘플로, 특별히 검토할 가치가 있다.
흔한 실수와 해결법
- t-SNE를 클러스터링에 쓰는 실수: t-SNE 좌표는 클러스터링 피처로 부적합하다. t-SNE는 국소 구조 보존에 치중하여 전역 거리가 왜곡되기 때문이다. 클러스터링은 원본 공간(또는 PCA 축소 공간)에서 하라.
- K 선택 없이 K-Means 고집: 임베딩 클러스터는 대개 구형이 아니다. HDBSCAN이 훨씬 자연스러운 결과를 낸다.
- 정규화 확인 안 함:
np.linalg.norm(embeddings, axis=1)로 각 벡터의 노름을 확인하라. 1.0에 가까우면 이미 정규화됨, 그렇지 않으면sklearn.preprocessing.normalize()를 사용하라. - 작은 perplexity/n_neighbors: 5만 개 이상의 임베딩에서
perplexity=5로 돌리면 의미 없는 파편화된 구조만 보인다. 데이터 크기의 sqrt에 가까운 값에서 시작하라.
최신 시각화 도구
Nomic Atlas
Nomic Atlas는 수백만 개의 임베딩을 웹 브라우저에서 인터랙티브하게 탐색할 수 있는 플랫폼이다. Python SDK로 임베딩 배열을 업로드하면 자동으로 UMAP 투영과 클러스터링이 적용된 대화형 지도를 생성한다. OpenAI Cookbook에도 공식 예제가 수록되어 있다.
import nomic
from nomic import atlas
project = atlas.map_embeddings(
embeddings=embeddings, # numpy array (n, dim)
data=metadata, # 메타데이터 딕셔너리 리스트
id_field='id',
colorable_fields=['category']
)
Twitter 540만 트윗, Stable Diffusion 생성 이미지 640만 개 등 대규모 공개 지도를 제공하여 임베딩 구조를 직관적으로 이해하는 데 참고할 만하다.
Apple Embedding Atlas
2025년 Apple이 공개한 오픈소스 도구로7, MIT 라이선스로 제공된다. UMAP 알고리즘을 WebAssembly로 구현하여 데이터가 브라우저 밖으로 나가지 않는 것이 특징이다. GitHub에 3,600개 이상의 스타를 받았다. 내장 밀도 클러스터링 알고리즘(Rust 구현)으로 자동 레이블링을 지원하며, Jupyter Notebook 위젯으로도 사용 가능하다.
pip install embedding-atlas
embedding-atlas serve embeddings.parquet
로컬에서 수백만 개 규모의 임베딩을 인터랙티브하게 탐색할 수 있으며, 크로스 필터링과 메타데이터 검색을 지원한다. 데이터 프라이버시가 중요한 환경에서 Nomic Atlas의 대안으로 적합하다.
마치며
벡터 임베딩 분석은 단일 도구로 완결되지 않는다. PCA로 전처리하고, UMAP으로 구조를 시각화하고, HDBSCAN으로 클러스터를 찾고, 코사인 유사도로 개별 관계를 검증하는 — 이 네 가지의 조합이 고차원 공간을 이해하는 현실적인 방법이다.
각 도구가 가진 가정과 한계를 알고 쓰는 것이 전부다. t-SNE의 클러스터 간 거리를 믿거나, 2D 투영 결과에 K-Means를 적용하거나, 정규화되지 않은 임베딩에 유클리드 거리를 쓰는 실수만 피해도 분석의 신뢰도가 크게 달라진다.
Footnotes
-
Pearson, K. (1901). On lines and planes of closest fit to systems of points in space. Philosophical Magazine, 2(11), 559–572. ↩
-
van der Maaten, L. J. P., & Hinton, G. E. (2008). Visualizing High-Dimensional Data Using t-SNE. Journal of Machine Learning Research, 9(Nov), 2579–2605. https://www.jmlr.org/papers/v9/vandermaaten08a.html ↩
-
McInnes, L., & Healy, J. (2018). UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction. arXiv:1802.03426. https://arxiv.org/abs/1802.03426 ↩
-
Ester, M., Kriegel, H.-P., Sander, J., & Xu, X. (1996). A density-based algorithm for discovering clusters in large spatial databases with noise. Proceedings of the 2nd International Conference on Knowledge Discovery and Data Mining (KDD-96), 226–231. ↩
-
Campello, R. J. G. B., Moulavi, D., & Sander, J. (2013). Density-Based Clustering Based on Hierarchical Density Estimates. Pacific-Asia Conference on Knowledge Discovery and Data Mining, 160–172. ↩
-
McInnes, L., Healy, J., & Astels, S. (2017). hdbscan: Hierarchical density based clustering. Journal of Open Source Software, 2(11), 205. https://doi.org/10.21105/joss.00205 ↩
-
Ren, D., Hohman, F., Lin, H., & Moritz, D. (2025). Embedding Atlas: Low-Friction, Interactive Embedding Visualization. arXiv:2505.06386. https://github.com/apple/embedding-atlas ↩
댓글