스펙트럴 바이클러스터링 알고리즘

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 행 (샘플) 과 열 (특징) 을 동시에 고려하여 행렬 데이터를 클러스터링하는 스펙트럴 바이클러스터링 알고리즘을 사용합니다. 이 알고리즘은 샘플 간의 패턴뿐만 아니라 샘플의 하위 집합 내 패턴을 식별하여 데이터 내 국소적인 구조를 감지할 수 있도록 설계되었습니다. 이는 특징의 순서 또는 배열이 고정된 데이터 세트 (예: 이미지, 시계열 또는 게놈) 에 특히 적합합니다. scikit-learn 라이브러리를 사용하여 체커보드 데이터 세트를 생성하고 스펙트럴 바이클러스터링 알고리즘을 사용하여 바이클러스터링을 수행할 것입니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

샘플 데이터 생성

make_checkerboard 함수를 사용하여 샘플 데이터를 생성합니다. shape=(300, 300) 내의 각 픽셀은 고르게 분포된 값을 색상으로 나타냅니다. 노이즈는 정규 분포에서 추가되며, noise에 선택된 값은 표준 편차입니다.

from sklearn.datasets import make_checkerboard
from matplotlib import pyplot as plt

n_clusters = (4, 3)
data, rows, columns = make_checkerboard(
    shape=(300, 300), n_clusters=n_clusters, noise=10, shuffle=False, random_state=42
)

plt.matshow(data, cmap=plt.cm.Blues)
plt.title("Original dataset")
_ = plt.show()

데이터 섞기

데이터를 섞고 나중에 SpectralBiclustering를 사용하여 재구성하는 것이 목표입니다.

import numpy as np

## 섞인 행 및 열 인덱스의 리스트 생성
rng = np.random.RandomState(0)
row_idx_shuffled = rng.permutation(data.shape[0])
col_idx_shuffled = rng.permutation(data.shape[1])

## 섞인 데이터를 재정의하고 플롯합니다.
data = data[row_idx_shuffled][:, col_idx_shuffled]

plt.matshow(data, cmap=plt.cm.Blues)
plt.title("섞인 데이터 세트")
_ = plt.show()

SpectralBiclustering 적용

모델을 적용하고 얻은 클러스터를 실제 클러스터와 비교합니다. 모델을 생성할 때 데이터셋 생성에 사용했던 클러스터 수 (n_clusters = (4, 3)) 와 동일한 값을 지정하면 좋은 결과를 얻을 수 있습니다.

from sklearn.cluster import SpectralBiclustering
from sklearn.metrics import consensus_score

model = SpectralBiclustering(n_clusters=n_clusters, method="log", random_state=0)
model.fit(data)

## 두 세트의 바이클러스터 유사성을 계산합니다.
score = consensus_score(
    model.biclusters_, (rows[:, row_idx_shuffled], columns[:, col_idx_shuffled])
)
print(f"consensus score: {score:.1f}")

결과 플롯

이제 SpectralBiclustering 모델이 할당한 행 및 열 레이블을 오름차순으로 기반으로 데이터를 재정렬하고 다시 플롯합니다. row_labels_는 0 에서 3 까지, column_labels_는 0 에서 2 까지의 범위를 가지며, 각 행당 4 개의 클러스터와 각 열당 3 개의 클러스터를 나타냅니다.

## 먼저 행, 그 다음 열을 재정렬합니다.
reordered_rows = data[np.argsort(model.row_labels_)]
reordered_data = reordered_rows[:, np.argsort(model.column_labels_)]

plt.matshow(reordered_data, cmap=plt.cm.Blues)
plt.title("바이클러스터링 후; 바이클러스터를 보여주도록 재정렬됨")
_ = plt.show()

마지막 단계로, 모델이 할당한 행 및 열 레이블 간의 관계를 보여주고자 합니다. 따라서 numpy.outer를 사용하여 그리드를 만듭니다. 이 함수는 정렬된 row_labels_column_labels_를 받아 각 레이블이 시각화를 위해 0 대신 1 부터 시작하도록 1 을 더합니다.

plt.matshow(
    np.outer(np.sort(model.row_labels_) + 1, np.sort(model.column_labels_) + 1),
    cmap=plt.cm.Blues,
)
plt.title("재정렬된 데이터의 체커보드 구조")
plt.show()

요약

이 실습에서는 행 (샘플) 과 열 (특징) 을 동시에 고려하여 행렬 데이터를 클러스터링하는 방법으로 스펙트럴 바이클러스터링 알고리즘을 사용하는 방법을 배웠습니다. 체커보드 데이터셋을 생성하고 스펙트럴 바이클러스터링 알고리즘을 사용하여 바이클러스터링했습니다. 또한 모델이 할당한 행 및 열 레이블 간의 관계를 보여주기 위해 결과를 시각화했습니다.