距離行列を使用したクラスタリング


52

Mノードの各ペア間の距離を表す(対称)マトリックスがあります。例えば、

    ABCDEFGHIJKL
A 0 20 20 20 40 60 60 60100120120120
B 20 0 20 20 60 80 80 80 120140140140
C 20 20 0 20 60 80 80 80 120140140140
D 20 20 20 0 60 80 80 80 120140140140
E 40 60 60 60 0 20 20 20 60 80 80 80
F 60 80 80 80 20 0 20 20 40 60 60 60
G 60 80 80 80 20 20 0 20 60 80 80 80
H 60 80 80 80 20 20 20 0 60 80 80 80
I 100120120120 60 40 60 60 0 20 20 20
J 120140140140 80 60 80 80 20 0 20 20
K 120140140140 80 60 80 80 20 20 0 20
L 120140140140 80 60 80 80 20 20 20 0

M各クラスターにノード間の距離が短いノードが含まれるように、クラスターを抽出する方法はありますか(必要に応じてクラスターの数を固定できます)。この例では、クラスターは(A, B, C, D)(E, F, G, H)およびになり(I, J, K, L)ます。

すでにUPGMAとk-meansを試しましたが、結果のクラスターは非常に悪いです。

距離は、ランダムウォーカーがノードAからノードB!= A)に行き、ノードに戻るために取る平均歩数ですA。それM^1/2がメトリックであることは保証されています。k-means を実行するには、重心を使用しません。ノードnクラスター間のc距離はn、のすべてのノード間の平均距離として定義しますc

どうもありがとう :)


1
すでにUPGMAを試した(および試したかもしれない他の)情報を追加することを検討する必要があります:)
BjörnPollex

1
質問があります。k-meansのパフォーマンスが悪いと言ったのはなぜですか?Matrixをk-meansに渡しましたが、完全なクラスタリングを実行しました。k(クラスターの数)の値をk-meansに渡しませんでしたか?

3
@ user12023質問を誤解したと思います。マトリックスは一連のポイントではなく、ポイント間のペアワイズ距離です。少なくとも明らかな方法ではなく、ポイント間の距離だけで(実際の座標ではない)ポイントのコレクションの重心を計算することはできません。
スタンピージョーピート

7
k-meansは距離行列をサポートしていません。ポイントツーポイント距離を使用することはありません。したがって、マトリックスをベクトルとして再解釈し、これらのベクトルで実行した必要があると仮定することができます ...おそらくあなたが試した他のアルゴリズムでも同じことが起こりました:生データを期待し、距離マトリックスを渡しました。
アノニムース

回答:


38

いくつかのオプションがあります。

k-medoidsクラスタリング

最初に、k-meansクラスタリングを使用する代わりに、medoid(pam)の周りでパーティション分割を試みることができます。これはより堅牢で、より良い結果が得られます。Van der Laanはアルゴリズムを作り直しました。自分で実装する場合は、彼の記事を読む価値があります。

大規模なデータセットには、特定のk-medoidクラスタリングアルゴリズムがあります。このアルゴリズムはRではClaraと呼ばれ、データ内のグループ検索:クラスター分析の概要の第3章で説明されてい ます。Kaufman、LおよびRousseeuw、PJ(1990)。

階層的クラスタリング

UPGMAの代わりに、他のいくつかの階層クラスタリングオプションを試すことができます。まず、階層型クラスタリングを使用する場合は、パーティション化方法を適切に定義してください。この分割方法は、基本的に、観測とクラスター間の距離の計算方法です。私は主にWardの方法または完全なリンケージを使用しますが、他のオプションを選択することもできます。

まだ試しているかどうかはわかりませんが、系統発生アプリケーションでは、UPGMAよりも単一結合法または近隣結合がしばしば好まれます。まだ試していない場合は、多くの場合非常に良い結果が得られるため、試してみることもできます。


Rでは、パッケージクラスターを確認できます。記述されているすべてのアルゴリズムはそこに実装されています。?pam、?clara、?hclust、...を参照してください。?kmeansのアルゴリズムの異なる実装も確認してください。別のアルゴリズムを選択すると、クラスタリングが大幅に改善される場合があります。


編集:何かを考えてみてください:グラフやノードなどを使用する場合は、markovクラスタリングアルゴリズムも確認する必要があります。これは、たとえば爆発の類似性に基づいてシーケンスをグループ化する際に使用され、非常に優れたパフォーマンスを発揮します。それはあなたのためにクラスタリングを行うか、あなたが焦点を当てている研究問題を解決する方法に関するいくつかのアイデアを与えることができます。実際にそれについて何も知らないうちに、彼の結果は間違いなく見てみる価値があると思います。そう言えば、Stijn van Dongenのこの方法は、私がこれまでに遭遇したクラスタリングで最も素晴らしい結果の1つであると考えています。

http://www.micans.org/mcl/


22

距離行列でクラスターを強調表示する方法の1つは、多次元スケーリングです。個人(ここではノードと呼ぶもの)を2D空間に投影すると、PCAに匹敵するソリューションが提供されます。これは監視されないため、クラスターの数をアプリオリに指定することはできませんが、特定の距離または類似度マトリックスをすばやく要約すると役立つと思います。

データで得られるものは次のとおりです。

tmp <- matrix(c(0,20,20,20,40,60,60,60,100,120,120,120,
                20,0,20,20,60,80,80,80,120,140,140,140,
                20,20,0,20,60,80,80,80,120,140,140,140,
                20,20,20,0,60,80,80,80,120,140,140,140,
                40,60,60,60,0,20,20,20,60,80,80,80,
                60,80,80,80,20,0,20,20,40,60,60,60,
                60,80,80,80,20,20,0,20,60,80,80,80,
                60,80,80,80,20,20,20,0,60,80,80,80,
                100,120,120,120,60,40,60,60,0,20,20,20,
                120,140,140,140,80,60,80,80,20,0,20,20,
                120,140,140,140,80,60,80,80,20,20,0,20,
                120,140,140,140,80,60,80,80,20,20,20,0),
              nr=12, dimnames=list(LETTERS[1:12], LETTERS[1:12]))
d <- as.dist(tmp)
mds.coor <- cmdscale(d)
plot(mds.coor[,1], mds.coor[,2], type="n", xlab="", ylab="")
text(jitter(mds.coor[,1]), jitter(mds.coor[,2]),
     rownames(mds.coor), cex=0.8)
abline(h=0,v=0,col="gray75")

mds

ケースを区別できるように、x座標とy座標に小さなジッターを追加しました。相違点を処理することを希望tmpする1-tmp場合は置き換えますが、これにより本質的に同じ状況が得られます。ただし、単一の凝集基準を使用した階層クラスタリングソリューションは次のとおりです。

plot(hclust(dist(1-tmp), method="single"))

hc

樹状図、またはより堅牢な方法に基づいてクラスターの選択をさらに絞り込むことができます。たとえば、次の関連する質問を参照してください


2

スペクトルクラスタリング[1]には、親和性行列が必要です。クラスタリングによって定義されます。K

L=D1/2AD1/2

ADAij=1dij/max(d)

{Di,i=jAi,jDij=0

での固有値分解である、列として積層固有関数でのみ維持最大の固有ベクトルを、我々は行正規化行列を定義しますL K XXLKX

Yij=Xij(j(Xij)2)1/2

各行は点であり、通常のクラスタリングアルゴリズム(K-meansなど)でクラスタリングできます。R kYRk

ここに私の答えを見て例を見てください:https : //stackoverflow.com/a/37933688/2874779


[1] Ng、AY、Jordan、MI、&Weiss、Y.(2002)。スペクトルクラスタリングについて:分析とアルゴリズム。神経情報処理システムの進歩、2、849-856。Pg.2


2

あなたがしているのは、互いに近いグラフまたはネットワークのノードを一緒にクラスター化しようとしていることです。ネットワークで共同体検出と呼ばれることがあるこの問題専用の研究の全体の分野があります。この観点からあなたの問題を見ることは、おそらく物事を明確にすることができます。

この問題に特化した多くのアルゴリズムがありますが、実際にはそれらのいくつかは、ランダムウォークでノード間の距離を測定するという同じ考えに基づいています。

この問題は、モジュール性の最適化 [1] として定式化されることが多く、クラスタリングのモジュール性は、クラスタリングが密に接続されたクラスター(つまり、ノードが互いに近いクラスター)でネットワークを分離する度合いを測定します。

実際、モジュール性は、1つのステップの後、ランダムウォーカーが最初に同じクラスターにとどまる確率から、2つの独立したランダムウォーカーの同じ確率を引いたものに等しいことを示すことができます[2]。

ランダムウォーカーのステップを増やす場合は、ネットワークのより粗いクラスタリングを探しています。したがって、ランダムウォークのステップ数は、クラスターの階層を回復できる解像度パラメーターの役割を果たします。この場合、ランダムステップウォーカーがtステップ後に初期クラスターに留まる傾向を表す量は、時刻t [2] でのパーティションのマルコフ安定性と呼ばれ、t = 1のときのモジュール性と同等です。

したがって、特定の時間tで安定性を最適化するグラフのクラスタリングを見つけることで問題を解決できます。ここで、tは解像度パラメーターです(tが大きいほどクラスターが大きくなります)。安定性(または解像度パラメーターを使用したモジュール性)を最適化するために最もよく使用される方法の1つは、ルーバンアルゴリズムです [3]。ここで実装を見つけることができます:https : //github.com/michaelschaub/generalizedLouvain

[1] Newman、MEJ&Girvan、M.ネットワーク内のコミュニティ構造の検索と評価。物理学 改訂E 69、026113(2004)。

[2] Delvenne、J.-C.、Yaliraki、SN&Barahona、M.グラフコミュニティの時間スケールにわたる安定性。手続き ナトル Acad。科学 107、12755–12760(2010)。

[3] Blondel、VD、Guillaume、J.-L.、Lambiotte、R.&Lefebvre、E.大規模ネットワークでのコミュニティの迅速な展開。J.スタット メカ。理論経験 2008、P10008(2008)。


1

さて、与えられた類似性マトリックスでK-meansクラスタリングを実行することは可能です。まず、マトリックスを中央に配置してから、マトリックスの固有値を取得する必要があります。最後の最も重要なステップは、最初の2つの固有ベクトルのセットを固有値の対角の平方根に乗算してベクトルを取得し、K-meansを使用して先に進むことです。以下のコードは、その方法を示しています。類似性マトリックスを変更できます。fpdistは類似度行列です。

mds.tau <- function(H)
{
  n <- nrow(H)
   P <- diag(n) - 1/n
   return(-0.5 * P %*% H %*% P)
  }
  B<-mds.tau(fpdist)
  eig <- eigen(B, symmetric = TRUE)
  v <- eig$values[1:2]
#convert negative values to 0.
v[v < 0] <- 0
X <- eig$vectors[, 1:2] %*% diag(sqrt(v))
library(vegan)
km <- kmeans(X,centers= 5, iter.max=1000, nstart=10000) .
#embedding using MDS
cmd<-cmdscale(fpdist)

0

マトリックスでクラスタリングを実行する前に、因子分析手法のいずれかを実行し、最も重要な変数のみを保持して距離マトリックスを計算できます。あなたができるもう一つのことは、この種のケースで(少なくとも私の経験では)より良く動作する傾向のあるファジー手法を使用してみて、最初のCmeans、Fuzzy K-medoids、Specially GKCmeansを試します。


0

共クラスタリングは、私が考える答えの1つです。しかし、ここではエキスパートではありません。Co-clustringは生まれたばかりの方法ではないので、Rでいくつかのアルゴリズムを見つけることができます。wikiはその概念を良い方法で示しています。メンチオ化されていない別の方法はグラフ分割です(ただし、グラフがスパースではなく、マトリックスが値意味=最大距離=ノード間の類似性なしに支配されている場合、グラフ分割は有用です)。


0

AFFINITY PROPAGATIONを調べます。この手法は、入力として類似度マトリックスを受け取り、各クラスターの代表的な例とともに最適な数のクラスターを生成します。


2
これを拡張して、この場合にこの方法がどのように役立つか説明していただけますか?
アンディ


0

Kruskalアルゴリズムを使用して最小全域木を見つけることもできますが、3つのクラスターを取得するとすぐに終了します。この方法で試してみたところ、{ABCD}、{EFGH}、および{IJKL}というクラスターが生成されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.