序文
機械学習におけるクラスタリングは、一般的な教師なし学習手法であり、その目的は、データセット内のデータ ポイントを、各グループ間で類似した特性を持つ異なるグループに分割することです。クラスタリングは、画像セグメンテーション、ソーシャルメディア分析、医療データ分析などのさまざまなアプリケーションで使用できます。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 の設定が小さすぎると、画像の切り出し後に大きな変化はありません。設定が大きすぎると、密度の低いいくつかの点がノイズとして削除され、画像が失われます。 、オリジナルとは異なります 形状が矛盾しており、現時点で良い解決策がありません。後ほど解決策があれば、できるだけ早く共有してください。
私の能力が限られているため、上記の内容に間違いがある場合は、修正してください。
==私はこれからも共有し、学ぶために一生懸命働きますので、たくさんのサポートを願っています