3

私はHierarchical Clusteringで実験しており、Rではとても簡単ですhclust(as.dist(X),method="average")です。私はPythonのメソッドを見つけました。それは、私の入力距離マトリックスで何が起こっているのかちょっと混乱していることを除いて、かなりシンプルです。階層的クラスタリングのための三角対正方距離行列Python?

私は、相違性マトリックスDF_dissm = 1 - DF_simに変換する類似性マトリックス(DF_c93tom、より小さなテストバージョン、DF_sim)を持っています。

linkageの入力としてこれをscipyから使用していますが、ドキュメントには四角形または三角形の行列が含まれています。私は、lower triangleupper triangle、およびsquare matrixを入力するための別のクラスタを取得します。どうしてこれなの?それはドキュメントの上三角形を望んでいますが、下三角形のクラスターは本当に似ています。

私の質問は、なぜすべてのクラスタが異なるのですか?どちらが正しいか?

このここlinkage

y : ndarray 
A condensed or redundant distance matrix. A condensed distance matrix is a flat array containing the upper triangular of the distance matrix. 

の入力距離行列のドキュメントであることは私のコードである:2D配列は、最初の引数として渡される

import matplotlib.pyplot as plt 
import seaborn as sns 
import numpy as np 
import pandas as pd 
from scipy.cluster.hierarchy import dendrogram, linkage 

%matplotlib inline 

#Test Data 
DF_sim = DF_c93tom.iloc[:10,:10] #Similarity Matrix 
DF_sim.columns = DF_sim.index = range(10) 
#print(DF_test) 
#   0 1   2   3 4 5 6 7 8 9 
# 0 1.000000 0 0.395833 0.083333 0 0 0 0 0 0 
# 1 0.000000 1 0.000000 0.000000 0 0 0 0 0 0 
# 2 0.395833 0 1.000000 0.883792 0 0 0 0 0 0 
# 3 0.083333 0 0.883792 1.000000 0 0 0 0 0 0 
# 4 0.000000 0 0.000000 0.000000 1 0 0 0 0 0 
# 5 0.000000 0 0.000000 0.000000 0 1 0 0 0 0 
# 6 0.000000 0 0.000000 0.000000 0 0 1 0 0 0 
# 7 0.000000 0 0.000000 0.000000 0 0 0 1 0 0 
# 8 0.000000 0 0.000000 0.000000 0 0 0 0 1 0 
# 9 0.000000 0 0.000000 0.000000 0 0 0 0 0 1 

#Dissimilarity Matrix 
DF_dissm = 1 - DF_sim 

#Redundant Matrix 
#np.tril(DF_dissm).T == np.triu(DF_dissm) 
#True for all values 

#Hierarchical Clustering for square and triangle matrices 
fig_1 = plt.figure(1) 
plt.title("Square") 
Z_square = linkage((DF_dissm.values),method="average") 
dendrogram(Z_square) 

fig_2 = plt.figure(2) 
plt.title("Triangle Upper") 
Z_triu = linkage(np.triu(DF_dissm.values),method="average") 
dendrogram(Z_triu) 

fig_3 = plt.figure(3) 
plt.title("Triangle Lower") 
Z_tril = linkage(np.tril(DF_dissm.values),method="average") 
dendrogram(Z_tril) 

plt.show() 

enter image description here

答えて

3

scipy.cluster.hierarchy.linkに、 これは一連の観測として扱われますsおよびscipy.spatial.pdist is usedを使用して、観測値間のペアワイズ距離に変換します。

そのようなDF_dissm.valuesとして「距離行列」(サイレント)を通過する誤った結果を生成することを意味するので、この動作についてgithub issueがあります。

だからthe upshot of thisこれら

Z_square = linkage((DF_dissm.values),method="average") 
Z_triu = linkage(np.triu(DF_dissm.values),method="average") 
Z_tril = linkage(np.tril(DF_dissm.values),method="average") 

のいずれも所望の結果を生じないことです。を代わり

  • np.triu_indicesを使用:

    h, w = arr.shape 
    Z = linkage(arr[np.triu_indices(h, 1)], method="average") 
    
  • 又はspatial.distance.squareform

    from scipy.spatial import distance as ssd 
    Z = linkage(ssd.squareform(arr), method="average") 
    
  • または元のポイントにspatial.distance.pdistを適用する:

    Z = hierarchy.linkage(ssd.pdist(points), method="average") 
    
  • または2Dアレイpoints渡し:

    Z = hierarchy.linkage(points, method="average") 
    

import matplotlib.pyplot as plt 
import numpy as np 
from scipy.cluster import hierarchy as hier 
from scipy.spatial import distance as ssd 
np.random.seed(2016) 

points = np.random.random((10, 2)) 
arr = ssd.cdist(points, points) 

fig, ax = plt.subplots(nrows=4) 

ax[0].set_title("condensed upper triangular") 
Z = hier.linkage(arr[np.triu_indices(arr.shape[0], 1)], method="average") 
hier.dendrogram(Z, ax=ax[0]) 

ax[1].set_title("squareform") 
Z = hier.linkage(ssd.squareform(arr), method="average") 
hier.dendrogram(Z, ax=ax[1]) 

ax[2].set_title("pdist") 
Z = hier.linkage(ssd.pdist(points), method="average") 
hier.dendrogram(Z, ax=ax[2]) 

ax[3].set_title("sequence of observations") 
Z = hier.linkage(points, method="average") 
hier.dendrogram(Z, ax=ax[3]) 

plt.show() 

enter image description here

関連する問題