クラスタリングアルゴリズムの概要
K-MeansとDBSCANは、データマイニングや機械学習の分野で広く利用される教師なし学習アルゴリズムです。これらのアルゴリズムは、ラベル付けされていないデータから自然なグループ(クラスター)を発見するために使用されます。
K-Meansアルゴリズムの詳細
K-Meansは分割ベースのクラスタリング手法であり、データ空間内のk個の中心点(セントロイド)を基準としてデータをグループ化します。アルゴリズムは反復的にセントロイドの位置を調整し、最適なクラスター配置を見つけます。
アルゴリズムの処理フロー
- データセットからk個の初期セントロイドをランダムに選択します
- 各データ点から最も近いセントロイドまでの距離を計算し、最も近いクラスターに割り当てます
- 各クラスターに属するデータ点の平均値を計算し、新しいセントロイドを更新します
- セントロイドの位置が安定するまで、ステップ2と3を繰り返します
K-Meansの実装例
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# サンプルデータの生成
data_points, true_labels = make_blobs(
n_samples=1500,
centers=4,
cluster_std=1.2,
random_state=2024
)
# K-Meansモデルの初期化と学習
model = KMeans(
n_clusters=4,
init='k-means++',
n_init=10,
max_iterations=300
)
cluster_assignments = model.fit_predict(data_points)
# 結果の確認
print(f"セントロイドの位置:\n{model.cluster_centers_}")
print(f"クラスタ割り当てのサンプル: {cluster_assignments[:20]}")
# 可視化
plt.figure(figsize=(10, 6))
plt.scatter(data_points[:, 0], data_points[:, 1],
c=cluster_assignments, cmap='viridis', alpha=0.6)
plt.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],
c='red', marker='x', s=200, linewidths=3)
plt.title('K-Meansクラスタリング結果')
plt.show()
DBSCANアルゴリズムの解説
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)は、データの密度に基づいてクラスターを形成する手法です。K-Meansとは異なり、DBSCANは球状以外の複雑な形状のクラスターを検出でき、ノイズ点を識別する能力があります。
主要概念
- ε-近傍: 指定された半径ε内にある点の集合
- 最小点数: コア点と見なすために必要な近傍の最小数
- コア点: ε-近傍内に最小点数以上の点を持つ点
- 境界点: コア点のε-近傍には含まれるが、自身はコア点ではない点
- ノイズ点: どのクラスターにも属さない点
DBSCANの実装例
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_circles
import seaborn as sns
# 複雑な形状のサンプルデータ生成
X_data, y_true = make_circles(
n_samples=1000,
factor=0.5,
noise=0.05,
random_state=42
)
# DBSCANモデルの構築と適用
dbscan_model = DBSCAN(
eps=0.15,
min_samples=8,
metric='euclidean',
algorithm='auto'
)
cluster_labels = dbscan_model.fit_predict(X_data)
# クラスター情報の分析
unique_clusters = set(cluster_labels)
print(f"検出されたクラスター数: {len(unique_clusters) - (1 if -1 in cluster_labels else 0)}")
print(f"ノイズ点の数: {list(cluster_labels).count(-1)}")
# 結果の可視化
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.scatter(X_data[:, 0], X_data[:, 1], c=y_true, cmap='viridis')
plt.title('元のデータ分布')
plt.subplot(1, 2, 2)
plt.scatter(X_data[:, 0], X_data[:, 1], c=cluster_labels, cmap='viridis')
plt.title('DBSCANによるクラスタリング')
plt.tight_layout()
plt.show()
アルゴリズム選択の考慮事項
| 特徴 | K-Means | DBSCAN |
|---|---|---|
| クラスター形状 | 球状に適している | 任意形状を検出可能 |
| パラメータ | クラスター数(k)を指定 | εとmin_samplesを指定 |
| ノイズ処理 | ノイズを識別できない | ノイズ点を自動検出 |
| 計算複雑度 | O(nkt) | O(n²)(最悪の場合) |
実装のベストプラクティス
前処理の重要性
両アルゴリズムとも、特徴量のスケールに敏感です。標準化(StandardScaler)や正規化(MinMaxScaler)の適用が推奨されます。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_data)
ハイパーパラメータ最適化
K-Meansではエルボー法やシルエット分析を使用して最適なクラスター数を決定します。DBSCANではk-距離グラフから適切なε値を推定します。
関連する機械学習アルゴリズム
- ランダムフォレスト分類器
- サポートベクターマシン(SVM)
- ナイーブベイズ分類器
- 勾配ブースティング決定木
- ニューラルネットワーク