【機械学習】クラスタリングアルゴリズム ~DBSCANの基礎理解と実践事例~

序文

機械学習におけるクラスタリングは、一般的な教師なし学習手法であり、その目的は、データセット内のデータ ポイントを、各グループ間で類似した特性を持つ異なるグループに分割することです。クラスタリングは、画像セグメンテーション、ソーシャルメディア分析、医療データ分析などのさまざまなアプリケーションで使用できます。DBSCAN は、さまざまな分野で広く使用されているクラスタリング アルゴリズムです。

1. DBSCANアルゴリズムの原理

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) は、密度ベースのクラスタリング アルゴリズムであり、その原理は、データ ポイントの周囲の密度に基づいてクラスターを決定することです。DBSCAN では、密度の高い領域はクラスターと見なされ、密度の低い領域はノイズと見なされます。

DBSCAN のアルゴリズム フローは次のとおりです。

  • 開始点としてデータ ポイントを選択し、そのポイントから指定された距離内にあるすべてのデータ ポイントを検索します。
  • 指定した範囲内の距離にあるデータ ポイントの数が指定したしきい値以上の場合、データ ポイントをコア ポイントとしてマークします。
  • すべてのコア ポイントについて、距離が指定された範囲内にあるすべてのデータ ポイントが同じクラスターにグループ化されます。2 つのコア ポイント間に重複するデータ ポイントがある場合、それらは同じクラスターにグループ化されます。
  • すべての非コア ポイントについて、ノイズ ポイントとしてマークします。

基本コンセプト:

  • 密度接続: コア点 p から開始して、点 q と点 k の両方が密度に到達可能な場合、点 q と点 k は密度接続されていると言われます。
  • 境界点: オフラインで開発できない、特定のカテゴリに属する​​非コア点
  • 直接到達可能な密度: 点 p が点 q の r 近傍にあり、q がコア点である場合、pq は直接密度に到達可能です。
  • ノイズ ポイント: どのクラスターにも属していないポイントは、どのコア ポイントからも密度的にアクセスできません。

DBSCAN では、指定する必要があるパラメータが 3 つあります。

  • eps: 距離範囲内の最大距離を指定します。
  • min_samples: コア ポイントを決定するために、ポイントの周囲のデータ ポイントの最小数を指定します。
  • メトリック: 距離、密度しきい値の計算に使用される測定方法

2. 基本的な使い方

  • ガイドパッケージ
import matplotlib.pyplot as plt
import numpy as mp
from sklearn.datasets import make_circles
from sklearn.cluster import DBSCAN

make_circles は、ランダムな円のデータセットを生成する scikit-learn の関数です。この関数のパラメータには、生成されたデータ セット内のサンプル数を示す n_samples、生成されたデータに追加されるガウス ノイズの標準偏差を示すノイズ、内円と外円の間の比例係数を示す要因、ランダム状態を示すパラメータが含まれます。生成されたデータのランダム シード。生成された複数のデータセットの一貫性を確保するために使用されます。
make_circles 関数は、2 次元平面上に 2 つの円形のクラスターを生成し、それらを互いにネストして配置して、実際の非線形分離可能問題をシミュレートします。

DBSCN() インスタンス化パラメータの概要

  • eps: 2 つのサンプル間の最大距離を示します。この距離を超えるサンプルは外れ値とみなされます。デフォルト値は 0.5 です。
  • min_samples: クラスター内のサンプルの最小数を示します。この数値より小さいクラスターは外れ値とみなされます。デフォルト値は 5 です。
  • metric: 距離の計算に使用されるメトリック方法を示します。デフォルトはユークリッド距離 (ユークリッド) です。マンハッタン距離 (manhattan)、コサイン距離 (cosine) なども選択できます。
  • metric_params: メトリックメソッドのその他のパラメータを示します。
  • アルゴリズム: DBSCAN を計算するためのアルゴリズムを示します。kd ツリー ('kd_tree') に基づく効率的なアルゴリズム、またはボール ツリー ('ball_tree') に基づく効率的なアルゴリズムを選択できます。デフォルトは自動選択です。
  • Leaf_size: kd ツリーまたは Ball ツリーを構築するときのリーフ サイズを示します。デフォルトは 30 です。
  • p: ミンコフスキー距離の計算に使用するパラメータを示します。p=1の場合はマンハッタン距離、p=2の場合はユークリッド距離、p>2の場合はL_p距離です。デフォルトは2です。
    -> n_jobs: 計算に使用される並列ジョブの数を示します。デフォルトは 1 です。-1 は、利用可能なすべての CPU コアを使用することを意味します。

返品方法のご紹介

fit_predict(X): モデルのトレーニング中に、クラスタリング結果を返します。つまり、各サンプル ポイントが属するクラスター番号を返し、ノイズ ポイントの場合は -1 を返します。X は入力データです。

  • label_: トレーニング後、各サンプル ポイントが属するクラスター番号。ノイズ ポイントの場合は -1 になります。
  • core_sample_indices_: トレーニング後のコア サンプルのインデックス。
  • コンポーネント_: トレーニング後のコア サンプルの特徴ベクトル。
  • eps_: トレーニング後の最高の eps 値。
  • min_samples_: トレーニング後の最適な min_samples 値。
  • get_params(): 現在のモデルのパラメータ設定を取得します。

-データセット

X,y=make_circles(factor=0.3,n_samples=1000,random_state=42,noise=0.1)
X

- 目に見えるデータを視覚化してみましょう

plt.plot(X[:,0],X[:,1],'b.',marker='*')
plt.show()

ここに画像の説明を挿入

  • eps が異なれば結果に与える影響も異なるため、ここではトレーニング用に複数の eps を試します。

def plot_show(epe,modal):
    core_mask=np.zeros_like(modal.labels_,dtype=bool)

    #设置核心样本店
    core_mask[modal.core_sample_indices_]=True

    anoalie_mask=modal.labels_==-1

    # 标记噪声点
    non_core_mask=~(core_mask | anoalie_mask)

    cores=modal.components_
    anomalies=X[anoalie_mask]
    non_cores=X[non_core_mask]

    plt.scatter(cores[:,0],cores[:,1],c=modal
                .labels_[core_mask],marker='o',cmap='Paired')

    plt.scatter(cores[:, 0], cores[:, 1], marker='*', s=20, c=modal.labels_[core_mask])

    plt.scatter(anomalies[:,0],anomalies[:,1],c='red',marker='X',s=70)

    plt.scatter(non_cores[:,0],non_cores[:,1],c=modal.labels_[non_core_mask],marker='.')

    plt.axis('off')

    plt.title(f'epe:{
      
      epe}')


for i,epe in enumerate(epes):

    dbscan=DBSCAN(eps=epe,min_samples=5)
    dbscan.fit(X)
    plt.subplot(331+i)

    plot_show(epe,dbscan)

plt.show()

ここに画像の説明を挿入分類結果では、さまざまな epe 値がまだ非常に大きいことがわかります。適切な epe を選択することが特に重要です。図の X はコアサンプルの位置です。

3. DBSCAN と Kmeans 処理の比較

DNSCAN は任意の形状の非線形クラスターの処理に利点がありますが、Kmeans はそれらをうまく処理できません。

  • データのダウンロード
from sklearn.datasets import make_moons

X,y=make_moons(n_samples=1000,noise=0.04,random_state=42)
#%% md
#%%
plt.plot(X[:,0],X[:,1],'b.',marker='*')
plt.show()

make_moons は、ランダムな三日月データセットを生成する scikit-learn の関数です。この関数のパラメータには、生成されたデータ セット内のサンプル数を示す n_samples、生成されたデータに追加されるガウス ノイズの標準偏差を示す noise、生成されたデータのランダム シードを示す random_state が含まれます。複数回生成されたデータセットの一貫性を確保するために使用されます。
make_moons 関数は、2 次元平面上に 2 つの半月型のクラスターを生成し、それらを相互に交差させて配置します。

ここに画像の説明を挿入

- 2 つの分類方法を比較する

plt.subplot(121)
dbscan=DBSCAN(eps=0.1,min_samples=5)
dbscan.fit(X)
plt.scatter(X[:,0],X[:,1],c=dbscan.labels_)

plt.title('DBSCAN')

from sklearn.cluster import KMeans
plt.subplot(122)
kmeans=KMeans(n_clusters=2,random_state=42)
kmeans.fit(X)
plt.scatter(X[:,0],X[:,1],c=kmeans.labels_)
plt.title('KMEANS')

plt.show()

ここに画像の説明を挿入
kmeans では分類効果が達成されなかったことがわかります。

要約する

DBSCAN アルゴリズムには次の特徴があります。

  • 事前にクラスタ数を設定する必要はありません。
  • 任意の形状のクラスターを識別する機能。
  • ノイズポイントを特定できます。
  • パラメータの設定の影響を受けますが、通常は 2 つのパラメータのみを調整する必要があります: radius ϵ \epsilonϵとP ts MinPts の最小サンプル数MはPt sです

ただし、dbscan は画像の切り出しに問題があることを発見しました。min_samples の設定が小さすぎると、画像の切り出し後に大きな変化はありません。設定が大きすぎると、密度の低いいくつかの点がノイズとして削除され、画像が失われます。 、オリジナルとは異なります 形状が矛盾しており、現時点で良い解決策がありません。後ほど解決策があれば、できるだけ早く共有してください。

私の能力が限られているため、上記の内容に間違いがある場合は、修正してください。
==私はこれからも共有し、学ぶために一生懸命働きますので、たくさんのサポートを願っています

おすすめ

転載: blog.csdn.net/qq_61260911/article/details/130089960