DBSCAN(Density-Based Spatial Clustering of Applications with Noise)演算法是一種基於密度的聚類方法,它能夠把具有相似特徵的資料點聚成一類,並識別出離群點。在Python中,透過呼叫scikit-learn函式庫中的DBSCAN函數,可以方便地實現該演算法,並快速地對資料進行聚類分析。本文將詳細介紹Python中的DBSCAN演算法。
一、DBSCAN演算法基礎
DBSCAN演算法是一種基於密度的聚類演算法,其基本思想是在資料點的密度較高的區域形成一個簇。演算法中有兩個重要參數:鄰域半徑(ε)和最小樣本數(MinPts)。其中鄰域半徑表示以某一點為中心,以ε為半徑的圓內所有的資料點稱為該點的鄰域,最小樣本數指的是在鄰域內的最小資料點數,如果在該點的鄰域內的資料點數小於MinPts,則該點被視為雜訊點。
演算法的核心是透過計算每個點的密度(密度即點的鄰域半徑內包含的點的個數),對資料點進行聚類。具體的,演算法從一個未標記的點出發,透過計算與該點鄰域內的其他點的密度,遞歸地擴張簇大小,直到達到密度閾值或沒有其他點可以加入該簇。
最後,演算法會將簇中所有的未標記點標記為該簇的成員,並從未訪問的點中選擇一個新的未標記的點作為起點,繼續進行遞歸擴張。重複這個過程,直到沒有未標記點為止,聚類過程結束。
二、Python中的DBSCAN函數
在Python中,透過呼叫scikit-learn函式庫中的DBSCAN函數,可以方便地實作DBSCAN演算法。函數的語法如下:
sklearn.cluster.DBSCAN(eps=0.5,min_samples=5,metric='euclidean',algorithm='auto',leaf_size=30,p=1,n_jobs=None)
其中,eps表示鄰域半徑,min_samples表示最小樣本數,metric表示距離度量方式,algorithm表示計算方式,leaf_size表示葉子節點大小,p表示明可夫斯基指數,n_jobs表示任務數量。
三、使用Python進行DBSCAN聚類
下面透過一個具體的例子,示範如何利用Python進行DBSCAN聚類。
首先,我們需要匯入相關函式庫,產生一個隨機資料集,程式碼如下:
from sklearn.datasets import make_blobs import numpy as np import matplotlib.pyplot as plt X, _ = make_blobs(n_samples=1000, centers=5, random_state=42)
接著,我們可以繪製資料點分佈圖,如下所示:
plt.scatter(X[:, 0], X[:, 1]) plt.show()
接著,我們可以使用DBSCAN函數進行聚類分析,程式碼如下:
from sklearn.cluster import DBSCAN dbscan = DBSCAN(eps=0.5, min_samples=5) dbscan.fit(X)
其中,透過設定eps和min_samples參數,來調節資料點聚類的敏感度。如果eps太小,min_samples過大,聚類效果相對較弱;如果eps過大,min_samples過小,則難以將不同的聚類簇分離開。
我們可以調整eps和min_samples參數,觀察聚類效果的變化。程式碼如下:
eps_list = [0.1, 0.3, 0.5, 0.7] min_samples_list = [2, 5, 8, 11] fig, axes = plt.subplots(2, 2, figsize=(10, 8)) axes = axes.flatten() for i, (eps, min_samples) in enumerate(zip(eps_list, min_samples_list)): dbscan = DBSCAN(eps=eps, min_samples=min_samples) dbscan.fit(X) unique_labels = set(dbscan.labels_) colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))] for k, col in zip(unique_labels, colors): if k == -1: col = [0, 0, 0, 1] class_member_mask = (dbscan.labels_ == k) xy = X[class_member_mask] axes[i].scatter(xy[:, 0], xy[:, 1], s=50, c=col) axes[i].set_title(f"eps={eps}, min_samples={min_samples}") axes[i].axis('off') plt.tight_layout() plt.show()
運行以上程式碼,我們可以得到不同eps和min_samples參數組合下的聚類效果,如下所示:
##從以上圖中可以看出,當eps=0.5,min_samples=5時,聚類效果最佳。 四、DBSCAN的優缺點DBSCAN聚類演算法有以下優點:以上是Python中的DBSCAN演算法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!