2017-10-19 9 views
0

3Dポイントのペア(またはインデックス番号のみ)で構成されるデータセットを接続されたクラスタに分割する方法はありますか?すなわち、a = c、b = c、a = dまたはb = d)、または共通点を共有している場合(a = c、b = c、a = dまたはb = d) 1つまたは複数の他のペアの連鎖であり、それぞれが1つのペアから別のペアへ前のものと共通の点を共有します。繰り返しデータによるクラスタリング

例えば、ペアのリスト次のよう

[[1,2],[2,3],[4,5],[6,7],[7,8],[9,4],[8,5]] 

がグループ化される:最初のクラスタ、ペア(1,2)と(2,3)で

[[1,2],[2,3]] 

[[4,5],[6,7],[7,8],[9,4],[8,5]] 

ポイント2を共有し、クラスタ外のペアとポイントを共有しない。第2のクラスタでは、ペア(4,5)は(9,4)および(8,5)と共通点を共有し、(8,5)は共通点を(7,8)と(6,7)。

データは元々numpy配列に格納されていますが、出力形式はあまり重要ではありません。

その後、個々のクラスタを構成するデータにアクセスできる必要があります。 networkxを使用して

+2

私はグループ化のロジックを理解することはできません。 '[1,2]、[2,3]'がクラスター内にある場合、 '[6,7]、[7,8]'はなぜかそれ自身のクラスターにもないのはなぜですか? 「繰り返しポイント」とはどういう意味ですか? – roganjosh

+1

@roganjosh私は、グラフの接続されたコンポーネントを見つけることで問題を表すことができると考えています。ここで、与えられたペアはエッジであり、数字はノードです。 OP、networkxをチェックしてください。 –

+0

@AlexHall不幸にも、質問にOP(またはOPではない)のコメントを追加するために、ランダムな編集が助けになるわけではありません。しかし、それでも、必要な出力を接続グラフの中断を識別すると解釈し、残りを別のリストにダンプしますか? '[6,7]、[7,8]'はまだ接続されていますが、残りの部分は表示されます。 – roganjosh

答えて

2

import networkx 

edges = [[1, 2], [2, 3], [4, 5], [6, 7], [7, 8], [9, 4], [8, 5]] 

graph = networkx.Graph(edges) 
print(list(networkx.connected_components(graph))) 

出力:

[set([1, 2, 3]), set([4, 5, 6, 7, 8, 9])] 
+0

ちょうどnetworkxを自分で見つけました。あなたの仕事のためにありがとうございます。 –

関連する問題