一、密度聚类

密度聚类的思想,在于通过计算样本点的密度的大小来实现一个簇/类别的形成,样本点密度越大,越容易形成一个类,从而实现聚类。

密度聚类算法可以克服基于距离的聚类算法只能发现凸型集合的缺点,其可根据密度的分布发现任意形状的聚类,且对噪声数据不敏感。

因密度聚类算法需计算每个样本点附件的样本密度,因此计算复杂度比较大。

二、DBSCAN算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚类算法,一个比较具有代表性的基于密度的聚类算法。与划分聚类、层次聚类不同的是,它将簇定义为密度相连的样本点的最大集合,可在有噪声样本的样本集中发现任意形状的簇。

1、DBSCAN算法的一些概念

a. 对象:可看作样本点

b. 对象的 - 邻域:给定对象在半径 内的区域。

c. 核心对象:给定一个数目 m ,如果一个对象的 - 邻域至少包含 m 个对象,则称该对象为核心对象。

d. 直接密度可达:如果对象 p 是在 对象 q 的 - 邻域内,且对象 q 是一个核心对象。我们可以说从对象 q 出发,对象 p 是直接密度可达的。

e. 密度可达:如果对象 p 是从对象 q 出发关于 和 m(含义同上)直接密度可达的;又有 如果对象 r 是从对象 p 出发关于 和 m 直接密度可达的,那么对象 r 是从对象 q 出发关于 和 m 密度可达的;

f. 密度相连:若存在一个对象 o ,使得对象 p 和 q 是从 对象 o 关于 和 m 密度可达的,那么对象 p 和 q 是关于 和 m 密度相连的。

g. 簇:最大的、密度相连对象的集合。

h. 噪声:不包含在任何簇里面的对象

2、DBSCAN算法流程

a. 如果一个样本点的 - 邻域 包含多于 m 个对象,则创建一个 p 作为核心对象的新簇。

b. 寻找核心对象的直接密度可达的对象,被合并为一个新的簇。

c. 直到没有点可以更新簇时算法结束。

注意:非核心对象是没有直接密度可达的对象的,它们一般构成了簇的边缘。每个簇可包含多个核心对象。DBSCAN算法有两个参数:一个是 ,另一个是 m 。

三、密度最大值聚类

密度最大值聚类也有密度聚类的特点,可识别各种形状的簇,其可根据样本点的局部密度高局部密度距离来确定聚类中心或噪声样本。

1、局部密度

定义一个样本的局部密度为 有两种表示。

一种使用Cut-off Kernel的计算表示为: ,即在离该点的一定距离d_c范围内所有点的总数。(i 不等于 j)

一种使用Gaussian Kernel的计算表示为:,高斯核函数是根据距离衰减的。(i 不等于 j)

其中d_c为截断距离,为该算法的一个超参数。又因为各个样本 的大小是相对的,d_c 的选择是稳健的。

2、更高局部密度点的最小距离

定义一个样本的更高局部密度点的最短距离为 , 的数学表示为

即在局部密度高于对象(样本) i 的所有对象中,到 对象 i 最近的距离 为 对象 i 的 更高局部密度的最小距离。

对于局部密度最大的对象(样本),设置其 , 其 为无穷大。

对于每一个样本点,都有与其相对应的 ,一般来说,只有局部密度在其周围是最大的那些样本点,它们才会有较大的更高局部密度点最小距离。(周围的情况有两种:一种是周围没有其他样本点,另一种是它的局部密度真的很大。)。

3、簇中心和噪声的识别

对于那些有着比较大的局部密度 和 很大的更高局部密度最小距离 的样本点,它们往往会被认为是簇的中心。

而对于那些 很大的更高局部密度最小距离 但 局部密度 较小的点 往往会被认为是噪声样本点。

将下面这种( )对应的图成为决策图。例如如下决策图:

其中 1 号和10 号 可被视为聚类中心,而28号可被视为 噪声样本。这种判断是一种定性分析,只是主观地去判断聚类中心/噪声。

在确定聚类中心之后,其他点可以再基于距离/密度的算法进行分类。

四、代码示例

主要是DBSCAN算法与K-Means算法的聚类效果的比较。

from sklearn.datasets.samples_generator import make_moons
X,y_true = make_moons(n_samples=1000,noise=0.15)
import matplotlib.pyplot as plt
plt.scatter(X[:,0],X[:,1],c=y_true)
plt.show()

import time
from sklearn.cluster import KMeans
t0 = time.time()
kmeans = KMeans(init = 'k-means++',n_clusters=2, random_state=8).fit(X)
t = time.time() - t0
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.title('time : %f'%t)
plt.show()

from sklearn.cluster import DBSCAN
t0 = time.time()
dbscan = DBSCAN(eps=.1,min_samples=6).fit(X)
t = time.time()-t0
plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_)
plt.title('time : %f'%t)
plt.show()

from sklearn.datasets.samples_generator import make_circles
X,y_true = make_circles(n_samples=2000,factor=0.45,noise=0.1)
plt.scatter(X[:,0],X[:,1],c=y_true)
plt.show()

t0 = time.time()
kmeans = KMeans(init = 'k-means++',n_clusters=2, random_state=8).fit(X)
t = time.time() - t0
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.title('time : %f'%t)
plt.show()

t0 = time.time()
dbscan = DBSCAN(eps=.1,min_samples=6).fit(X)
t = time.time()-t0
plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_)
plt.title('time : %f'%t)
plt.show()

由图可看出,K-means算法实现簇的形状的一些局限性。

机器学习之密度聚类及代码示例相关推荐

  1. python实现k core算法_python实现密度聚类(模板代码+sklearn代码)

    本人在此就不搬运书上关于密度聚类的理论知识了,仅仅实现密度聚类的模板代码和调用skelarn的密度聚类算法. 有人好奇,为什么有sklearn库了还要自己去实现呢?其实,库的代码是比自己写的高效且容易 ...

  2. 机器学习实战——密度聚类算法

    机器学习实战--密度聚类算法 1 密度聚类 2 sklearn中的实现 1 密度聚类 密度聚类假设聚类结构能够通过样本分布的密集程度确定,通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接 ...

  3. gmm聚类python_GMM-实现聚类的代码示例

    Matlab 代码: % GMM code function varargout = gmm(X, K_or_centroids) % input X:N-by-D data matrix % inp ...

  4. 机器学习之密度聚类算法

    基于密度的聚类算法假设聚类结构能够通过样本分布的紧密程度确定,以数据集在空间分布上的稠密程度为依据进行聚类,即只要一个区域中的样本密度大于某个阈值,就把它划入与之相近的簇中. 密度聚类从样本密度的角度 ...

  5. 机器学习之支持向量机SVM及代码示例

    一.线性可分SVM SVM算法最初是用来处理二分类问题的,是一种有监督学习的分类算法. 对于线性可分的二分类问题,我们可以找到无穷多个超平面,将两类样本进行区分.(超平面:一维中是一个点:二维中是一条 ...

  6. 机器学习-*-K均值聚类及代码实现

    KMeans聚类 在聚类算法中,最出名的应该就是k均值聚类(KMeans)了,几乎所有的数据挖掘/机器学习书籍都会介绍它,有些初学者还会将其与KNN等混淆.k均值是一种聚类算法,属于无监督学习的一种, ...

  7. 机器学习-K均值聚类(python3代码实现)

    K均值聚类 哈尔滨工程大学-537 算法原理: K均值是发现给定数据集的 k k k个簇的算法.簇个数k" role="presentation" style=" ...

  8. 【进阶版】 机器学习之K均值聚类、层次聚类、密度聚类、实战项目含代码(15)

    目录 欢迎订阅本专栏,持续更新中~ 本专栏前期文章介绍! 机器学习配套资源推送 进阶版机器学习文章更新~ 点击下方下载高清版学习知识图册 项目要求 数据透视 代码实战 维度太多,利用PCA降维的思想进 ...

  9. DBSCAN密度聚类示例深入理解

    DBSCAN 是基于密度聚类的算法 特点: 1.无需指定簇的个数 2.生成的簇数不确定 3.对非凸数据集聚类效果不错 核心思想: DBSCAN算法将数据点分为三类: 1.核心点:在半径Eps内含有超过 ...

最新文章

  1. AMD yes!拿下Meta后发布新芯片,FP64性能是A100 4.9倍,面向高性能计算和机器学习...
  2. Intel Realsense 官方案例源码地址
  3. Maven虐我千百遍,我待Maven如初恋
  4. 如何使用用户数据脚本在EC2实例上安装Apache Web Server
  5. Chrome打开cocos2d-html5官方Demo黑屏
  6. nova红a6se升级鸿蒙,华为nova 8 SE配置揭晓:麒麟芯片到底是没了
  7. 函数数列极限求法总结
  8. 字体主题宝库:25款很好看的液晶数字字体下载
  9. Windows Server 2016 安装.NET Framework 3.5 错误处理
  10. 真·杂项:资本论阅读笔记(随缘更新)
  11. BZOJ 3110 题解
  12. java-php-python-ssm医药网络挂号系统计算机毕业设计
  13. 修改游戏存档之植物大战僵尸
  14. oracle12c启动apply,Oracle 12c 新特性 -- DG 默认使用 Real-Time Apply
  15. 用爬虫程序批量采集拉勾网职位招聘信息
  16. python中subplot是什么意思_subplot(2,3,1)啥意思?
  17. UG12.0夹具加工刀路图档 夹具设计3D图档
  18. 面试官:您自己怎么规划自己的职业呢?
  19. 关于if-else配对的就近原则问题(适合初学者)
  20. 全志A40i开发板硬件说明书——100%国产+工业级方案(下)

热门文章

  1. matlab编程实现自适应均值滤波和自适应中值滤波
  2. 帆软报表与润乾报表的破解策略
  3. Word模板文件,替换内容 文本、图片、表格、列表、区块、嵌套等
  4. 基于启发式蝙蝠算法、粒子群算法、花轮询算法和布谷鸟搜索算法的换热器PI控制器优化(Matlab代码实现)
  5. java正则表达式原理_Java 正则表达式详解
  6. 将numeric转换为数据类型numeric时发生算术溢出错误
  7. jquery可以勾选的下拉框_jquery.chosen下拉框多选插件使用详解_蓝戒的博客
  8. 我的MSN Space
  9. 【WebService】第五章、WSDL文件详解
  10. 三种形式化语言和方法