DBSCAN是基于密度空间的聚类算法,与KMeans算法不同,它不需要确定聚类的数量,而是基于数据推测聚类的数目,它能够针对任意形状产生聚类。

1.epsilon-neighborhood

epsoiln-neighborhood(简称e-nbhd)可理解为密度空间,表示半径为e且含有若干个点的nbhd,密度等于包含点的个数/空间大小。图中中心点是(3,2),半径epsilon是0.5

根据式子密度=点的个数/面积,可以计算得到上图中密度=31/2pi(0.5)*(0.5)=62/pi,这个数字本身意义不大,但通过计算某一小区域的密度,横向对比可以得知整个区域的密度分布,由此相近的点可聚类到同一区域内。

2.DBSCAN

DBSCAN算法需要首先确定两个参数:
(1)epsilon:在一个点周围邻近区域的半径
(2)minPts:邻近区域内至少包含点的个数
根据以上两个参数,结合epsilon-neighborhood的特征,可以把样本中的点分成三类:

  1. 核点(core point):满足NBHD(p,epsilon)>=minPts,则为核样本点
  2. 边缘点(border point):NBHD(p,epsilon)<minPts,但是该点可由一些核点获得(density-reachable或者directly-reachable
  3. 离群点(Outlier):既不是核点也不是边缘点,则是不属于这一类的点

注:边缘点density-reachable是指存在当前类中其他点作为核点所在的类中。例如,朋友的朋友(可以是n多个)也是朋友。如下图,黄圈右下角的点即为density-reachabledirectly-reachable的点即为NBHD中的点。

3.DBSCAN步骤

结合2中内容,DBSCAN的一般步骤是:(在已知epsilon和minPts的前提下)

  1. 任意选择一个点(既没有指定到一个类也没有特定为外围点),计算它的NBHD(p,epsilon)判断是否为核点。如果是,在该点周围建立一个类,否则,设定为外围点。
  2. 遍历其他点,直到建立一个类。把directly-reachable的点加入到类中,接着把density-reachable的点也加进来。如果标记为外围的点被加进来,修改状态为边缘点。
  3. 重复步骤1和2,直到所有的点满足在类中(核点或边缘点)或者为外围点

4.代码实现

思路:读取数据,选择Grocery和Milk两列作为训练样本,对数据归一化(特征标准化),使用dbscan聚类,并作图。
特征标准化是归一化中常用的手段,特点是零均值和单位方差,对于正态分布的数据拟合很好。

# coding=utf-8
import numpy as np
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
import pandas as pddata = pd.read_csv("data/wholesale.csv")
data.drop(["Channel", "Region"], axis=1, inplace=True)data = data[["Grocery", "Milk"]]
data = data.as_matrix().astype("float32", copy=False)#convert to array#数据预处理,特征标准化,每一维是零均值和单位方差
stscaler = StandardScaler().fit(data)
data = stscaler.transform(data)#画出x和y的散点图
plt.scatter(data[:, 0], data[:, 1])
plt.xlabel("Groceries")
plt.ylabel("Milk")
plt.title("Wholesale Data - Groceries and Milk")
plt.savefig("results/wholesale.png", format="PNG")dbsc = DBSCAN(eps=0.5, min_samples=15).fit(data)labels = dbsc.labels_ #聚类得到每个点的聚类标签 -1表示噪点
#print(labels)
core_samples = np.zeros_like(labels, dtype=bool) #构造和labels一致的零矩阵,值是false
core_samples[dbsc.core_sample_indices_] = True
#print(core_samples)unique_labels = np.unique(labels)
colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels))) #linespace返回在【0,1】之间均匀分布数字是len个,Sepectral生成len个颜色#print(zip(unique_labels,colors))
for (label, color) in zip(unique_labels, colors):class_member_mask = (labels == label)print(class_member_mask&core_samples)xy = data[class_member_mask & core_samples]plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=color, markersize=10)xy2 = data[class_member_mask & ~core_samples]plt.plot(xy2[:, 0], xy2[:, 1], 'o', markerfacecolor=color, markersize=5)
plt.title("DBSCAN on Wholsesale data")
plt.xlabel("Grocery (scaled)")
plt.ylabel("Milk (scaled)")
plt.savefig("results/(0.9,15)dbscan_wholesale.png", format="PNG")

5.分析及总结

(1)epsilon不变的情况下,调整minPts的大小,则minPts越大,NBHD越密集,产生离群点越多。以下四幅图对应epsilon和minPts分别是(0.5,15),(0.5,20),(0.5,40),(0.5,60)



(2)在minPts不变的情况下,epsilon越小,聚类越密集,产生离群点越多。以下三幅图分别是(0.5,15),(0.8,15),(0.9,15)

epsilon越小,minPts越多,则密度越高,产生聚类越密集。

DBSCAN最大的特点是事先不必确定聚类的种类,通过基于密度的方法,聚类并找出离群点。不仅需要对大部分在类中的点分析,也需要对离群点分析(例如统计分析被木马程序入侵的电脑,本例中牛奶需求水平较高的顾客…)

6.参考链接

https://blog.dominodatalab.com/topology-and-density-based-clustering/?tdsourcetag=s_pcqq_aiomsg

聚类算法之DBSCAN算法之一:经典DBSCAN相关推荐

  1. 机器学习强基计划7-5:图文详解密度聚类DBSCAN算法(附Python实现)

    目录 0 写在前面 1 密度聚类 2 DBSCAN算法 3 Python实现 3.1 算法复现 3.2 可视化实验 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用.&qu ...

  2. R实现K均值算法,层次聚类算法与DBSCAN算法

    1.聚类的基本概念 聚类分析(cluster analysis)仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组.其目标是,组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不 ...

  3. Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法

    聚类的分割 1.K-均值聚类 (1)K-均值聚类介绍 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心 ...

  4. 机器学习知识点(十八)密度聚类DBSCAN算法Java实现

    为更好理解聚类算法,从网上找现成代码来理解,发现了一个Java自身的ML库,链接:http://java-ml.sourceforge.net/ 有兴趣可以下载来看看源码,理解基础ML算法.对于DBS ...

  5. dbscan算法_DBSCAN聚类算法探索

    作者:单华 DBSCAN是非监督学习中密度学习算法里的佼佼者.本文对DBSCAN做了简单的探索,全文无数学公式,共2800余字. 在ARGO之前提到的聚类与K-Means一文中,提到了密度聚类方法DB ...

  6. dbscan算法c语言实现,用C++实现DBSCAN聚类算法

    这几天由于工作需要,对DBSCAN聚类算法进行了C++的实现.时间复杂度O(n^2),主要花在算每个点领域内的点上.算法很简单,现共享大家参考,也希望有更多交流. 数据点类型描述如下: 复制代码 代码 ...

  7. dbscan算法中 参数的意义_无监督机器学习中,最常见的聚类算法有哪些?

    在机器学习过程中,很多数据都具有特定值的目标变量,我们可以用它们来训练模型. 但是,大多数情况下,在处理实际问题时,数据不会带有预定义标签,因此我们需要开发能够对这些数据进行正确分类的机器学习模型,通 ...

  8. 聚类方法:DBSCAN算法研究

    DBSCAN聚类算法三部分: 1.        DBSCAN原理.流程.参数设置.优缺点以及算法: http://blog.csdn.net/zhouxianen1987/article/detai ...

  9. 点云谱聚类实现代码_Spark跑DBSCAN算法,工业级代码长啥样?

    最近着手的一个项目需要在Spark环境下使用DBSCAN算法,遗憾的是Spark MLlib中并没有提供该算法.调研了一些相关的文章,有些方案是将样本点按照空间位置进行分区,并在每个空间分区中分别跑D ...

最新文章

  1. 坑系列 —— 缓存+哈希=高并发?
  2. Rhel5.6下构建在线邮件服务系统并实现不同网段不同域名间的邮件互发
  3. gradle 指定springcloud 版本_Gradle初探
  4. 【直播课】6小时教你掌握MMdetection工程落地实践
  5. Traefik访问master节点不通的问题定位
  6. SAP物料主数据创建时间的线性增长
  7. Hibernate常用的Java数据类型映射到mysql和Oracle
  8. web电商系统、电商平台WEB端交互原型模板、用户中心、会员中心、优惠券、积分、互动社区、运营推广、内容推荐、商品展示、订单流程、订单管理、售后及服务、Axure原型、rp原型、电商原型、商城系统原型
  9. 2021湖南高考成绩分段查询,2021年湖南高考成绩排名查询系统,湖南高考位次排名表...
  10. bash实现自动补全
  11. 软件测试面试之智力题
  12. Visio(流程图绘制软件)的免费替代品
  13. JSP简介和会话技术
  14. Java文件上传接口
  15. 《学习之道》第二章专注思维和发散思维
  16. 英语发音之音标4---长元音法()
  17. java实现文字识别营业执照识别(百度、讯飞)
  18. 华为鸿蒙国内厂商适配,华为再放大招!鸿蒙系统将适配高通/联发科手机:获国产厂商力挺...
  19. STB 应用手册术语 2 - CA,EPG,VOD,CDN
  20. Java数组讲解(数组,字符串数组,多态数组)

热门文章

  1. 金蝶kis记账王云盘版怎么安装与注册
  2. Unity3D打包(IOS)IPA详细教程
  3. IT外企那点儿事(23): 离弦没有回头箭
  4. 首次使用requests库抓取代码
  5. 微信小程序点击图片放大预览,新页面中全屏预览图片
  6. java把字体转换成位图_位图字体生成工具Bitmap Font Generator的使用
  7. 根据经纬度计算两点之间的距离的公式
  8. MVC过滤器:自定义异常过滤器
  9. python医学科研中能做什么-这个工具,可全网爬取科研圈中外文献!
  10. Go 语言学习总结(8)—— Go 自学者必学的教程大纲