2017-05-08 16 views
0

현재 문서 항목에서 계층 구조를 조사하고 있습니다. 첫 번째 단계로 내 문서의 벡터 표현을 찾은 다음 문서의 주제 내에 주제가 있는지 여부를 결정하기 위해 계층 적 클러스터링을 사용합니다. 나는 적어도 2 % 원래의 데이터를 담고있는 (중첩 된) 클러스터만을 고려하기를 원한다. 이를 위해 R을 사용하고 있습니다.클러스터 계층 구조 및 중첩 된 클러스터 할당 얻기

이제 클러스터링 결과에서 클러스터 계층을 효율적으로 추출하는 데 어려움을 겪고 있습니다. 클러스터링은 원래 "hclust"기능과 유사한 결과를 제공하는 "빠른 클러스터"패키지로 수행됩니다.

최종 출력물은 다음과 같아야합니다. 두 테이블

클러스터 할당이있을 것이다 :

docID , ClusterLabel 
1, A 
2, A 
3, B 
4, B 
5, B 
3, C 
4, D 
5, C 
... 

클러스터 계층 구조 : 당신이 볼 수 있듯이

Parent, Child 
B, C 
B, D 
... 

이 관찰 3, 4, 5 클러스터 할당 테이블에 여러 번 발생 여기서 클러스터 중 하나는 상위 클러스터의 서브 클러스터입니다. 이것은 Hierarchy 테이블에서 볼 수 있습니다.

현재 "Dendextend"패키지의 cutree.dendogram 함수를 사용하여 k 값의 눈금에 대한 클러스터 할당을 찾은 다음 출력에서 ​​클러스터 계층과 할당을 추론합니다. 그러나이 접근법은 매우 순진한 것으로 많은 수의 관측과 클러스터에서는 매우 느립니다.

이 문제를 효율적으로 처리 할 수있는 방법에 대한 제안은 쉽게 사용할 수있는 패키지를 사용하는 것이 좋습니다.

EDIT : 샘플을 출력 데이터에 대응하는, 다음의 예를 생각해 우리 높이 6의 트리를 절단 할 경우

data <- matrix(data = c(1,2,3,4,5,1,3,5,9,10), nrow = 5, ncol = 2) 
plot(data) 

hc<- hclust(dist(data)) 
plot(hc) 

, 우리는 2 개 클러스터의 출력이라는 및 B를 수득한다. 그러나 높이 4의 나무를 자르면 출력에 A, C 및 D라는 3 개의 클러스터가 생깁니다. 이제 예를 들어 docID 3을 사용한 관찰은 클러스터 C와 마찬가지로 클러스터 B에 있습니다 (트리를 자르는 높이에 따라 다름). 이는 샘플 출력 클러스터 할당의 두 항목에 해당합니다. 클러스터 B는 클러스터 Hierachy 출력에서 ​​볼 수있는 두 개의 클러스터 C 및 D에서 분리됩니다.

이제 내 목표는 클러스터 할당 및 계층 구조의 전체 목록을 얻고, 덤 드로 그램을 아래로 이동하는 것입니다. (하위 클러스터의 관측 값이 일정한 관측 값보다 적 으면 중지하는 것이 바람직 함)

지금까지는 합리적인 효율적인 방법으로이 작업을 수행하지 못했지만 아무도 나에게 제공하지 못할 수도 있습니다. 생각.

+0

안녕하세요 @ Bartdp1, 자체 재현 가능한 예를 사용하여 질문을 업데이트 해 주시겠습니까? –

+0

@TalGalili 질문을 고쳐 주셔서 감사합니다 – BDP1

답변

1

cutree 함수의 k 매개 변수 값의 벡터를받을 수 있으며, 출력은 다음과 같을 것이다 :

> data <- matrix(data = c(1,2,3,4,5,1,3,5,9,10), nrow = 5, ncol = 2) 
> hc<- hclust(dist(data)) 
> cutree(hc, k = 1:5) 
    1 2 3 4 5 
[1,] 1 1 1 1 1 
[2,] 1 1 1 2 2 
[3,] 1 1 2 3 3 
[4,] 1 2 3 4 4 
[5,] 1 2 3 4 5 

이 귀하의 질문에 대답합니까?

+0

2에서 3 클러스터로 갈 때, 컬럼 2의 클러스터 "1"은 클러스터 "1"과 클러스터 "2"라는 두 개의 클러스터로 분할됩니다. 후자의 두 가지는 첫 번째 것의 "자식"이다. 나는 둘 사이의 구별을 유지하기를 원합니다. 그래서 그들은 별개의 레이블을 가져야합니다 (이제는 레이블 "1"이 두 번 발생하기 때문에 그렇지 않습니다). 당연히, 나는 당신이 제공하는 산출물로부터이 모든 것을 도출 할 수 있다는 것을 알 수있다. 그러나 이것은 정보가 멍스트 그램에서 쉽게 얻을 수 있다는 점을 감안할 때 다소 비싸다. 나는 그것을 효율적으로 추출하는 방법을 모르겠습니다. – BDP1

+0

나는 잘 모르겠다. 두 번째 열에는 2와 3 만, 세 번째 열에는 3,4,5 등이 필요합니까? –

+0

아닙니다. 처음에는 hclust 출력에서 ​​원래 질문과 같이 샘플 출력을 추출하려고합니다. 그래서 클러스터 할당 목록을 원합니다. Clusers가 hierachial clustering에서 병합 될 때 observations는 "parent"와 "child"클러스터에 모두 있기 때문에 관찰은이 목록에서 여러 번 발생합니다. 더욱이, 나는 분담 -> 아동 관계의 목록을 얻고 싶다. 레코드의 경우, dendextend가이 기능 (또는 사용할 부분)을 가지고 있는지 확실하지 않지만이 코드를 효율적으로 코딩하는 방법에 대한 올바른 방향으로 밀어 넣기를 기대했습니다. – BDP1