密度聚类(Density-based Clustering)假设聚类结构能够通过样本分布的紧密程度来确定。DBSCAN是常用的密度聚类算法,它通过一组邻域参数(ϵϵ,MinPtsMinPts)来描述样本分布的紧密程度。给定数据集DD={x⃗ 1,x⃗ 2,x⃗ 3,...,x⃗ Nx→1,x→2,x→3,...,x→N},数据集属性定义如下。

  • ϵϵ-邻域:Nϵ(x⃗ i)Nϵ(x→i)={x⃗ j∈D|distance(x⃗ i,x⃗ j)x→j∈D|distance(x→i,x→j)≤ϵ≤ϵ},Nϵ(x⃗ i)Nϵ(x→i)包含了样本集DD中与x⃗ ix→i距离不大于ϵϵ的所有样本。

  • 核心对象core object:若|Nϵ(x⃗ i)Nϵ(x→i)|≥MinPts≥MinPts,则称x⃗ ix→i是一个核心对象。即:若x⃗ ix→i的ϵϵ-邻域中至少包含MinPtsMinPts个样本,则称x⃗ ix→i是一个核心对象。

  • 密度直达directly density-reachable:若x⃗ ix→i是一个核心对象,且x⃗ j∈x→j∈Nϵ(x⃗ i)Nϵ(x→i),则称x⃗ jx→j由x⃗ ix→i密度直达,记作x⃗ ix→i–>x⃗ jx→j。

  • 密度可达density-reachable:对于x⃗ ix→i和x⃗ jx→j,若存在样本序列(p⃗ 0,p⃗ 1,p⃗ 2,...,p⃗ m,p⃗ m+1p→0,p→1,p→2,...,p→m,p→m+1),其中p⃗ 0p→0=x⃗ ix→i,p⃗ m+1p→m+1=x⃗ jx→j,p⃗ s∈D,s=1,2,...,mp→s∈D,s=1,2,...,m。如果p⃗ s+1p→s+1由p⃗ s,s=1,2,...,mp→s,s=1,2,...,m密度直达,则称x⃗ jx→j由x⃗ ix→i密度可达,记作x⃗ ix→i~>x⃗ jx→j。

  • 密度相连density-connected:对于x⃗ ix→i和x⃗ jx→j,若存在x⃗ kx→k,使得x⃗ ix→i和x⃗ jx→j均由x⃗ kx→k密度可达,则称x⃗ jx→j由x⃗ ix→i密度相连,记作x⃗ ix→i~x⃗ jx→j。

  DBSCAN算法的定义:给定邻域参数(ϵϵ,MinPtsMinPts),一个簇C⊆DC⊆D是满足下列性质的非空样本子集:

  • 接性connectivity:若x⃗ i∈C,x⃗ j∈Cx→i∈C,x→j∈C,则x⃗ ix→i~x⃗ jx→j
  • 大性maximality:若x⃗ i∈Cx→i∈C,且→xi→xi~>x⃗ jx→j,则x⃗ j∈Cx→j∈C 
    即一个簇是由密度可达关系导出的最大的密度相连样本集合。

  DBSCAN算法的思想:若x⃗ x→为核心对象,则x⃗ x→密度可达的所有样本组成的集合X={x⃗ ∗∈D|x⃗ x→∗∈D|x→~>x⃗ ∗x→∗},可以证明XX就是满足连接性与最大性的簇。于是DBSCAN算法首选任选数据集中的一个核心对象作为种子seedseed,再由此出发确定相应的聚类簇。

下面给出DBSCAN算法:

  • 输入

    • 数据集DD={x⃗ 1,x⃗ 2,x⃗ 3,...,x⃗ Nx→1,x→2,x→3,...,x→N}
    • 邻域参数(ϵϵ,MinPtsMinPts)
  • 输出:簇划分CC={C1,C2,...,CkC1,C2,...,Ck}

  • 算法步骤如下: 
    • 初始化核心对象集合为空集:Ω=∅∅
    • 寻找核心对象:遍历所有的样本点x⃗ i,i=1,2,...,Nx→i,i=1,2,...,N,计算Nϵ(x⃗ i)Nϵ(x→i),如果|Nϵ(x⃗ i)Nϵ(x→i)|≥MinPts≥MinPts,则Ω=Ω⋃⋃{x⃗ ix→i}
    • 迭代:以任一未访问过的核心对象为出发点,找出有其密度可达的样本生成的聚类簇,直到所有的核心对象都被访问为止

Python 实战

  DBSCANDBSCAN是sciki−kearnsciki−kearn提供的密度聚类算法模型,其原型为:

class sklearn.cluster.DBSCAN(eps=0.5,min_samples=5,metric='euclidean',algorithm='auto',leaf_size=30,p=None,random_state=None)
  • 1

参数

  • epseps:ϵϵ参数,用于确定邻域大小。
  • min_samplesmin_samples:MinPtsMinPts参数,用于判断核心对象。
  • metricmetric:一个字符串或可调用对象,用于计算距离。如果是字符串,则必须是在metrics.pairwise.calculate_distance中指定。
  • algorithmalgorithm:一个字符串,用于计算两点间距离并找出最近邻的点,可以为如下: 
    • ‘autoauto’:由算法自动取舍合适的算法。
    • ‘ball_treeball_tree’:用ball树来搜索。
    • ‘kd_treekd_tree’:用kd树搜索。
    • ‘brutebrute’:暴力搜索。
  • leaf_sizeleaf_size:一个整数,用于指定当algorithm=ball_tree或kd_tree时,树的叶节点大小。该参数会影响构建树,搜索最近邻的速度,同时影响树的内存。
  • random_staterandom_state:被废弃的接口,将在scikit-learn v 0.18中移除。

属性

  • core_sample_indices_core_sample_indices_:核心样本在原始训练集中的位置。
  • components_components_:核心样本的一份副本。
  • labels_labels_:每个样本所属的簇标记。对于噪声样本,其簇标记为-1副本。

方法

  • fit(X[,y,sample_weight])fit(X[,y,sample_weight]):训练模型。
  • fit_predict(X[,y,sample_weight])fit_predict(X[,y,sample_weight]):训练模型并预测每个样本所属的簇标记。
#导包
from sklearn import cluster
from sklearn.metrics import adjusted_rand_score
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn import mixture
from sklearn.svm.libsvm import predict
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
#产生数据
def create_data(centers,num=100,std=0.7):X,labels_true = make_blobs(n_samples=num,centers=centers, cluster_std=std)return X,labels_true
  • 1
  • 2
  • 3
  • 4
"""数据作图
"""
def plot_data(*data):X,labels_true=datalabels=np.unique(labels_true)fig=plt.figure()ax=fig.add_subplot(1,1,1)colors='rgbycm'for i,label in enumerate(labels):position=labels_true==labelax.scatter(X[position,0],X[position,1],label="cluster %d"%label),color=colors[i%len(colors)]ax.legend(loc="best",framealpha=0.5)ax.set_xlabel("X[0]")ax.set_ylabel("Y[1]")ax.set_title("data")plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

#测试函数
def test_DBSCAN(*data):X,labels_true = dataclst = cluster.DBSCAN();predict_labels = clst.fit_predict(X)print("ARI:%s"%adjusted_rand_score(labels_true,predict_labels))print("Core sample num:%d"%len(clst.core_sample_indices_))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
#结果
ARI:0.330307120902
Core sample num:991
  • 1
  • 2
  • 3

  其中ARIARI指标为0.330307120902,该值越大越好,DBSCAN根据密度,将原始数据集划分为991个簇。

下面考察ϵϵ参数的影响:

def test_DBSCAN_epsilon(*data):X,labels_true = dataepsilons = np.logspace(-1,1.5)ARIs=[]Core_nums = []for epsilon in epsilons:clst = cluster.DBSCAN(eps=epsilon)predicted_labels = clst.fit_predict(X)ARIs.append(adjusted_rand_score(labels_true,predicted_labels))Core_nums.append(len(clst.core_sample_indices_))fig = plt.figure(figsize=(10,5))ax = fig.add_subplot(1,2,1)ax.plot(epsilons,ARIs,marker = '+')ax.set_xscale('log')ax.set_xlabel(r"$\epsilon$")ax.set_ylim(0,1)ax.set_ylabel('ARI')ax = fig.add_subplot(1,2,2)ax.plot(epsilons,Core_nums,marker='o')ax.set_xscale('log')ax.set_xlabel(r"$\epsilon$")ax.set_ylabel('Core_num')fig.suptitle("DBSCAN")plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
centers = [[1,1],[1,2],[2,2],[10,20]]
X,labels_true = create_data(centers,1000,0.5)
test_DBSCAN_epsilon(X,labels_true)
  • 1
  • 2
  • 3

ϵϵ参数的影响结果如上图所示:

  可以看到ARIARI指数随着ϵϵ的增长,先上升后保持平稳,最后悬崖式下降。悬崖式下降是因为我们产生的训练样本的间距比较小,最远的两个样本之间的距离不超过30,当ϵϵ过大时,所有的点都在一个邻域中。 
  样本核心数量随着ϵϵ的增长而上升,这是因为随着ϵϵ的增长,样本点的邻域在扩展,则样本点邻域中的样本会增多,这就产生了更多满足条件的核心样本点。但是样本集中的样本数量有限,因此核心样本点的数量增长到一定数目后会趋于稳定。

下面接着考察MinPtsMinPts参数的影响:

def test_DBSCAN_min_samples(*data):X,labels_true=datamin_samples=range(1,100)ARIs=[]Core_nums=[]for num in min_samples:clst=cluster.DBSCAN(min_samples=num)predicted_labels=clst.fit_predict(X)ARIs.append(adjusted_rand_score(labels_true, predicted_labels))Core_nums.append(len(clst.core_sample_indices_))fig=plt.figure(figsize=(10,5))ax=fig.add_subplot(1,2,1)ax.plot(min_samples,ARIs,marker='+')ax.set_xlabel("min_samples")ax.set_ylim(0,1)ax.set_ylabel('ARI')ax=fig.add_subplot(1,2,2)ax.plot(min_samples,Core_nums,marker='o')ax.set_xlabel("min_samples")ax.set_ylabel('Core_nums')fig.suptitle("DBSCAN")plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
centers = [[1,1],[1,2],[2,2],[10,20]]
X,labels_true = create_data(centers,1000,0.5)
test_DBSCAN_min_samples(X,labels_true)
  • 1
  • 2
  • 3

MinPtsMinPts参数的影响结果如下:

  可以看出ARIARI指数随着MinPtsMinPts的增长,平稳地下降。而核心样本数量随着MinPtsMinPts的增长基本呈线性下降,这是因为随着MinPtsMinPts的增长,样本点的邻域中必须包含更多的样本才能使它成为一个核心点。因此产生的样本点数量越来越少。

有关ARIARI,请参考:

Python机器学习——DBSCAN聚类相关推荐

  1. 8.5 Python机器学习--微博聚类和音乐分类理论记录

    Python机器学习: 隆重推出scikit-learn机器学习库 Scikit-Learn是基于python的机器学习模块 Scikit-Learn中的机器学习模型非常丰富,包括SVM,决策树, G ...

  2. [Python] [机器学习] 基础聚类算法(K-means、AHC、DBSCAN)简介及可视化代码

    之前写的入门级介绍,有点久远有些ref找不着了 文章目录 简介 目标 作用 类型 聚类vs分类 K-means [K-means] 伪代码 [K-means] 过程详解 [K-means] 初始点的选 ...

  3. 【Python机器学习】聚类算法任务,评价指标SC、DBI、ZQ等系数详解和实战演示(附源码 图文解释)

    需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一.聚类任务 设样本集S={x_1,x_2,-,x_m}包含m个未标记样本,样本x_i=(x_i^(1),x_i^(2),-,x_i^(n))是一 ...

  4. python实现DBSCAN聚类

    该博客配套代码.数据及PPT见百度网盘 链接:https://pan.baidu.com/s/1j1iWnhXmQiAnQ7VnfsCIrQ  提取码:6666 算法实战 数据为31个省份的出生率和死 ...

  5. Python机器学习---2.聚类算法理论部分

    文章目录 1.聚类分析 1.1 无监督学习与聚类算法 1.1.1.旨在理解数据自然结构的聚类 1.1.2 用于数据处理的聚类 1.2 核心概念 1.2.1 聚类分析 1.2.2 簇 1.3 基于原型的 ...

  6. 11-赵志勇机器学习-DBSCAN聚类

    (草稿) 两点关系的三种定义: 1. 直接密度可达:A在B的邻域内: 2. 密度可达:AB之间存在,直接密度可达的点串: 3. 密度连接:AB之间存在点k,使得Ak和Bk都密度可达: 过程: 1. 对 ...

  7. DBSCAN聚类算法——机器学习(理论+图解+python代码)

    一.前言 二.DBSCAN聚类算法 三.参数选择 四.DBSCAN算法迭代可视化展示 五.常用的评估方法:轮廓系数 六.用Python实现DBSCAN聚类算法 一.前言 去年学聚类算法的R语言的时候, ...

  8. 机器学习 聚类篇——python实现DBSCAN(基于密度的聚类方法)

    机器学习 聚类篇--python实现DBSCAN(基于密度的聚类方法) 摘要 python实现代码 计算实例 摘要 DBSCAN(Density-Based Spatial Clustering of ...

  9. python机器学习库sklearn——DBSCAN密度聚类

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 DBSCAN密度聚类的相关 ...

最新文章

  1. python 如何获取当前系统的时间
  2. 多伦多大学2020春季CSC311课程「机器学习导论」课件PPT
  3. windows 2003 禁止UDP的bat
  4. Java黑皮书课后题第7章:*7.28(数学:组合)编写一个程序,提示用户输入10个整数,然后显示从这10个数中选出两个数的所有组合
  5. ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘
  6. 配置jdk和maven环境并测试
  7. python模板语言_你应该(或许)没使用过的 3 种 Python 模板语言 | Linux 中国
  8. python django博客源码_利用Django实现一个博客(附全部源码)
  9. 格式化信息窗口内容—ArcGIS API for JavaScript
  10. poj 1609 Tiling Up Blocks 动态规划
  11. Tomcat免安装版执行tomcat9.exe闪退
  12. 蓝牙芯片 csr8645 和 qcc3005 哪个比较
  13. 飞鸽传书2007绿色版的《虚拟光驱》
  14. 融合黄金正弦与sigmoid连续化的海鸥优化算法-附代码
  15. 信号在PCB走线中的延迟
  16. 只有韦小宝最适合当产品经理
  17. javascript判断文本语言类型
  18. 和平精英服务器维护多少钱,和平精英因充钱太多服务器崩溃?王小歪充52W,只用一小时...
  19. 如何在企业中从0-1建立一个数据/商业分析部门?
  20. php 条形码在线怎么生成,php实现在线生成条形码示例分享(条形码生成器)

热门文章

  1. 2022-2028年中国钢铁电商产业竞争现状及发展前景预测报告
  2. 2022-2028年中国降解塑料聚酯行业运行动态及投资机会分析报告
  3. NVIDIA DGX SUPERPOD 企业解决方案
  4. matrix_multiply代码解析
  5. PointRCNN: 点云的3D目标生成与检测
  6. 单目摄像头检测6D姿态
  7. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构
  8. c语言程序设计第二版第五章课后答案甘勇,郑州工程技术学院副院长甘勇来校讲学和指导工作...
  9. python 读取excel 内的中文显示为unicode 编码
  10. Android 弱引用 (WeakReference)的使用