リージョン化によるDBSCAN
DBSCANは、大量のデータを基に、様々なシェイプやサイズのクラスタを検出できる密度ベースのクラスタリング技術です。
このアルゴリズムでは、パラメータとしてクラスタの数は必要ありません。 かわりに、次のパラメータを使用します。
min_samples
: クラスタとみなされるリージョンに必要な最小ポイント数。eps
: ポイントの近傍の検索ポイントの距離しきい値。
アルゴリズムはどこからでも始まる。 少なくともmin_samples
ポイントがeps
の半径内にある場合、近傍のすべてのポイントは同じクラスタの一部とみなされます。 その後、このプロセスは近所のすべてのポイントに対して繰り返されます。 ポイントまたは観測には、次の3つのタイプがあります:
- コア・ポイント: 半径
eps
内の近傍には、少なくともmin_samples
個のポイントがあります。 - ボーダー点: コア・ポイントから到達可能ですが、近所のポイント数は
min_samples
未満です。 - ノイズ・ポイント: コア・ポイントでもボーダー点でもありません。 コア・ポイントから到達できないポイントです。
次のイメージは、DBSCANアルゴリズムの様々なタイプを表示する例です。
標準的なDBSCANクラスタリングでは、観測の空間ロケーションが完全に考慮されていません。 空間データにこのアルゴリズムを適用すると、多くの場合、クラスタのデータ・ポイントが空間リージョンに分散されます。 リージョン化は、DBSCANアルゴリズムに空間コンテキストを提供するために使用されます。このようにして、同じクラスタの観測は、属性だけでなく、その空間ロケーションでも同様です。
リージョン化を使用するDBSCANアルゴリズムでは、次のステップを実行します:
- パラメータを指定する
DBScanClustering
クラスのインスタンスを作成:min_samples
、eps
、およびspatial_weights_definition
。 - データをパラメータとして渡す
fit
メソッドをコールして、モデルをトレーニングします。 -
labels_ property
は、各監視に割り当てられたラベルを示します。 ノイズ・ポイントには -1というラベルが付いています。 ラベルと各観測ロケーションを使用して、マップ内のクラスタをビジュアル化します。
eps
パラメータを指定しない場合、自動的に推定されます(eps
推定メソッドの詳細は、[ 1 ]を参照)。 初期eps
値は、次のように推定されます:
- kの値が
min_samples
に等しいK近傍法を使用して、隣接するロケーションの各ペア間のユークリッド距離を計算します。 - 観察ごとに最も近い近傍までの距離を取得し、距離を昇順でソートします。
- ソートされた距離をプロットして、エルボカーブを形成します。
eps
の推定値は、肘のロケーションに関連付けられた距離です。この距離は、最初の点と最後の点を横断する線から最も遠い点で表されます。
詳細は、「Oracle Spatial AI Python APIリファレンス」のDBScanClusteringクラスを参照してください。
次のコードは、block_groups
SpatialDataFrame
のトレーニング・データを含むDBSCANモデルに適合しています。 目標は、類似した特性を持つ地域を特定することです。
クラスタリング・モデルは空間パイプラインの最終ステップであり、これにはデータを標準化する前処理ステップが含まれます。 ジオメトリ列はフィーチャとはみなされませんが、空間ウェイトのコンピュートに使用されます。
from oraclesai.weights import KNNWeightsDefinition
from oraclesai.clustering import DBScanClustering
from oraclesai.pipeline import SpatialPipeline
from sklearn.preprocessing import StandardScaler
# Define variables and CRS
X = block_groups[['MEDIAN_INCOME', 'MEAN_AGE', 'MEAN_EDUCATION_LEVEL', 'geometry']].to_crs('epsg:3857')
# Create an instance of DBScanClustering
reg_dbscan = DBScanClustering(eps=0.9,
min_samples=5,
spatial_weights_definition=KNNWeightsDefinition(k=30))
# Add the model into a Spatial Pipeline with a preprocessing step
reg_dbscan_pipeline = SpatialPipeline([('scale', StandardScaler()), ('clustering', reg_dbscan)])
# Train the model
reg_dbscan_pipeline.fit(X)
# Print the labels
print(f"labels = {reg_dbscan_pipeline.named_steps['clustering'].labels_[:20]}")
前述のコードは、DBSCANアルゴリズムとリージョン化を使用して、最初の20観測に割り当てられたラベルを出力します。
labels = [ 0 0 0 0 0 0 0 -1 0 0 0 0 0 -1 0 0 0 0 0 0]