
書記が数学やるだけ#575 階層型クラスタリング
クラスタリングの簡単な例を示してみる。
問題
説明
階層型クラスタリングでは,距離の近い要素を集めることで樹形図を作っていく。
解答
各点同士の距離を求め,最も短いものをまとめていく。
これを1つになるまで繰り返して,まとめたものが以下の樹形図である。
Ward法では,クラスター内の平方和を最小化することで樹形図を作っていく。これは最短距離法に比べ鎖効果が起きにくいとされる。
digitsデータは,数字の手書き文字をドットで表したものである。今回はそのうち上10個のデータについてクラスタリングを実行する。
#digitsデータ
from pandas import DataFrame
import matplotlib.pyplot as plt
from collections import defaultdict
from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import linkage, fcluster, dendrogram
from sklearn import datasets
digits = datasets.load_digits()
#画像の可視化
images_and_labels = list(zip(digits.images, digits.target))
for index, (image, label) in enumerate(images_and_labels[:10]):
plt.subplot(2, 5, index + 1)
plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
plt.axis('off')
plt.title('%i' % label)
plt.show()各データは64次元のベクトル(元は8×8)として表現される。次元が上がっても距離の計算は同じようにできる。
#ベクトル表示
df = DataFrame(digits.data[:10])
df最短距離法とWard法のそれぞれを実行してみる(距離は共にユークリッド距離)。
# クラスタリングの実行(最短距離法)
clu = linkage(df, method='single', metric='euclidean')
# 描画領域の定義
plt.figure(num=None, figsize=(16, 9))
# 樹形図の作成・出力
dendrogram(clu)
plt.show()# クラスタリングの実行(Ward法)
clu = linkage(df, method='ward', metric='euclidean')
# 描画領域の定義
plt.figure(num=None, figsize=(16, 9))
# 樹形図の作成・出力
dendrogram(clu)
plt.show()見た感じ,Ward法の方がうまく分離できていそうである。
本記事のもくじはこちら:









