:PostGISのための少なくとも二つの良好なクラスタリング方法があるk個(VIA -means kmeans-postgresql
閾値距離内の拡張)またはクラスターの幾何学的形状(PostGISの2.2)
1)k-とはkmeans-postgresql
インストール: POSIXホストシステムにPostgreSQL 8.4以上が必要です(MS Windowsのどこから始めればいいのかわかりません)。これをパッケージからインストールしている場合は、開発パッケージ(postgresql-devel
CentOSなど)も持っていることを確認してください。ダウンロードして解凍します:
wget http://api.pgxn.org/dist/kmeans/1.1.0/kmeans-1.1.0.zip
unzip kmeans-1.1.0.zip
cd kmeans-1.1.0/
ビルドする前に、USE_PGXS
環境変数を設定する必要があります(以前の投稿ではMakefile
、のこの部分を削除するように指示されていましたが、これは最良のオプションではありませんでした)。これらの2つのコマンドのいずれかがUnixシェルで機能するはずです。
# bash
export USE_PGXS=1
# csh
setenv USE_PGXS 1
次に、拡張機能をビルドしてインストールします。
make
make install
psql -f /usr/share/pgsql/contrib/kmeans.sql -U postgres -D postgis
(注:Ubuntu 10.10でもこれを試しましたpg_config --pgxs
が、パスが存在しないので運がありません!これはおそらくUbuntuパッケージングのバグです)
使用法/例:ポイントのテーブルがどこかにあるはずです(QGISで多数の疑似ランダムポイントを描画しました)。ここに私がやったことの例があります:
SELECT kmeans, count(*), ST_Centroid(ST_Collect(geom)) AS geom
FROM (
SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
FROM rand_point
) AS ksub
GROUP BY kmeans
ORDER BY kmeans;
ウィンドウ関数の5
2番目の引数で指定したI kmeans
は、5つのクラスターを生成するためのK整数です。これを任意の整数に変更できます。
以下に、私が描いた31個の疑似ランダムポイントと、各クラスターのカウントを示すラベルが付いた5つの重心を示します。これは、上記のSQLクエリを使用して作成されました。
また、ST_MinimumBoundingCircleを使用してこれらのクラスターがどこにあるかを示すこともできます。
SELECT kmeans, ST_MinimumBoundingCircle(ST_Collect(geom)) AS circle
FROM (
SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
FROM rand_point
) AS ksub
GROUP BY kmeans
ORDER BY kmeans;
2)しきい値距離内のクラスタリング ST_ClusterWithin
この集約関数はPostGIS 2.2に含まれており、すべてのコンポーネントが互いに距離内にあるGeometryCollectionの配列を返します。
以下に使用例を示します。100.0の距離が、5つの異なるクラスターをもたらすしきい値です。
SELECT row_number() over () AS id,
ST_NumGeometries(gc),
gc AS geom_collection,
ST_Centroid(gc) AS centroid,
ST_MinimumBoundingCircle(gc) AS circle,
sqrt(ST_Area(ST_MinimumBoundingCircle(gc)) / pi()) AS radius
FROM (
SELECT unnest(ST_ClusterWithin(geom, 100)) gc
FROM rand_point
) f;
最大の中央クラスターには、65.3単位または約130の囲み半径があり、これはしきい値よりも大きくなっています。これは、メンバージオメトリ間の個々の距離がしきい値よりも小さいため、1つの大きなクラスターとして結び付けられるためです。