1

私は自分の問題のために独自のクラスタリング アルゴリズムを作成しました (悪いことはわかっています)。それはうまく機能しますが、より速く動作する可能性があります。

アルゴリズムは、入力と同様に値のリスト (1D) を受け取り、次のように機能します。

  1. 各クラスターについて、最も近い隣接クラスターまでの距離を計算します
  2. 近隣 B までの距離が最も小さいクラスター A を選択します
  3. A と B の間の距離がしきい値より小さい場合は、戻ります
  4. AとBを組み合わせる
  5. 1へ。

私はおそらくここで車輪を再発明しました..

これは私のブルート フォース コードです。高速化するにはどうすればよいですか? 私は Scipy と Numpy をインストールしました。

#cluster center as simple average value
def cluster_center(cluster):
  return sum(cluster) / len(cluster)

#Distance between clusters
def cluster_distance(a, b):
  return abs(cluster_center(a) - cluster_center(b))

while True:
  cluster_distances = []

  #If nothing to cluster, ready
  if len(clusters) < 2:
    break

  #Go thru all clusters, calculate shortest distance to neighbor  
  for cluster in clusters:
    cluster_distances.append((cluster, sorted([(cluster_distance(cluster, c), c) for c in clusters if c != cluster])[0]))

  #Find out closest pair 
  cluster_distances.sort(cmp=lambda a,b:cmp(a[1], b[1]))

  #Check if distance is under threshold 15
  if cluster_distances[0][1][0] < 15:
     a = cluster_distances[0][0]
     b = cluster_distances[0][1][1]
     #Combine clusters (combine lists)
     a.extend(b)

     #Form a new cluster list
     clusters = [c[0] for c in cluster_distances if c[0] != b]
  else:
    break
4

1 に答える 1