DBSCAN聚类
DBSCAN
Density-Based Spatial Clustering of Applications with Noise
- 一種基于密度,對噪聲魯棒的空間聚類算法。
- DBSCAN算法可以找到樣本點的全部密集區(qū)域,并把這些密集區(qū)域當(dāng)做一 個一個的聚類簇
- 通常情形下,密度聚類算法從樣本密度的角度來考察樣本之間的可連接性, 并基于可連接樣本不斷擴展聚類簇以獲得最終的聚類結(jié)果。
- DBSCAN算法基于一組“領(lǐng)域”參數(shù)(ε,MinPts)來刻畫樣本分布的緊密程度。ε:領(lǐng)域半徑;MinPts:密度閾值
關(guān)于DBSCAN的通俗描述:
對于DBSCAN算法最為重要的就是核心點。什么是核心點呢?簡單來說就是當(dāng)在以一個點為圓心半徑為ε的區(qū)域內(nèi)存在不少于MinPts個其他點時,此點即為核心點, 暫稱核心點為“大哥”,核心點的鄰域點為“小弟”,當(dāng)大哥的小弟作為大哥時,又會存在一批小弟,當(dāng)?shù)诙〉苡肿鳛榇蟾?#xff0c;又會找出第三批小弟,如此循環(huán)直至找不到小弟, 那么這些由第一代大哥衍生出來的小弟也好大哥也好與它們的鄰域構(gòu)成一個簇,也就是一類。后來的點按照以上的操作往復(fù)循環(huán)就能找到一個一個的簇,直到所有的點被找過。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets #加載數(shù)據(jù)集
X=datasets.make_circles(n_samples=1000, factor=0.2, noise=0.1)[0] #生成環(huán)形數(shù)據(jù)
def distance(X): #計算個點之間的距離(矩陣,同pdist2)n=len(X)D=np.zeros((n,n))for i in range(n):for j in range(0,i):D[i][j]=np.linalg.norm(X[i]-X[j],ord=2)D[j][i]=D[i][j]return D
def dbscan(X,epsilon,MinPts):C=0 #以點在源數(shù)據(jù)中的位置標(biāo)記類別n=len(X)idx=[0 for i in range(n)] #類別信息存儲visited=[0 for i in range(n)] #巡查判斷D=distance(X) #距離矩陣def RegionQuery(i): #列出一個點周圍ε內(nèi)存在的點的下標(biāo)Neighbors=np.where(D[i,:]<=epsilon)return list(Neighbors)[0].tolist() #以列表形式返回def ExpandCluster(i,Neighbors,C): #將鄰域點能夠成為核心點的點歸類idx[i]=C #將點賦給類別k=1while k<=len(Neighbors):j=Neighbors[k]if visited[j]==0:visited[j]=1Neighbors2=RegionQuery(j)if len(Neighbors2)>=MinPts:Neighbors.extend(Neighbors2)if idx[j]==0:idx[j]=C #將沒有分類的點分類k=k+1if k>len(Neighbors)-1:breakfor i in range(n): #尋找核心點if visited[i]==0:visited[i]=1Neighbors=RegionQuery(i)if len(Neighbors)>=MinPts:C=C+1 #類別標(biāo)志加一ExpandCluster(i,Neighbors,C)return idx
def plot(a,X): #繪畫板塊m=max(a)for j in range(m):index=[i for i,v in enumerate(a) if v==j+1]x=[]y=[]for k in index:x.append(X[k][0])y.append(X[k][1])plt.scatter(x,y)x=[]y=[]for i in range(len(a)): #噪點繪制if a[i]==0:x.append(X[i][0])y.append(X[i][1])plt.scatter(x,y,marker='x')plt.show()
if __name__=="__main__": #設(shè)置ε為0.2,MinPts為3 進(jìn)行測a=dbscan(X,0.2,3)plot(a,X)
總結(jié)