거리 매트릭스를 사용한 클러스터링


52

M각 노드 쌍 사이의 거리를 나타내는 (대칭) 행렬 이 있습니다. 예를 들어

    ABCDEFGHIJKL
0 20 20 20 40 60 60 60100120120120
B 20 20 20 60 80 80 80120140140140
C 20 20 20 60 80 80 80120140140140
D 20 20 20 60 80 80 80120140140140
E 40 60 60 60 20 20 20 60 80 80 80
F 60 80 80 80 20 20 20 40 60 60 60
G 60 80 80 80 20 20 20 60 80 80 80
H 60 80 80 80 20 20 20 60 80 80 80
I 100120120120 60 40 60 60 20 20 20
J120140140140 80 60 80 80 20 20 20
K 120140140140 80 60 80 80 20 20 20
L 120140140140 80 60 80 80 20 20 20 0

M각 클러스터에 거리가 작은 노드가 포함되도록 클러스터 를 추출하는 방법이 있습니까 (필요한 경우 클러스터 수를 고정 할 수 있음)? 예에서, 클러스터는 것 (A, B, C, D), (E, F, G, H)하고 (I, J, K, L).

나는 이미 UPGMA와 -mean을 시도 k했지만 결과 클러스터는 매우 나쁩니다.

거리는 평균 임의 워커 노드에서 이동하는 데 걸리는 단계입니다 A노드에 B( != A)와 노드로 이동합니다 A. 그것이 M^1/2메트릭 임을 보장합니다 . 실행을 k의미하기 위해 중심을 사용하지 않습니다. 노드 n클러스터 사이의 거리를의 모든 노드와 c의 평균 거리로 정의합니다 .nc

고마워요 :)


1
이미 UPGMA를 시도한 정보 (및 시도한 다른 정보)를 추가하는 것을 고려해야합니다. :
Björn Pollex

1
질문이 있습니다. k- 평균의 성능이 좋지 않다고 왜 말했습니까? 나는 매트릭스를 k- 평균으로 전달했으며 완벽한 클러스터링을 수행했습니다. k (클러스터 수) 값을 k- 평균으로 전달하지 않았습니까?

3
@ user12023 질문을 잘못 이해했다고 생각합니다. 행렬은 일련의 점이 아닙니다 . 쌍 간의 거리입니다. 적어도 명백한 방법으로, 실제 좌표가 아닌 점들 사이의 거리 만 있으면 포인트 모음의 중심을 계산할 수 없습니다.
Stumpy Joe Pete

7
k- 평균은 거리 행렬을 지원하지 않습니다 . 포인트-투-포인트 거리를 사용하지 않습니다. 따라서 행렬을 벡터로 재 해석 하고 이러한 벡터를 실행 해야 한다고 가정 수 있습니다 ... 아마도 시도한 다른 알고리즘에서도 마찬가지입니다. 원시 데이터 를 예상 하고 거리 행렬을 전달했습니다.
Anony-Mousse

답변:


38

여러 가지 옵션이 있습니다.

k- 메도 이드 클러스터링

먼저 k- 평균 군집화를 사용하는 대신 메도 이드 (pam)를 기준으로 분할을 시도 할 수 있습니다. 이것은 더 강력하고 더 나은 결과를 줄 수 있습니다. Van der Laan은 알고리즘을 재 작업했습니다. 직접 구현하려는 경우 그의 기사 를 읽을 가치가 있습니다.

큰 데이터 세트를위한 특정 k- 메도 이드 클러스터링 알고리즘이 있습니다. 이 알고리즘을 R에서 Clara라고 하며 데이터에서 그룹 찾기 : 클러스터 분석 소개의 3 장에 설명되어 있습니다. Kaufman, L 및 PJ Rousseeuw (1990).

계층 적 클러스터링

UPGMA 대신 다른 계층 적 클러스터링 옵션을 시도 할 수 있습니다. 우선, 계층 적 클러스터링을 사용할 때 파티셔닝 방법을 올바르게 정의해야합니다. 이 분할 방법은 본질적으로 관측치와 군집 간의 거리를 계산하는 방법입니다. 나는 주로 Ward의 방법이나 완전한 연결을 사용하지만 다른 옵션이 당신을위한 선택 일 수 있습니다.

아직 시도했는지는 모르지만, 계통 발생 응용에서는 단일 연결 방법 또는 인접 연결이 UPGMA보다 선호되는 경우가 많습니다. 아직 시도하지 않았다면 종종 좋은 결과를 얻을 수 있으므로 기회를 줄 수도 있습니다.


R에서는 패키지 클러스터를 살펴볼 수 있습니다 . 여기에 설명 된 모든 알고리즘이 구현됩니다. ? pam,? clara,? hclust, ...를 참조하십시오.? kmeans에서 알고리즘의 다른 구현도 확인하십시오. 때때로 다른 알고리즘을 선택하면 클러스터링이 크게 향상 될 수 있습니다.


편집 : 그냥 생각해보십시오 : 그래프 및 노드 등을 사용하여 작업하는 경우 마르코프 클러스터링 알고리즘도 살펴보십시오. 그것은 예를 들어 블라스트 유사성에 기초하여 서열을 그룹화하는데 사용되며, 매우 잘 수행된다. 클러스터링을 수행하거나 집중하고있는 연구 문제를 해결하는 방법에 대한 아이디어를 제공 할 수 있습니다. 실제로 그것에 대해 아무것도 알지 못하면 그의 결과가 확실히 가치가 있다고 생각합니다. 내가 말할 수 있더라도, 나는 Stijn van Dongen 의이 방법을 내가 지금까지 본 클러스터링에서 가장 좋은 결과 중 하나라고 생각합니다.

http://www.micans.org/mcl/


22

거리 매트릭스에서 클러스터를 강조 표시하는 한 가지 방법은 다차원 스케일링 입니다. 2D 공간에서 개인 (여기서는 노드라고 부름)을 투사 할 때 PCA와 비슷한 솔루션을 제공합니다. 이것은 감독되지 않으므로 클러스터 수를 우선적으로 지정할 수는 없지만 주어진 거리 또는 유사성 매트릭스를 신속하게 요약하는 것이 도움이 될 수 있다고 생각합니다.

다음은 데이터로 얻을 수있는 것입니다.

tmp <- matrix(c(0,20,20,20,40,60,60,60,100,120,120,120,
                20,0,20,20,60,80,80,80,120,140,140,140,
                20,20,0,20,60,80,80,80,120,140,140,140,
                20,20,20,0,60,80,80,80,120,140,140,140,
                40,60,60,60,0,20,20,20,60,80,80,80,
                60,80,80,80,20,0,20,20,40,60,60,60,
                60,80,80,80,20,20,0,20,60,80,80,80,
                60,80,80,80,20,20,20,0,60,80,80,80,
                100,120,120,120,60,40,60,60,0,20,20,20,
                120,140,140,140,80,60,80,80,20,0,20,20,
                120,140,140,140,80,60,80,80,20,20,0,20,
                120,140,140,140,80,60,80,80,20,20,20,0),
              nr=12, dimnames=list(LETTERS[1:12], LETTERS[1:12]))
d <- as.dist(tmp)
mds.coor <- cmdscale(d)
plot(mds.coor[,1], mds.coor[,2], type="n", xlab="", ylab="")
text(jitter(mds.coor[,1]), jitter(mds.coor[,2]),
     rownames(mds.coor), cex=0.8)
abline(h=0,v=0,col="gray75")

mds

나는 x와 y 좌표에 작은 지 터링을 추가하여 구별되는 경우를 허용했습니다. 교체 tmp1-tmp당신이 비 유사성 작업 않으려면, 그러나 이것은 본질적으로 같은 사진을 얻을 수 있습니다. 그러나 다음은 단일 응집 기준을 사용하는 계층 적 클러스터링 솔루션입니다 .

plot(hclust(dist(1-tmp), method="single"))

hc

덴드로 그램 또는보다 강력한 방법을 기반으로 클러스터 선택을 더 세분화 할 수 있습니다. 예를 들어이 관련 질문을 참조하십시오. 실제로 계층 적 클러스터링을위한 중지 기준은 무엇입니까?


2

스펙트럼 군집화 [1]는 친 화성 매트릭스를 필요로하며, 군집화 는 분해의 번째 고유 함수에 의해 정의됩니다.K

L=D1/2AD1/2

함께 데이터와의 친 화성 기질 인 (편집으로 정의 된 대각 행렬 인 : 죄송 불분명 한 것에 대해,하지만 당신이 제공하는 거리 행렬에서 친 화성 매트릭스를 생성 할 수 있습니다 당신은 가능한 최대 알고 / 다른 계획도 있지만 와 같은 합리적인 거리 )ADAij=1dij/max(d)

{Di,i=jAi,jDij=0

함께 의 eigendecomposition되는 , 열으로 적층하여 고유 함수만을 유지 의 최대 고유 벡터들을 , 우리는 행 정규화 된 행렬을 정의XLKX

Yij=Xij(j(Xij)2)1/2

의 각 행은 한 지점 이며 일반적인 클러스터링 알고리즘 (예 : K- 평균)으로 클러스터링 할 수 있습니다.YRk

https://stackoverflow.com/a/37933688/2874779 를 보려면 여기에 내 대답을보십시오.


[1] Ng, AY, Jordan, MI, & Weiss, Y. (2002). 스펙트럼 클러스터링 : 분석 및 알고리즘. 신경 정보 처리 시스템의 발전, 2, 849-856. Pg.2


2

당신이하고있는 일은 서로 가까운 그래프 또는 네트워크의 노드를 함께 클러스터하려고합니다. 이 문제에 전념하는 전체 연구 분야가 있으며 때로는 네트워크에서 커뮤니티 감지 라고 합니다. 이 관점에서 문제를 살펴보면 아마도 상황을 분명히 할 수있을 것입니다.

이 문제에 전념하는 많은 알고리즘을 찾을 수 있으며 실제로 일부 알고리즘은 사용자가 가지고있는 것과 동일한 아이디어를 기반으로합니다.

문제는 종종 모듈화 최적화 [1] 로 공식화 되는데, 여기서 클러스터링의 모듈성은 밀집된 클러스터 (즉, 노드가 서로 가까운 클러스터)에서 클러스터링이 네트워크를 얼마나 잘 분리하는지 측정합니다.

실제로, 모듈성은 임의의 워커가 한 단계 후에 동일한 클러스터에서 두 개의 독립적 인 랜덤 워커에 대한 동일한 확률을 뺀 것보다 같은 클러스터에 머무를 확률과 같다는 것을 보여줄 수 있습니다 [2].

랜덤 워커의 더 많은 단계를 허용하는 경우 네트워크의 더 거친 클러스터링을 찾고 있습니다. 따라서 랜덤 워크의 단계 수는 클러스터 계층 구조를 복구 할 수있는 해결 매개 변수의 역할을합니다. 이 경우, t 단계 후 랜덤 워커가 초기 클러스터에 머무르는 경향을 나타내는 양을 시간 t [2] 에서 파티션마르코프 안정성 이라고하며, t = 1 일 때의 모듈 성과 동일합니다 .

따라서 주어진 시간 t 에서 안정성을 최적화하는 그래프의 군집을 찾아 문제를 해결할 수 있습니다 . 여기서 t 는 해상도 매개 변수입니다 ( t 는 클수록 더 큰 군집을 나타냄). 안정성 (또는 해상도 매개 변수가있는 모듈성)을 최적화하기 위해 가장 많이 사용되는 방법 중 하나는 Louvain Algorithm [3]입니다. https://github.com/michaelschaub/generalizedLouvain 에서 구현을 찾을 수 있습니다 .

[1] Newman, MEJ & Girvan, M. 네트워크에서 커뮤니티 구조를 찾고 평가합니다. 물리. 개정 E 69, 026113 (2004).

[2] Delvenne, J.-C., Yaliraki, SN & Barahona, M. 시간 척도에 따른 그래프 커뮤니티의 안정성. Proc. Natl. 아카데 공상 과학 107, 12755-12760 (2010).

[3] Blondel, VD, Guillaume, J.-L., Lambiotte, R. & Lefebvre, E. 대규모 네트워크에서 커뮤니티의 빠른 전개. J. 통계 기계화 이론 Exp. 2008, P10008 (2008).


1

음, 주어진 유사성 매트릭스에 대해 K- 평균 군집화를 수행하는 것이 가능합니다. 먼저 행렬을 중앙에 놓고 행렬의 고유 값을 가져와야합니다. 마지막으로 가장 중요한 단계는 처음 두 개의 고유 벡터를 고유 값의 대각선의 제곱근에 곱하여 벡터를 얻은 다음 K- 평균으로 이동하는 것입니다. 아래 코드는 방법을 보여줍니다. 유사성 매트릭스를 변경할 수 있습니다. fpdist는 유사성 행렬입니다.

mds.tau <- function(H)
{
  n <- nrow(H)
   P <- diag(n) - 1/n
   return(-0.5 * P %*% H %*% P)
  }
  B<-mds.tau(fpdist)
  eig <- eigen(B, symmetric = TRUE)
  v <- eig$values[1:2]
#convert negative values to 0.
v[v < 0] <- 0
X <- eig$vectors[, 1:2] %*% diag(sqrt(v))
library(vegan)
km <- kmeans(X,centers= 5, iter.max=1000, nstart=10000) .
#embedding using MDS
cmd<-cmdscale(fpdist)

0

행렬에서 클러스터링을 실행하기 전에 요인 분석 기술 중 하나를 시도하고 가장 중요한 변수 만 유지하여 거리 행렬을 계산할 수 있습니다. 당신이 할 수있는 또 다른 일은 이런 종류의 경우 (최소한의 경험으로는) 더 잘 작동하는 퍼지 방법을 사용하고 먼저 Cmeans, Fuzzy K-medoids 및 특별히 GKCmeans를 시도하는 것입니다.


0

공동 클러스터링은 내가 생각하는 답변 중 하나입니다. 그러나 나는 여기 전문가가 아닙니다. Co-clustring은 신생아 방법이 아니므로 R에서 일부 알고를 찾을 수 있습니다. Wiki는 그 개념을 잘 보여줍니다. 멘토 화되지 않은 또 다른 방법은 그래프 분할입니다 (그러나 그래프가 희박하지 않다는 것을 알 수 있습니다. 그래프 분할은 행렬이 노드 사이의 의미 = 최대 거리 = 유사성에 의해 지배되는 경우 유용 할 것입니다).


0

AFFINITY PROPAGATION을 살펴보십시오.이 기법은 유사성 매트릭스를 입력으로 사용하여 각 클러스터에 대한 대표적인 예와 함께 최적의 클러스터 수를 생성합니다.


2
이것을 확장 하고이 경우이 방법이 어떻게 도움이되는지 설명 할 수 있습니까?
Andy


0

Kruskal 알고리즘을 사용하여 최소 스패닝 트리를 찾을 수 있지만 세 개의 군집을 얻 자마자 끝납니다. 이 방법으로 시도한 결과 언급 한 클러스터 {ABCD}, {EFGH} 및 {IJKL}이 생성됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.