大师兄的数据分析学习笔记(二十五):聚类(一)
大师兄的数据分析学习笔记(二十七):聚类(三)
四、DBSCAN算法
- DBSCAN算法是一种基于密度的算法,即一定区域内,密度达到一定程度的数据形成一类,否则只是离群点,这样就有以下两个问题:
- 区域有多大。
- 密度有多大。
- 基本概念:
- E邻域:给定对象半径为E内的区域内称为该对象的E邻域。
- 核心对象:如果给定对象E邻域内的样本点数大于等于MinPts,则称该对象为核心对象。
- 直接密度可达:对于样本集合D,如果样本点q在p的E邻域内,并且p为核心对象,那么对象q从对象p直接密度可达。
- 密度可达:对于样本集合D,给定一串样本点p1,p2....pn,p=p1,q=pn,假定对象pi从pi-1直接密度可达,那么对象q从对象p密度可达。
- 密度相连:存在样本集D中的一点o,如果对象o到对象p和对象q都密度可达,那个p和q密度相连。
- DBSCAN算法的目的就是找到密度相连对象的最大集合。
- 算法优点:
- 对离群点不敏感。
- 算法问题:
- 计算点相邻的点比较困难,需要KD-Tree等数据结构辅助。
- 参数计算比较麻烦。
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>from sklearn.datasets import make_circles,make_blobs,make_moons
>>>from sklearn.cluster import DBSCAN
>>>n_samples = 1000
>>>circles = make_circles(n_samples=n_samples,factor=0.5,noise=0.05)
>>>moons = make_moons(n_samples=n_samples,noise=0.05)
>>>blobs = make_blobs(n_samples=n_samples,random_state=8,center_box=(-1,1),cluster_std=0.1)
>>>random_data = np.random.rand(n_samples,2),None
>>>colours = "bgrcmyk"
>>>data = [circles,moons,blobs,random_data]
>>>models = [("None",None),("DBSCAN",DBSCAN(min_samples=3,eps=0.2))]
>>>fig = plt.figure()
>>>for inx,clt in enumerate(models):
>>> clt_name,clt_entity = clt
>>> for i,dataset in enumerate(data):
>>> X,Y = dataset
>>> if not clt_entity:
>>> clt_res = [0 for item in range(len(X))]
>>> else:
>>> clt_entity.fit(X)
>>> clt_res = clt_entity.labels_.astype(int)
>>> fig.add_subplot(len(models),len(data),inx*len(data)+i+1)
>>> plt.title(clt_name)
>>> [plt.scatter(X[p,0],X[p,1],color=colours[clt_res[p]]) for p in range(len(X))]
>>>plt.show()
网友评论