機械翻訳について

リージョン化によるDBSCAN

DBSCANは、大量のデータを基に、様々なシェイプやサイズのクラスタを検出できる密度ベースのクラスタリング技術です。

このアルゴリズムでは、パラメータとしてクラスタの数は必要ありません。 かわりに、次のパラメータを使用します。

  • min_samples: クラスタとみなされるリージョンに必要な最小ポイント数。
  • eps: ポイントの近傍の検索ポイントの距離しきい値。

アルゴリズムはどこからでも始まる。 少なくともmin_samplesポイントがepsの半径内にある場合、近傍のすべてのポイントは同じクラスタの一部とみなされます。 その後、このプロセスは近所のすべてのポイントに対して繰り返されます。 ポイントまたは観測には、次の3つのタイプがあります:

  • コア・ポイント: 半径eps内の近傍には、少なくともmin_samples個のポイントがあります。
  • ボーダー点: コア・ポイントから到達可能ですが、近所のポイント数はmin_samples未満です。
  • ノイズ・ポイント: コア・ポイントでもボーダー点でもありません。 コア・ポイントから到達できないポイントです。

次のイメージは、DBSCANアルゴリズムの様々なタイプを表示する例です。



標準的なDBSCANクラスタリングでは、観測の空間ロケーションが完全に考慮されていません。 空間データにこのアルゴリズムを適用すると、多くの場合、クラスタのデータ・ポイントが空間リージョンに分散されます。 リージョン化は、DBSCANアルゴリズムに空間コンテキストを提供するために使用されます。このようにして、同じクラスタの観測は、属性だけでなく、その空間ロケーションでも同様です。

リージョン化を使用するDBSCANアルゴリズムでは、次のステップを実行します:

  1. パラメータを指定するDBScanClusteringクラスのインスタンスを作成: min_sampleseps、およびspatial_weights_definition
  2. データをパラメータとして渡すfitメソッドをコールして、モデルをトレーニングします。
  3. 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]