2

ユーザーが評価する個人の数を減らすために、インタラクティブな遺伝的アルゴリズムでApacheCommonsMathのk-means++クラスターを使用しています。

Commons Mathを使用すると、非常に使いやすくなります。ユーザーはインターフェースを実装するだけで済み Clusterableます。2つの方法があります。

double distanceFrom(T p)これは非常に明確でT centroidOf(Collection<T> p)、ユーザーがクラスターの重心を選択できるようにします。

ユークリッド点で使用する場合、重心は非常に簡単に計算できます。しかし、染色体では、その意味が必ずしも明確ではないため、それは非常に困難です。

私の質問:問題のドメインに依存せずに、重心を選択するための効率的な一般的な方法はありますか?(たとえば、距離を使用して)


編集

さて、これが重心計算のコードです。アイデア:他のすべてのポイントまでの合計距離が最も短いポイントは、図心に最も近いポイントです。

public T centroidOf(Collection<T> c) {
  double minDist = Double.MAX_VALUE;
  T minP = null;

  // iterate through c
  final Iterator<T> it = c.iterator();
  while (it.hasNext()) {
    // test every point p1
    final T p1 = it.next();
    double totalDist = 0d;
    for (final T p2 : c) {
      // sum up the distance to all points p2 | p2!=p1
      if (p2 != p1) {
        totalDist += p1.distanceFrom(p2);
      }
    }

    // if the current distance is lower that the min, take it as new min
    if (totalDist < minDist) {
      minDist = totalDist;
      minP = p1;
    }
  }
  return minP;
}
4

1 に答える 1

1

k-meansには、平均化メトリック(Euclideanなど)が必要です。このようなメトリックとスペースを定義しないと、ポイントの平均が実際にスペース内のポイントであるかどうかさえわかりません。

ただし、k-medoidsを使用することもできます。これは、元のポイントのみをmedoidの候補と見なします(k-meansは、必ずしも元のポイント上にない平均/重心を検出します)。アルゴリズムは、ペアごとの非類似度を最小化するポイントを探します(つまり、distanceFrom)。

于 2012-02-01T23:20:22.457 に答える