機器學習 - DBSCAN 聚類



DBSCAN 聚類演算法的工作原理如下:

  • 隨機選擇一個尚未訪問的資料點。

  • 如果該資料點在距離 eps 內至少有 minPts 個鄰居,則建立一個新的聚類並將該資料點及其鄰居新增到該聚類。

  • 如果該資料點在距離 eps 內至少沒有 minPts 個鄰居,則將該資料點標記為噪聲並繼續下一個資料點。

  • 重複步驟 1-3,直到訪問所有資料點。

Python 實現

我們可以使用 scikit-learn 庫在 Python 中實現 DBSCAN 演算法。以下是操作步驟:

載入資料集

第一步是載入資料集。我們將使用 scikitlearn 庫中的 make_moons 函式生成一個具有兩個月亮的玩具資料集。

from sklearn.datasets import make_moons
X, y = make_moons(n_samples=200, noise=0.05, random_state=0)

執行 DBSCAN 聚類

下一步是在資料集上執行 DBSCAN 聚類。我們將使用 scikit-learn 庫中的 DBSCAN 類。我們將 minPts 引數設定為 5,“eps”引數設定為 0.2。

from sklearn.cluster import DBSCAN
clustering = DBSCAN(eps=0.2, min_samples=5)
clustering.fit(X)

視覺化結果

最後一步是視覺化聚類結果。我們將使用 Matplotlib 庫建立一個數據集的散點圖,並按聚類分配著色。

import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=clustering.labels_, cmap='rainbow')
plt.show()

示例

以下是 DBSCAN 聚類在 Python 中的完整實現:

from sklearn.datasets import make_moons
X, y = make_moons(n_samples=200, noise=0.05, random_state=0)
from sklearn.cluster import DBSCAN

clustering = DBSCAN(eps=0.2, min_samples=5)
clustering.fit(X)

import matplotlib.pyplot as plt
plt.figure(figsize=(7.5, 3.5))
plt.scatter(X[:, 0], X[:, 1], c=clustering.labels_, cmap='rainbow')

plt.show()

輸出

生成的散點圖應顯示兩個不同的聚類,每個聚類對應於資料集中一個月亮。噪聲資料點應為黑色。

DBSCAN clustering

DBSCAN 的優點

以下是使用 DBSCAN 聚類的優點:

  • 與假設聚類為球形的 k 均值不同,DBSCAN 可以處理任意形狀的聚類。

  • 它不需要預先知道資料集中聚類的數量,與 k 均值不同。

  • 它可以檢測異常值,即不屬於任何聚類的點。這是因為 DBSCAN 將聚類定義為點的密集區域,遠離任何密集區域的點被認為是異常值。

  • 與 k 均值不同,它對引數的初始選擇(例如 epsilon 和 min_samples 引數)相對不敏感。

  • 它可以擴充套件到大型資料集,因為它只需要計算相鄰點之間的成對距離,而不是所有點的成對距離。

DBSCAN 的缺點

以下是使用 DBSCAN 聚類的缺點:

  • 它可能對 epsilon 和 min_samples 引數的選擇敏感。如果這些引數沒有仔細選擇,DBSCAN 可能會無法識別聚類或錯誤地合併它們。

  • 它可能不適用於密度變化的資料集,因為它假設所有聚類具有相同的密度。

  • 由於演算法的非確定性性質,它可能在同一資料集上的不同執行中產生不同的結果。

  • 對於高維資料集,它可能計算成本很高,因為隨著維數的增加,距離計算變得更加昂貴。

  • 如果噪聲或異常值的密度過高,它可能不適用於具有噪聲或異常值的資料集。在這種情況下,噪聲或異常值可能會被錯誤地分配給聚類。

廣告