はじめに
この実験では、行列の行(サンプル)と列(特徴量)の両方を同時に考慮することで、スペクトラルバイクラスタリングアルゴリズムを使ってデータをクラスタリングします。このアルゴリズムは、サンプル間だけでなく、サンプルのサブセット内にもパターンを識別することを目的としており、データ内の局所的な構造を検出することができます。このため、スペクトラルバイクラスタリングは、画像、時系列、ゲノムなど、特徴量の順序や配置が固定されたデータセットに特に適しています。ここでは、scikit-learn ライブラリを使ってチェッカーボードデータセットを生成し、スペクトラルバイクラスタリングアルゴリズムを使ってそれをバイクラスタリングします。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、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
## Creating lists of shuffled row and column indices
rng = np.random.RandomState(0)
row_idx_shuffled = rng.permutation(data.shape[0])
col_idx_shuffled = rng.permutation(data.shape[1])
## Redefining the shuffled data and plot it.
data = data[row_idx_shuffled][:, col_idx_shuffled]
plt.matshow(data, cmap=plt.cm.Blues)
plt.title("Shuffled dataset")
_ = 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)
## Compute the similarity of two sets of biclusters
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 つのクラスタがあります。
## Reordering first the rows and then the columns.
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("After biclustering; rearranged to show biclusters")
_ = plt.show()
最後のステップとして、モデルによって割り当てられた行と列のラベルの関係を示したいと思います。そこで、numpy.outerを使ってグリッドを作成します。これは、ソートされたrow_labels_とcolumn_labels_を取り、各値に 1 を加えて、ラベルが 0 ではなく 1 から始まるようにして、より良い可視化を行います。
plt.matshow(
np.outer(np.sort(model.row_labels_) + 1, np.sort(model.column_labels_) + 1),
cmap=plt.cm.Blues,
)
plt.title("Checkerboard structure of rearranged data")
plt.show()
まとめ
この実験では、行列の行(サンプル)と列(特徴量)の両方を同時に考慮して、データをクラスタリングするための Spectral Biclustering アルゴリズムの使い方を学びました。チェッカーボード状のデータセットを生成し、Spectral Biclustering アルゴリズムを使ってバイクラスタリングしました。また、結果を可視化して、モデルによって割り当てられた行と列のラベルの関係を示しました。