一、什麼是聚類算法?
聚類算法是一種將相似對象組合在一起形成簇的算法。在聚類分析中,不需要先驗知識和目標結果,只要根據相似度度量準則來判斷樣本間的距離遠近,然後逐步將樣本合併達到聚成一類的效果。
二、什麼是基於密度的聚類算法?
基於密度的聚類算法是一類通過密度相連來確定簇的起始點和終止點,進而進行聚類的算法。即認為在特定的密度閾值下,大於該密度閾值的一組樣本可形成一個簇,各個簇之間處於相對的密度較低的區域,被稱為“噪聲點”。基於密度的聚類算法不需要預先指定簇的個數,同時也能很好地處理簇的形狀比較難判定的數據。
三、DBSCAN算法的實現及代碼示例:
DBSCAN是一種常見的基於密度的聚類算法,實現過程如下:
1、對於任意一個未處理的點,找到以該點為圓心,以eps為半徑的區域內的所有相鄰點,若該區域內點的個數小於指定值min_points,則將該點標記為“噪聲點”;
2、若該區域內點的個數大於等於指定值min_points,則將該點以及該區域內所有點標記為同一個核心點,並形成一個新的簇;
3、對於已處理的點,若該點為核心點,則對其相鄰點進行擴展,遞歸形成一個新的簇,若該點為邊界點,則跳過不處理;
4、重複以上步驟,直到所有點都被處理。
下面是Python代碼實現:
import numpy as np
from scipy.spatial.distance import cdist
class DBSCAN:
def __init__(self, eps, min_pts):
self.eps = eps
self.min_pts = min_pts
self.core_points_ = []
self.border_points_ = []
self.noises_ = []
def fit(self, X):
cluster_label, n_clusters = self._dbscan(X)
self._split(X, cluster_label, n_clusters)
return self
def _metric(self, x, y):
return np.sqrt(np.sum((x - y)**2))
def _neighbor_points(self, X, p):
return np.where(cdist(X, np.array([p])) <= self.eps)[0]
def _dbscan(self, X):
m, n = X.shape
visited = np.zeros(m)
core_points = []
curr_cluster_label = 0
for i in range(m):
if not visited[i]:
visited[i] = 1
neighbors = self._neighbor_points(X, X[i])
if len(neighbors) = self.min_pts:
core_points.append(curr_p)
self.core_points_.append(curr_p)
neighbors = np.concatenate((neighbors, self._neighbor_points(X, X[curr_p])), axis=0)
if curr_p not in self.border_points_:
cluster_label = curr_cluster_label
else:
self.border_points_.remove(curr_p)
self.labels_[curr_p] = cluster_label
curr_cluster_label += 1
return self.labels_, curr_cluster_label
def _split(self, X, cluster_label, n_clusters):
clusters = [[] for _ in range(n_clusters)]
for i in range(X.shape[0]):
if i in self.core_points_:
clusters[self.labels_[i]].append(X[i])
elif i not in self.noises_:
self.border_points_.append(i)
self.clusters_ = [np.array(c) for c in clusters]
四、DBSCAN算法的優缺點:
優點:
1、能處理各種形狀的簇,如環形、月牙形等;
2、不需要預先指定簇的個數;
3、對於噪聲數據排除能力較強。
缺點:
1、在處理高維數據時,由於“維災難”的問題,效果不佳;
2、需要設置參數eps和min_pts,而且這兩個參數對聚類結果的影響較大,需要通過經驗或交叉驗證等方式找到合適的值;
3、對於密度較大的數據集,算法的時間複雜度較高。
五、總結:
基於密度的聚類算法是聚類分析中常見的一種算法,其中DBSCAN是一種較為常見的基於密度的聚類算法,實現方法簡單。但在實現過程中需要注意參數的選取,同時需要注意算法對數據集密度要求較高,否則效果可能不佳。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/151461.html
微信掃一掃
支付寶掃一掃