このトピックでは、ST_ClusterDBSCAN関数について説明します。 この関数は、クラスタリングIDを返すウィンドウ関数であり、DBSCAN (DBSCAN) アルゴリズムを使用します。
構文
- 構文1
整数ST_ClusterDBSCAN (ジオメトリwinset geom、float8 eps、整数minpoints);
- 構文2
整数ST_ClusterDBSCANSpheroid (ジオメトリwinset geom、float8 eps、整数minpoints);
パラメーター
パラメーター | 説明 |
geom | 指定するジオメトリオブジェクト。 |
eps | 指定する最小距離。 |
minpoints | epsパラメーターで指定された最小距離内に配置する必要があるジオメトリオブジェクトの最小数。 このパラメーターは、ジオメトリオブジェクトがクラスターのコアジオメトリオブジェクトであるかどうかを識別するために使用されます。 |
説明
- ST_ClusterKMeans関数とは異なり、ST_ClusterDBSCAN関数ではクラスター数を指定する必要はありません。 ST_ClusterDBSCAN関数は、指定した距離と密度を使用して各クラスターを構築します。
- 指定したジオメトリオブジェクトがクラスター内で次のいずれかの条件を満たす場合、ジオメトリオブジェクトはクラスターに追加されます。
- 少なくとも最小数のジオメトリオブジェクトは、ジオメトリオブジェクトまでの最小距離内に配置され、この場合、ジオメトリオブジェクトは、クラスタ内のコアジオメトリオブジェクトであると考えられる。
- コアジオメトリオブジェクトは、ジオメトリオブジェクトまでの最小距離内に配置され、この場合、ジオメトリオブジェクトは、クラスタ内の境界ジオメトリオブジェクトであると考えられる。
境界ジオメトリオブジェクトは、複数のクラスタ内のコアジオメトリオブジェクトまでの最小距離内に位置することができる。 境界ジオメトリオブジェクトが、複数のクラスタ内のコアジオメトリオブジェクトまでの最小距離内に位置する場合、境界ジオメトリオブジェクトは、利用可能なクラスタの1つにランダムに割り当てられ、ST_ClusterDBSCAN関数は、ジオメトリオブジェクトの数が指定された最小数未満であるクラスタを生成することができる。
- 指定したジオメトリオブジェクトがすべてのクラスターで上記の条件を満たさない場合、ST_ClusterDBSCAN関数はジオメトリオブジェクトにクラスター番号NULLを割り当てます。
- ST_ClusterDBSCAN関数は、ウィンドウ関数である。
- 構文1のST_ClusterDBSCAN関数を使用してクラスタリングすると、ユークリッド距離が使用され、epsパラメーターの値は座標間のユークリッド距離に基づいて計算されます。
- 構文2のST_ClusterDBSCANSpheroid関数を使用してクラスタリングすると、楕円体上のジオメトリオブジェクトの長さが使用されます。
例えば、ジオメトリがSRID (spatial reference identifier) を有し、SRIDが経度および緯度で表される場合、メートル単位で測定されるSRIDの座標系でクラスタリングが実行される。
例
SELECT ST_ClusterDBSCAN(geom,2,1) over() ,st_AsText(geom)
FROM (SELECT unnest(ARRAY['POINT (0 0)')::geometry,
'POINT(1 1)'::geometry、
'POINT (-1 -1)'::geometry,
'POINT (-3 -3)'::geometry]) AS geom AS test;
st_clusterdbscan | st_astext
------------------ --------------
0 | ポイント (0 0)
0 | ポイント (1 1)
0 | ポイント (-1 -1)
1 | ポイント (-3 -3)
(4行)