3

私はscipy.cluster.hierarchy.dendrogramの出力がどのように働いているのか把握しようとしています...私はそれがどのように働いているのか分かっていて、出力を使って樹形図を再構成できました私はもう理解していないか、このモジュールのPython 3のバージョンにバグがあります。SciPyの階層的クラスタリング樹形図の出力を解釈する? (おそらくバグが見つかりました...)

この回答、how do I get the subtrees of dendrogram made by scipy.cluster.hierarchyは、dendrogram出力辞書は系統樹を再構築するためにワットdict_keys(['icoord', 'ivl', 'color_list', 'leaves', 'dcoord']) /同じ大きさのすべてのあなたがそれらをzipことができるようにとplt.plotそれらを与えることを意味します。

Python 2.7.11を使用したときには、私はそれほど単純ではありませんでしたが、Python 3.5.1にアップグレードした後、私の古いスクリプトは私に同じ結果を与えていませんでした。

私は非常に単純な繰り返し可能な例のために自分のクラスタを作り直し始めました。そして、Python 3.5.1のバージョンSciPy version 0.17.1-np110py35_1でバグが見つかったと思います。 Scikit-learnデータセットb/cを使うつもりなら、ほとんどの人はそのモジュールをcondaディストリビューションから入手しています。

なぜこれらのライニングが上がっていないのですが、どうしてこのように樹状図を再構成できないのですか?

# Init 
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns; sns.set() 

# Load data 
from sklearn.datasets import load_diabetes 

# Clustering 
from scipy.cluster.hierarchy import dendrogram, fcluster, leaves_list 
from scipy.spatial import distance 
from fastcluster import linkage # You can use SciPy one too 

%matplotlib inline 

# Dataset 
A_data = load_diabetes().data 
DF_diabetes = pd.DataFrame(A_data, columns = ["attr_%d" % j for j in range(A_data.shape[1])]) 

# Absolute value of correlation matrix, then subtract from 1 for disimilarity 
DF_dism = 1 - np.abs(DF_diabetes.corr()) 

# Compute average linkage 
A_dist = distance.squareform(DF_dism.as_matrix()) 
Z = linkage(A_dist,method="average") 

# I modded the SO code from the above answer for the plot function 
def plot_tree(D_dendro, ax): 
    # Set up plotting data 
    leaves = D_dendro["ivl"] 
    icoord = np.array(D_dendro['icoord']) 
    dcoord = np.array(D_dendro['dcoord']) 
    color_list = D_dendro["color_list"] 

    # Plot colors 
    for leaf, xs, ys, color in zip(leaves, icoord, dcoord, color_list): 
     print(leaf, xs, ys, color, sep="\t") 
     plt.plot(xs, ys, color) 

    # Set min/max of plots 
    xmin, xmax = icoord.min(), icoord.max() 
    ymin, ymax = dcoord.min(), dcoord.max() 

    plt.xlim(xmin-10, xmax + 0.1*abs(xmax)) 
    plt.ylim(ymin, ymax + 0.1*abs(ymax)) 

    # Set up ticks 
    ax.set_xticks(np.arange(5, len(leaves) * 10 + 5, 10)) 
    ax.set_xticklabels(leaves, fontsize=10, rotation=45) 

    plt.show() 

fig, ax = plt.subplots() 
D1 = dendrogram(Z=Z, labels=DF_dism.index, color_threshold=None, no_plot=True) 
plot_tree(D_dendro=D1, ax=ax) 

enter image description here

attr_1 [ 15. 15. 25. 25.] [ 0.   0.10333704 0.10333704 0.  ] g 
attr_4 [ 55. 55. 65. 65.] [ 0.   0.26150727 0.26150727 0.  ] r 
attr_5 [ 45. 45. 60. 60.] [ 0.   0.4917828 0.4917828 0.26150727] r 
attr_2 [ 35. 35. 52.5 52.5] [ 0.   0.59107459 0.59107459 0.4917828 ] b 
attr_8 [ 20. 20. 43.75 43.75] [ 0.10333704 0.65064998 0.65064998 0.59107459] b 
attr_6 [ 85. 85. 95. 95.] [ 0.   0.60957062 0.60957062 0.  ] b 
attr_7 [ 75. 75. 90. 90.] [ 0.   0.68142114 0.68142114 0.60957062] b 
attr_0 [ 31.875 31.875 82.5 82.5 ] [ 0.65064998 0.72066112 0.72066112 0.68142114] b 
attr_3 [ 5.  5.  57.1875 57.1875] [ 0.   0.80554653 0.80554653 0.72066112] b 

ここでは色具合が正しくマッピングされていませんチェックアウト/ Oラベルとx軸のためだけicoordenter image description here

ワット一つです。 icoord[ 15. 15. 25. 25.]attr_1となりますが、値はattr_4のようになります。また、最後の葉(attr_9)には至らず、長さはicoordで、dcoordivlのラベルの1よりも小さいです。

print([len(x) for x in [leaves, icoord, dcoord, color_list]]) 
#[10, 9, 9, 9] 

答えて

3

icoorddcoordcolor_listはないの葉、リンクを記述する。 icoordおよびdcoordは、プロット内の各リンクの「アーチ」の座標(すなわち、逆さまなUまたはJの形状)を示し、color_listは、それらのアーチの色です。フルプロットでは、あなたが観察したように、icoordなどの長さは、ivlの長さより1つ小さいでしょう。

icoorddcoord、およびcolor_listのリストには、ivlのリストが並んでいません。彼らはさまざまなものと関連しています。

+1

''デンドログラムの出力辞書 ''と 'カスタムカラー辞書'を使って ''デンドログラムプロット 'を再構築する方法か、' {link = color_func''を{key = leaf:値=色} '?上記の方法でいくつかのチュートリアルがあり、正式な答えがコミュニティにとって良いと思います。 –

関連する問題