大师兄的数据分析学习笔记(二十六):聚类(二)

大师兄的数据分析学习笔记(二十五):聚类(一)
大师兄的数据分析学习笔记(二十七):聚类(三)

四、DBSCAN算法

  • DBSCAN算法是一种基于密度的算法,即一定区域内,密度达到一定程度的数据形成一,否则只是离群点,这样就有以下两个问题:
  1. 区域有多大。
  2. 密度有多大。
  • 基本概念:
  1. E邻域:给定对象半径为E内的区域内称为该对象的E邻域。
  2. 核心对象:如果给定对象E邻域内的样本点数大于等于MinPts,则称该对象为核心对象
  3. 直接密度可达:对于样本集合D,如果样本点q在p的E邻域内,并且p为核心对象,那么对象q从对象p直接密度可达
  4. 密度可达:对于样本集合D,给定一串样本点p1,p2....pn,p=p1,q=pn,假定对象pi从pi-1直接密度可达,那么对象q从对象p密度可达
  5. 密度相连:存在样本集D中的一点o,如果对象o到对象p和对象q都密度可达,那个p和q密度相连
  • DBSCAN算法的目的就是找到密度相连对象的最大集合。
  • 算法优点:
  1. 离群点不敏感。
  • 算法问题:
  1. 计算点相邻的点比较困难,需要KD-Tree等数据结构辅助。
  2. 参数计算比较麻烦。
>>>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()

你可能感兴趣的:(大师兄的数据分析学习笔记(二十六):聚类(二))