DBSCANアルゴリズムは、おそらくあなたが探しているものです。
これは、密度に基づいてポイントのクラスターを見つけるアルゴリズムです。あなたの場合、人気は密であることを意味するので、それを使用してこのタスクを解決できます。2つのパラメータが必要です。
- eps、クラスターを形成するために他のポイントを探す各ポイントの周囲の半径、
- minPts、ノードのグループをクラスターと見なすためにポイントの周囲の半径内に必要なポイントの数。
また、ポイント間の距離を測定する関数も必要です。(緯度、経度)カップル(通常はWGS84形式)があるため、Haversize距離が必要です。
アルゴリズムにはいくつかの実装があります。Javaを使用している場合、Apache Commons Mathは適切な実装を提供します(詳細といくつかのコードスニペットについては、ここを参照してください)。eps = 1.0(半径1 km)およびminPts = 0(クラスターには1つ以上のポイントがあります)でDBSCANClusterer
を呼び出します。ハバーシン距離の実装については、この回答を参照してください( epsに使用されるのと同じ測定単位と一致していることを確認してください)。最後に、サイズを小さくしてクラスターを並べ替え、「人気」で並べ替えます。
Collections.sort(clusters, (o1, o2) ->
Integer.compare(o2.getSize(), o1.getSize());
Cluster<? extends Clusterable> mostPopular = clusters.get(0);
私の記憶が正しければ、この実装は、そのサイズ(ポイント数)に関して2次時間で問題を解決します。直面する問題のすべてのインスタンスが同じサイズの例である場合、問題はありません。