地理的位置座標のクラスタリング(緯度、経度のペア)


51

位置情報クラスタリングの正しいアプローチとクラスタリングアルゴリズムは何ですか?

次のコードを使用して、地理位置座標をクラスター化しています。

import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.vq import kmeans2, whiten

coordinates= np.array([
           [lat, long],
           [lat, long],
            ...
           [lat, long]
           ])
x, y = kmeans2(whiten(coordinates), 3, iter = 20)  
plt.scatter(coordinates[:,0], coordinates[:,1], c=y);
plt.show()

距離関数としてHaversine式ではなくユークリッド距離を使用するため、地理位置情報クラスタリングにK-meansを使用するのは正しいですか?


:Yoouもこの同様の質問を見てとることができdatascience.stackexchange.com/questions/10063/...
VividD

k-meansの実現可能性は、データの場所に依存すると思います。あなたのデータが世界中に広がっている場合、他のユーザーがすでに言っているように、距離はユークリッドではないため機能しません。しかし、データがよりローカルであれば、ジオメトリはローカルユークリッドなので、k-meansで十分です。
フアンイグナシオギル

回答:


7

この場合、K-meansは正しいはずです。k-meansはオブジェクト間のユークリッド距離のみに基づいてグループ化を試みるため、互いに近い位置のクラスターを取得します。

最適なクラスター数を見つけるには、グループ内の平方和距離の「エルボー」プロットを作成してみてください。これは役立つ場合があります(http://nbviewer.ipython.org/github/nborwankar/LearnDataScience/blob/master/notebooks/D3.%20K-Means%20Clustering%20Analysis.ipynb


3
ラップアラウンドポイント上のポイントはどのように処理されますか?
casperOne 14

1
事前に計算された距離行列を使用するか、距離を計算する必要があるときに呼び出すことができる距離関数を提供できるアルゴリズムを見つける必要があります。それ以外の場合は動作しません。
Spacedman 14

ひじがないので、ひじプロットはまったく役に立たないかもしれません。また、結果が異なる可能性があるため、同じクラスター番号でk-meansを複数回実行してください。
グラスホッパー

ので、これが悪い考えであるすべての点がマッピングでめったに良いアイデアではありませんこれは、クラスタ化されます。
リチャード

52

ここでは、K-meansは最も適切なアルゴリズムではありません。

その理由は、k-meansが分散最小化するように設計されているためです。もちろん、これは統計的および信号処理の観点からは見えますが、データは「線形」ではありません。

データは緯度、経度形式であるため、任意の距離関数、特に測地距離関数を処理できるアルゴリズムを使用する必要があります。階層的なクラスタリング、PAM、CLARA、およびDBSCANは、この一般的な例です。

https://www.youtube.com/watch?v=QsGOoWdqaT8は、OPTICSクラスタリングを推奨しています。

k-meansの問題は、+-180度のラップアラウンドに近いポイントを考慮すると簡単にわかります。Haversine距離を使用するためにk-meansをハッキングした場合でも、平均を再計算する更新ステップで、結果がひどくねじ込まれます。最悪の場合、k-meansは決して収束しません!


地理的位置データにより適したクラスタリング方法を提案できますか?
アレックススパーリング

3番目の段落に気づきましたか?
アノニムース

7

GPS座標は、ジオハッシュに直接変換できます。Geohashは、地球を桁数に基づいて異なるサイズの「バケット」に分割します(短いGeohashコードは大きな領域を作成し、小さな領域は長いコードを作成します)。Geohashは、調整可能な高精度クラスタリング手法です。


これは、回答にリンクされているWikipediaの記事ごとにK-Meansが行うのと同じ180度のラップアラウンドの問題に苦しんでいるようです。
ノーマンH

うん!プラスコードは非常に優れているplus.codes
ブライアンSpiering

このソリューションの利点の1つは、ジオハッシュを1回計算する限り、繰り返し比較操作がはるかに高速になることです。
ノーマンH

Geohashには、バケットエッジの場合に問題があります。各バケットの任意のエッジに基づいて、2つの非常に近いポイントが異なるバケットに配置されます。
ダンG

5

私はおそらく私の答えに非常に遅れていますが、まだジオクラスタリングを扱っているのであれば、この研究が面白いと思うかもしれません。地理データを分類するための2つのかなり異なるアプローチの比較を扱います:K-meansクラスタリングと潜在クラス成長モデリング。

研究の画像の1つ:

ここに画像の説明を入力してください

著者らは、最終結果は全体的に類似しており、LCGMがK-meansを過剰に使用している側面がいくつかあると結論付けました。


5

これにはHDBSCANを使用できます。pythonパッケージは、laters / lonポイント間の距離を適切に計算するHaversine distanceをサポートしています。

ドキュメントで言及しているように、これを機能させるに、まずポイントをラジアンに変換する必要があります。次のpsuedocodeがトリックを行うはずです。

points = np.array([[lat1, lon1], [lat2, lon2], ...])
rads = np.radians(points)
clusterer = hdbscan.HDBSCAN(min_cluster_size=N, metric='haversine')
cluster_labels = clusterer.fit_predict(points)

0

ロケーションをクラスター化するk-meansアルゴリズムは、悪いアイデアです。あなたの場所は世界中に広がることができ、クラスターの数を予測することはできません。クラスターを1にすると、その場所は1つのクラスターにグループ化されます。同じために階層クラスタリングを使用しています。



-1

HBScanには永遠に時間がかかるため、Kmeansクラスタリングを使用してください。プロジェクトの1つで試して終了しましたが、Kmeansを使用して目的の結果を得ました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.