2017-01-01 4 views
0

私は3つの行列を比較します。それぞれ5x6です。もともと、階層的クラスタリングを使用して行列をクラスタリングし、最も類似した行列をグループ化し、類似性の閾値を与えたいと考えました。デンドログラムまたは他のプロットからの距離行列

私はPythonでそのような機能を見つけることができませんでしたので、私は距離測定を手で実装しました。(p-norm where p=2)。今私は3x3の距離行列を持っています(私はこれも類似行列です)。

私は今、樹状図を作成しようとしています。これは私のコードであり、これは間違っています。 I は、が最も類似したマトリックスのクラスターを示すグラフ(可能であれば樹形図)を生成したい。行列0,1,2の0と2は同じであり、最初に一緒にクラスター化され、1が異なる必要があります。

> 0  1 2 
0 0.0 2.0 3.85e-16 
1 2.0 0.0 2.0 
2 3.85e-16 2.0 0.0 

コード::これは出力され

from scipy.cluster.hierarchy import dendrogram 
import matplotlib.pyplot as plt 
import numpy as np 
from scipy.cluster.hierarchy import linkage 
mat = np.array([[0.0, 2.0, 3.8459253727671276e-16], [2.0, 0.0, 2.0], [3.8459253727671276e-16, 2.0, 0.0]]) 
dist_mat = mat 
linkage_matrix = linkage(dist_mat, "single") 
dendrogram(linkage_matrix, color_threshold=1, labels=["0", "1", "2"],show_leaf_counts=True) 
plt.title=("test") 
plt.show() 

enter image description here

リンケージ(dist_matの意味とは何か、「単一

は距離行列は次のようになります')?私は出力グラフを、距離が0と1の間の2.0(たとえば)のようなものに見えると仮定しました。 enter image description here

これらのデータをより適切に表現する方法はありますか?点の代わりにいくつかの行列をとり、距離行列を比較して形成し、その後にクラスター化する関数がありますか?私は、これらの行列の違いを視覚化する方法について、他の提案をしています。

+0

これは正しいように思える、それは最初のクラス0と2をグループ化し、それらの両方が1でグループ化されていることを意味高さは距離であり、(0,2)のクラスターは約3.4の距離を持っているので、すべてが正常に動作しています – JeD

+0

@JeD - ありがとうございます。点の代わりにいくつかの行列をとり、距離行列を比較して形成し、その後にクラスター化する関数がありますか? – amc

答えて

1

linkageの最初の引数は、平方距離行列であってはなりません。 condensed distance matrixである必要があります。あなたの場合、それはnp.array([2.0, 3.8459253727671276e-16, 2])になります。シェイプ(m, n)linkageに二次元配列を渡す場合は、scipy.spatial.distance.squareform

を用いて凝縮フォームに二乗距離行列から変換することができ、それはn次元空間におけるm点の配列として扱い、それが距離を計算しますそれらの点自体のそのため、正方形の距離行列を渡したときにエラーが発生しなかったのですが、間違ったプロットがあります。 linkageの文書化されていない機能です。

また、距離3.8e-16が非常に小さいため、点0と点2の間のリンクに関連付けられた水平線がプロット内に表示されないことがあります。 -itはx軸上にあります。

ここにスクリプトの修正版があります。この例では、その小さな距離を0.1に変更したので、関連するクラスタはx軸によって隠されていません。ここで

import numpy as np 

from scipy.cluster.hierarchy import dendrogram, linkage 
from scipy.spatial.distance import squareform 

import matplotlib.pyplot as plt 


mat = np.array([[0.0, 2.0, 0.1], [2.0, 0.0, 2.0], [0.1, 2.0, 0.0]]) 
dists = squareform(mat) 
linkage_matrix = linkage(dists, "single") 
dendrogram(linkage_matrix, labels=["0", "1", "2"]) 
plt.title("test") 
plt.show() 

スクリプトによって作成されたプロットである:

dendrogram plot

+0

距離行列が非対称である場合、どのように樹状図を得るのですか?どんな助けもありがとう。 – chandan

関連する問題