への入力linkage()
は、m 次元空間の n 点を表す nxm 配列、または圧縮された距離行列を含む 1 次元配列のいずれかです。あなたの例では、mat
は 3 x 3 であるため、3 つの 3 次元ポイントをクラスタリングしています。クラスタリングは、これらのポイント間の距離に基づいています。
ここで mat と 1-mat が同一のクラスタリングを提供するのはなぜですか?
クラスタリングはポイント間の距離に基づいており、データ セット全体の反射 ( ) も平行移動 ( ) もポイント間の相対距離を変更しないため、配列mat
とは同じクラスタリングを生成します。1-mat
-mat
mat + offset
ノードのペア間の距離を比較できるように、デンドログラムを使用してツリーの各枝に沿って距離に注釈を付けるにはどうすればよいですか?
以下のコードでは、デンドログラムによって返されたデータを使用して、対応する距離でダイアグラムの水平セグメントにラベルを付ける方法を示します。icoord
キーに関連付けられた値dcoord
は、図の各 3 セグメントの逆 U の x 座標と y 座標を示します。このaugmented_dendrogram
データでは、デンドログラムの各水平線分の距離 (y 値) のラベルを追加するために使用されます。
from scipy.cluster.hierarchy import dendrogram
import matplotlib.pyplot as plt
def augmented_dendrogram(*args, **kwargs):
ddata = dendrogram(*args, **kwargs)
if not kwargs.get('no_plot', False):
for i, d in zip(ddata['icoord'], ddata['dcoord']):
x = 0.5 * sum(i[1:3])
y = d[1]
plt.plot(x, y, 'ro')
plt.annotate("%.3g" % y, (x, y), xytext=(0, -8),
textcoords='offset points',
va='top', ha='center')
return ddata
配列の場合mat
、拡張デンドログラムは次のとおりです。
したがって、点「a」と「c」は 1.01 単位離れており、点「b」はクラスター ['a', 'c'] から 1.57 単位離れています。
フラグが無視されているようshow_leaf_counts
ですが、各クラスのオブジェクトの数が表示されるようにオンにする方法はありますか?
このフラグshow_leaf_counts
は、元のデータ ポイントの一部が葉として表示されていない場合にのみ適用されます。たとえば、 の場合trunc_mode = "lastp"
、最後のp
ノードのみが表示されます。
100 ポイントの例を次に示します。
import numpy as np
from scipy.cluster.hierarchy import linkage
import matplotlib.pyplot as plt
from augmented_dendrogram import augmented_dendrogram
# Generate a random sample of `n` points in 2-d.
np.random.seed(12312)
n = 100
x = np.random.multivariate_normal([0, 0], np.array([[4.0, 2.5], [2.5, 1.4]]),
size=(n,))
plt.figure(1, figsize=(6, 5))
plt.clf()
plt.scatter(x[:, 0], x[:, 1])
plt.axis('equal')
plt.grid(True)
linkage_matrix = linkage(x, "single")
plt.figure(2, figsize=(10, 4))
plt.clf()
plt.subplot(1, 2, 1)
show_leaf_counts = False
ddata = augmented_dendrogram(linkage_matrix,
color_threshold=1,
p=6,
truncate_mode='lastp',
show_leaf_counts=show_leaf_counts,
)
plt.title("show_leaf_counts = %s" % show_leaf_counts)
plt.subplot(1, 2, 2)
show_leaf_counts = True
ddata = augmented_dendrogram(linkage_matrix,
color_threshold=1,
p=6,
truncate_mode='lastp',
show_leaf_counts=show_leaf_counts,
)
plt.title("show_leaf_counts = %s" % show_leaf_counts)
plt.show()
これらは、データ セット内のポイントです。
p=6
と を使用するとtrunc_mode="lastp"
、 dendrogram
デンドログラムの「上部」のみが表示されます。の効果を次に示しますshow_leaf_counts
。