web-dev-qa-db-ja.com

同じサイズのk個のクラスターにn個の点をグループ化します

重複の可能性:
K-クラスターサイズが等しいアルゴリズムのバリエーションを意味します

編集:casperOneのように、この質問は重複していると私に指摘します。とにかくここにこれをカバーするより一般化された質問があります: https://stats.stackexchange.com/questions/8744/clustering-procedure-where-each-cluster-has-an-equal-number-of-ポイント

私の要件

プロジェクトでは、n個の点(x、y)を同じサイズ(n/k)のk個のクラスターにグループ化する必要があります。 xとyが二重浮動小数点数の場合、nは100から10000の範囲で、kは2から100の範囲です。また、アルゴリズムが実行される前にkがわかっています。

私の実験

http://en.wikipedia.org/wiki/K-means_clustering アルゴリズムを使用して問題の解決を開始しました。このアルゴリズムは、ほぼ同じサイズの正確にk個のクラスターを生成するために非常に高速に機能します。

しかし、私の問題はこれです。K-meansはほぼ同じサイズのクラスターを生成します。クラスターは正確に同じサイズである必要があります(より正確には、floor(n/k)との間のサイズである必要があります)。 ceil(n/k))。

あなたが私にそれを指摘する前に、はい、私はここで最初の答えを試しました K-は等しいクラスターサイズのアルゴリズムのバリエーションを意味します 、それは良い考えのように聞こえます。

主なアイデアは、K-meansによって生成されたクラスターの配列を後処理することです。最大のクラスターから最小のクラスターまで。余分なポイントを他の最も近いクラスターに移動することにより、n/kを超えるメンバーを持つクラスターのサイズを縮小します。すでに削減されているクラスターはそのままにしておきます。

これが私が実装した擬似コードです:

n is the number of point
k is the number of cluster
m = n / k (the ideal cluster size)
c is the array of cluster after K-means
c' = c sorted by size in descending order
for each cluster i in c' where i = 1 to k - 1
    n = size of cluster i - m (the number of point to move)
    loop n times
        find a point p in cluster i with minimal distance to a cluster j in c' where j > i
        move point p from cluster i to cluster j
    end loop
    recalculate centroids
end for each

このアルゴリズムの問​​題は、プロセスの終わり近く(iがkに近づくとき)に、c 'でクラスターjを選択する必要があることです(ここで、j> iは、既に処理されたクラスターをそのままにしておく必要があるため)。私たちが見つけたこのクラスターjは、クラスターiから遠く離れている可能性があるため、クラスターの概念を破っています。

私の質問

要件を満たすことができるポストK-meansアルゴリズムまたはK-meansバリアントはありますか、それとも最初から間違っていて、他のクラスタリングアルゴリズムを見つける必要がありますか?

PS:自分でソリューションを実装してもかまいませんが、ライブラリを使用できれば、理想的にはJavaで実装できれば素晴らしいと思います。

22

このk-meansバリエーションを試してください。

初期化

  • データセットからランダムにkセンターを選択するか、kmeans ++戦略を使用してさらに適切に選択します
  • 各ポイントについて、最も近いクラスターの中心までの距離を計算し、このためのヒープを構築します
  • ヒープからポイントを描画し、クラスターがすでにいっぱいになっていない限り、それらを最も近いクラスターに割り当てます。その場合、次に近いクラスターセンターを計算し、ヒープに再挿入します

最終的に、クラスターごとに+ -1の同じ数のオブジェクトの要件を満たすパーティションを作成する必要があります(最後のいくつかのクラスターにも正しい数があることを確認してください。最初のmクラスターにはceilオブジェクトがあり、残りは正確にfloorです。オブジェクト。)ヒープを使用すると、クラスターが凸状のままになることに注意してください。凸状でなくなった場合は、より適切なスワップ候補が存在するはずです。

反復ステップ

必要条件:「スワッププロポーザル」(異なるクラスター内にあることを好むオブジェクト)を含む各クラスターのリスト。

[〜#〜] e [〜#〜]ステップ:通常のk-meansのように更新されたクラスター中心を計算します

[〜#〜] m [〜#〜]ステップ:すべてのポイントを反復処理します(1つだけ、または1つのバッチですべて)

オブジェクトに最も近いクラスター中心/現在のクラスターよりも近いすべてのクラスター中心を計算します。別のクラスターの場合:

  • 他のクラスターが現在のクラスターよりも小さい場合は、新しいクラスターに移動するだけです
  • 他のクラスター(または距離の短いクラスター)からのスワップ提案がある場合は、2つの要素クラスター割り当てをスワップします(複数のオファーがある場合は、最も改善が大きいものを選択します)
  • それ以外の場合は、他のクラスターのスワップ提案を示します

クラスターサイズは不変のままであり(+-天井/床の差)、オブジェクトは、推定が改善される限り、あるクラスターから別のクラスターに移動されるだけです。したがって、k-meansのようなある時点で収束するはずです。ただし、少し遅くなる可能性があります(つまり、反復回数が多くなります)。

これが以前に公開または実装されたかどうかはわかりません。それは私が試みることです(k-meansを試す場合。はるかに優れたクラスタリングアルゴリズムがあります)。

このトピックの専門家ではないので、マップ上の場所をクラスター化するための簡単なアルゴリズムを考え出す必要がありました。ここでは、すべてのポイントがクラスターの一部である必要があり、クラスターはいくつかの方法でバインドされていました(サイズだけでなく(つまり、ポイントカウント)だけでなく、さまざまな要因に依存する他のいくつかの測定でも)。

最初に「難しい」ポイントを見つけ、そこからクラスターを成長させることで、最良の結果が得られました。 「難しい」ポイントとは、到達するのが難しいポイントのことです。なぜなら、それらは総面積の郊外に一人で横たわるから、あるいは他の点よりも別のクラスター境界条件にぶつかるのを助けるからです。これは、クラスターをきちんと整列させて成長させるのに役立ち、それらを配置するための孤独と対応する手作業をほとんど残しませんでした。

これは、現在のアルゴリズムが通常これらの難しい点を最後に見つける場合に役立ちます。

3
mvds