編集: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で実装できれば素晴らしいと思います。
このk-meansバリエーションを試してください。
初期化:
k
センターを選択するか、kmeans ++戦略を使用してさらに適切に選択します最終的に、クラスターごとに+ -1の同じ数のオブジェクトの要件を満たすパーティションを作成する必要があります(最後のいくつかのクラスターにも正しい数があることを確認してください。最初のm
クラスターにはceil
オブジェクトがあり、残りは正確にfloor
です。オブジェクト。)ヒープを使用すると、クラスターが凸状のままになることに注意してください。凸状でなくなった場合は、より適切なスワップ候補が存在するはずです。
反復ステップ:
必要条件:「スワッププロポーザル」(異なるクラスター内にあることを好むオブジェクト)を含む各クラスターのリスト。
[〜#〜] e [〜#〜]ステップ:通常のk-meansのように更新されたクラスター中心を計算します
[〜#〜] m [〜#〜]ステップ:すべてのポイントを反復処理します(1つだけ、または1つのバッチですべて)
オブジェクトに最も近いクラスター中心/現在のクラスターよりも近いすべてのクラスター中心を計算します。別のクラスターの場合:
クラスターサイズは不変のままであり(+-天井/床の差)、オブジェクトは、推定が改善される限り、あるクラスターから別のクラスターに移動されるだけです。したがって、k-meansのようなある時点で収束するはずです。ただし、少し遅くなる可能性があります(つまり、反復回数が多くなります)。
これが以前に公開または実装されたかどうかはわかりません。それは私が試みることです(k-meansを試す場合。はるかに優れたクラスタリングアルゴリズムがあります)。
このトピックの専門家ではないので、マップ上の場所をクラスター化するための簡単なアルゴリズムを考え出す必要がありました。ここでは、すべてのポイントがクラスターの一部である必要があり、クラスターはいくつかの方法でバインドされていました(サイズだけでなく(つまり、ポイントカウント)だけでなく、さまざまな要因に依存する他のいくつかの測定でも)。
最初に「難しい」ポイントを見つけ、そこからクラスターを成長させることで、最良の結果が得られました。 「難しい」ポイントとは、到達するのが難しいポイントのことです。なぜなら、それらは総面積の郊外に一人で横たわるから、あるいは他の点よりも別のクラスター境界条件にぶつかるのを助けるからです。これは、クラスターをきちんと整列させて成長させるのに役立ち、それらを配置するための孤独と対応する手作業をほとんど残しませんでした。
これは、現在のアルゴリズムが通常これらの難しい点を最後に見つける場合に役立ちます。