快速學習一個算法,DBSCAN
作者:程序員小寒
Dbscan(Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的聚類算法,常用于識別空間數據中的任意形狀的聚類,同時能夠有效地處理噪聲數據。
今天給大家分享一個超強的算法模型,DBSCAN
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的聚類算法,常用于識別空間數據中的任意形狀的聚類,同時能夠有效地處理噪聲數據。
它不需要預先指定簇的數量,這與 K-means 等算法不同。
核心思想
DBSCAN 通過分析數據點在空間中的密度,自動識別簇。
它的基本思想是:對于一個數據集中的每個點,通過計算其鄰域內點的數量來確定其是否位于簇的高密度區域中。
圖片
關鍵參數
DBSCAN 依賴于兩個關鍵參數:
- ε(eps)
用于定義一個點的鄰域的半徑。該值決定了一個點與另一個點是否是密切相關的。 - MinPts
一個點的鄰域中至少需要包含的點的數量(包括該點自身),以將其視為核心點。
關鍵術語
- 核心點(Core Point)
如果一個點的鄰域中包含至少 MinPts 個點,則該點是核心點。 - 邊界點(Border Point)
一個點不滿足核心點的條件,但位于一個核心點的鄰域內。 - 噪聲點(Noise Point)
既不是核心點也不是邊界點。
算法步驟
- 初始化
從數據集中隨機選擇一個未訪問的數據點。 - 鄰域搜索
對于每個數據點,DBSCAN 會找到其 ε 鄰域內的所有點。 - 核心點識別
如果某個點在其 ε 鄰域內至少有 MinPts 個鄰居,則該點被歸類為核心點。這些點構成了聚類的中心。 - 聚類形成
DBSCAN 從核心點開始,并遞歸訪問其密度連通的鄰居(彼此 ε 鄰域內的點)。
所有核心點及其密度可達的鄰居都被分配到同一個聚類中。 - 邊界點分配
邊界點被分配到與其關聯的核心點相同的簇。 - 噪聲分類
任何既不是核心點也不是邊界點的點都被視為噪聲點或異常值。這些點不屬于任何聚類。
示例代碼
下面是一個使用 Python 的 Scikit-learn 庫實現 DBSCAN 的示例代碼。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN
# 生成示例數據
X, _ = make_moons(n_samples=300, noise=0.05, random_state=0)
# 應用 DBSCAN 算法
dbscan = DBSCAN(eps=0.2, min_samples=5)
labels = dbscan.fit_predict(X)
# 可視化結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('DBSCAN Clustering')
plt.show()
圖片
優缺點
優點
- 沒有預定義聚類數
與 K-Means 不同,DBSCAN 不需要指定聚類數,因此適用于聚類結構未知的數據 - 對異常值具有魯棒性
DBSCAN 可以有效處理位于密集區域之外的異常值并將其標記為噪聲 - 靈活的形狀檢測
DBSCAN 可以找到任意形狀的聚類,而 K-Means 則僅限于球形聚類
缺點
- 參數敏感性,性能可能因 ε 和 MinPts 的選擇而異
- 時間復雜度高
- 對于大型數據集來說,計算距離和識別核心點的計算成本可能很高
責任編輯:武曉燕
來源:
程序員學長