例として、私は、次の入力データを持っている(私が働いているポイントクラウドはより複雑である)ポイントクラウドクラスター分析 - バイナリ行列から識別クラスタ
Data = [1,1,1,1,1],[1,1,2,1,1],[2,2,2,1,1],[3,3,3,1,1],[4,4,4,1,1],[5,5,5,1,1],[50,50,50,1,1],[95,95,95,1,1],[96,96,96,1,1],[97,97,97,1,1],[98,98,98,1,1],[99,99,99,1,1],[2,2,3,1,1],[2,2,1,1,1],[2,2,4,1,1]
クラスタリングアルゴリズムバイナリの上三角行列を与えます(接続行列と呼ぶことができます)。 A 1は、2つの点が接続されていることを意味します。例えば。ポイントID 0(行0)は、それ自体(列0)、および1,2,3,12,13,14に接続されています。しかし、ポイント4と5は、また、3、12、13を介して到達され、そして14
[ 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 1. 0. 1.]
[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
Iは、sは上記からバイナリ行列でrowclustering(S)で行ごとのクラスタを識別することができます。
def rowclustering(s):
r = 0
idx = []
while r < size(s,0):
row = []
for i in range(size(s,1)):
if s[r][i] == 1:
row = row + [i]
r = r + 1
idx = idx + [row]
return idx
そして返さIDXです:
idx = [[0, 1, 2, 3, 12, 13, 14], [1, 2, 3, 12, 13, 14], [2, 3, 4, 12, 13, 14], [3, 4, 5, 12, 13, 14], [4, 5, 12, 14], [5], [6], [7, 8, 9], [8, 9, 10], [9, 10, 11], [10, 11], [11], [12, 13, 14], [13, 14], [14]]
行のいくつかは、共通のIDを介して接続されているので、今、明らかに15より少ないクラスタが存在する(例えばID 4および5を見て) 。私が持っていたいのです。私はIDXは、rowclusteringの結果であり、ことをしている(S)(IDX、f)のクラスタリングを()関数を作成しようとしたとfが最初だろう
result = [[0, 1, 2, 3, 4, 5, 12, 13, 14], [6], [7, 8, 9, 10, 11]]
idxの行、たとえば[0,1,2,3,12,13,14]。ただし、この機能は正常に終了しません。すべての接続(idx IDの接続)が行われた後、関数を中断する適切なコードは何でしょうか?
def clustering(idx,f):
for i in f:
f = f + idx[i]
f = list(set(f))
clustering(idx,f)
return
私が解決しようとしている問題は、一種の自己成長手順です。関数クラスタリングは、すべての可能なポイント接続が行われるまで自身を呼び出す必要があります。これはidxまたは接続マトリックス(マトリックス削減?)のidxまたは(おそらく良い)で行うことができます。
ご協力いただきありがとうございます。私の質問を明確にするかどうかを教えてください。ありがとう。
あなたのクラスタリングは、(IDX、F)関数が返すことはできません、それだけで – portforwardpodcast
がDBSCANを見て、シングルリンクをお持ちのスタックオーバーフローまで再帰ます。しかし、1ではなくconnected = 0が必要です。 –