Flatten list of lists & hierarchical clustering

scipy의 계층적 클러스터링을 사용하기 앞서 모든 노드 간의 거리를 이용하여 거리 행렬을 만들고 파일로 저장했다.
저장된 행렬은 압축 행렬(Condensed Matrix) 형태였는데, 파일을 읽어 클러스터링(linkage)을 수행했을 땐 압축 행렬로 인식되지 않았다.
결국 압축 행렬이 거리 행렬로 인식되지 않고 개별 노드로 인식되어 원치 않은 결과가 나왔다.

예를 들어, 51개의 데이터에 대해 압축 행렬의 원소는 51*50 / 2 = 1275개가 되는데, 클러스터링 결과는 51개가 아닌 1275개를 바탕으로 나왔다.

이에 대한 원인은 pandas의 DataFrame을 np.array로 바꾸면서 있었다.

DataFrame은 애초에 테이블 형태의 자료형이기 때문에, np.array로 바꾸는 순간 리스트의 리스트로 저장이 된다.
즉, [1 2 3]으로 저장되는 것이 아니라, [[1], [2]. [3]]으로 저장됐다는 뜻.

이를 평활화(flatten)하니 다시 정상적으로 클러스터링이 수행됐다.
평활화는 이 방법이 가장 깔끔한 듯 하다.

condensed_matrix = [data for list in list_of_lists for data in list]

댓글 남기기