机器学习——聚类——密度聚类法——DBSCAN
目录
- 理论部分
- 1.1 提出背景
- 1.2 常见算法
- 1.3 DBSCAN算法
- 1.3.1 基本概念
- 1.3.2 算法流程
- 1.3.3 参数设置
- 1.3.3 优点
- 1.3.4 缺点
- 1.3.5 可视化结果展示
- 1.4 评估指标
- 代码部分
- 2.1 不使用sklearn实现
- 2.2 使用sklearn实现
理论部分
1.1 提出背景
与K-means算法基于距离聚类不同,DBSCAN算法是基于样本点密度进行聚类。基于距离的聚类方法只适用于凸型数据尤其是球状分布的数据,而难以处理非凸数据,而密度聚类法可以很好地解决这个问题,密度聚类法的基本思想是只要一个区域中的点的密度大过某个阀值,就把它加到与之相近的聚类中去。
1.2 常见算法
基于密度的聚类算法有很多,例如DBSCAN算法、OPTICS算法、DENCLUE算法、基于密度峰值的聚类方法等。本篇我们着重讲解DBSCAN。
1.3 DBSCAN算法
1.3.1 基本概念
设X=[x1,x2,⋯,xn]X=[x^{1},x^{2},\cdots,x_{n}]X=[x1,x2,⋯,xn]为样本集,ϵ\epsilonϵ表示领域半径,MMM表示密度阈值,则有:
·ϵ\epsilonϵ领域
Nϵ(x)={y∈X∣d(x,y)<ϵ}N_{\epsilon}(x)=\{y\in X|d(x,y)<\epsilon\}Nϵ(x)={y∈X∣d(x,y)<ϵ}
即表示以xxx为中心,ϵ\epsilonϵ为半径的圆内样本点的集合(包括自身)。
·ρ(x)\rho(x)ρ(x)密度
ρ(x)=∣Nϵ(x)∣\rho(x)=|N_{\epsilon}(x)|ρ(x)=∣Nϵ(x)∣
xxx的密度定义为xxx的ϵ\epsilonϵ领域内的样本点个数。
·核心点
令x∈Xx\in Xx∈X,若ρ(x)≥M\rho(x) \geq Mρ(x)≥M,则称xxx为XXX的核心点,记XXX中所有核心点构成的集合为XcX_{c}Xc,所有非核心点构成的集合为XncX_{nc}Xnc
PS:简单来说,核心点即为满足在ϵ\epsilonϵ领域内至少有密度阈值个样本点的点。
·边界点
若x∈Xncx\in X_{nc}x∈Xnc(即xxx为非核心点),且 ∃y∈X\exists y \in X∃y∈X,满足:
y∈Nϵ(x)∩Xcy \in N_{\epsilon}(x)\cap X_{c}y∈Nϵ(x)∩Xc
则称xxx为边界点,令样本点中所有边界点构成的集合为XbpX_{bp}Xbp
PS:边界点可以理解为指那些落入核心点ϵ\epsilonϵ领域内的但不是核心点的样本点。
·噪声点
若样本点xxx同时有:
x∈X,x∉Xcandx∉Xbpx\in X,x\notin X_{c} and x \notin X_{bp}x∈X,x∈/Xcandx∈/Xbp
则称xxx为噪声点。
PS:噪声点可以理解为既不是核心点也不是边界点的样本点。即若某个样本点在其ϵ\epsilonϵ领域内不具有至少密度阈值个样本点,同时该样本点也不落在任何核心点的ϵ\epsilonϵ领域内,则称该样本点为噪声点。
如上图,蓝色样本点即为核心点,黑色样本为边界点,白色样本为噪声点。
·密度直达
对于样本点x,yx,yx,y,若有:
x∈Nϵ∣(y)x\in N_{\epsilon|(y)}x∈Nϵ∣(y)
ρy=∣Nϵ∣(y)∣≥M\rho_{y}=|N_{\epsilon|(y)}|\geq Mρy=∣Nϵ∣(y)∣≥M
则称xxx是由yyy关于参数(ϵ,M)(\epsilon,M)(ϵ,M)密度直达。
PS:xxx是由yyy密度直达的等效为以下说法:yyy是核心点且xxx处在yyy的ϵ\epsilonϵ领域内。
·密度可达
对于样本点x,yx,yx,y,如果存在一系列样本点p1,p2,⋯,pn(p1=x,pn=y)p_{1},p_{2},\cdots ,p_{n}(p_{1}=x,p_{n}=y)p1,p2,⋯,pn(p1=x,pn=y),若pi+1p_{i+1}pi+1能够由pip_{i}pi密度直达(i=1,2,3,⋯,n−1)(i=1,2,3,\cdots ,n-1)(i=1,2,3,⋯,n−1),则称yyy 可由xxx密度可达。
·密度相连
如果存在一个样本点zzz,使得xxx yyy均可由zzz密度可达,则称xxx yyy是密度相连的。
1.3.2 算法流程
该算法流程可大致描述如下:首先确定所有的核心点从而构成核心点集合(并将这些核心点标注为已访问)。而后每次选取一个核心点,如果其密度直达范围中存在另一个核心点,则将该核心点和可到达的那个核心点以及两者的密度直达范围中的样本点全部归属为一类。否则,第一类完成,开始第二类聚类,以此类推
1.3.3 参数设置
若ϵ\epsilonϵ或者MMM设置得非常小,则意味着没有点是核心样本,可能会导致所有点被标记为噪声
若ϵ\epsilonϵ或者MMM设置得非常大,可能会导致所有点形成单个簇。
1.3.3 优点
1.不必提前设置聚类数。
2.对非凸型数据处理能力较强,可以对任意类内稠密,类间系数的样本集进行聚类。
3.对异常点敏感性较低,可以较为有效地排除异常点的干扰。
4.可优化性强,部分步骤可由数据结构中的相关算法进行优化。
1.3.4 缺点
1.需要设置ϵ\epsilonϵ和MMM,而这往往是依靠人的直觉和经验的。
2.在大规模数据集上效率较低。
属于簇的点是实心,噪声点则显示为空心,核心样本点显示为较大的标记,而边界点则显示为较小的标记,上图即验证了ϵ\epsilonϵ和MMM取值大小对结果的影响。
1.3.5 可视化结果展示
上图为DBSCAN算法对于非球形分布数据的聚类过程。
上图为DBSCAN聚类结果(左图)和K-means聚类结果(右图)的对比
不同的ϵ\epsilonϵ和MMM设置也会导致不同的结果:
1.4 评估指标
这里仍然可以采用轮廓系数进行评估,关于轮廓系数的介绍可以见另一篇博客K均值聚类法介绍
代码部分
2.1 不使用sklearn实现
import matplotlib.pyplot as plt
import random
import numpy as np
import math
from sklearn import datasetslist_1 = []
list_2 = []
def loadDataSet(fileName, splitChar='\t'):dataSet = []with open(fileName) as fr:for line in fr.readlines():curline = line.strip().split(splitChar)fltline = list(map(float, curline))dataSet.append(fltline)return dataSet# 计算两个点之间的欧式距离,参数为两个元组
def dist(t1, t2):dis = math.sqrt((np.power((t1[0]-t2[0]),2) + np.power((t1[1]-t2[1]),2)))# print("两点之间的距离为:"+str(dis))return dis# DBSCAN算法,参数为数据集,Eps为指定半径参数,MinPts为制定邻域密度阈值
def dbscan(Data, Eps, MinPts):num = len(Data) # 点的个数# print("点的个数:"+str(num))unvisited = [i for i in range(num)] # 没有访问到的点的列表# print(unvisited)visited = [] # 已经访问的点的列表C = [-1 for i in range(num)]# C为输出结果,默认是一个长度为num的值全为-1的列表# 用k来标记不同的簇,k = -1表示噪声点k = -1# 如果还有没访问的点while len(unvisited) > 0:# 随机选择一个unvisited对象p = random.choice(unvisited)unvisited.remove(p)visited.append(p)# N为p的epsilon邻域中的对象的集合N = []for i in range(num):if (dist(Data[i], Data[p]) <= Eps):# and (i!=p):N.append(i)# 如果p的epsilon邻域中的对象数大于指定阈值,说明p是一个核心对象if len(N) >= MinPts:k = k+1# print(k)C[p] = k# 对于p的epsilon邻域中的每个对象pifor pi in N:if pi in unvisited:unvisited.remove(pi)visited.append(pi)# 找到pi的邻域中的核心对象,将这些对象放入N中# M是位于pi的邻域中的点的列表M = []for j in range(num):if (dist(Data[j], Data[pi])<=Eps): #and (j!=pi):M.append(j)if len(M)>=MinPts:for t in M:if t not in N:N.append(t)# 若pi不属于任何簇,C[pi] == -1说明C中第pi个值没有改动if C[pi] == -1:C[pi] = k# 剩余点既不是核心点也不是边界点else:C[p] = -1return CdataSet = loadDataSet(r'D:\Deeplearning\788points.txt', splitChar=',')
C = dbscan(dataSet, 2, 14)
print(C)
x = []
y = []
for data in dataSet:x.append(data[0])y.append(data[1])
plt.figure(figsize=(8, 6), dpi=80)
plt.scatter(x,y, c=C, marker='o')
plt.show()
结果如下:
2.2 使用sklearn实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
%matplotlib inline
X1, y1=datasets.make_circles(n_samples=5000, factor=.6,noise=.05)
X2, y2 = datasets.make_blobs(n_samples=1000, n_features=2, centers=[[1.2,1.2]], cluster_std=[[.1]],random_state=9)X = np.concatenate((X1, X2))
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()
y_pred = DBSCAN(eps = 0.1, min_samples = 10).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
结果如下:
未经允许,请勿转载
欢迎交流
机器学习——聚类——密度聚类法——DBSCAN相关推荐
- 机器学习实战——密度聚类算法
机器学习实战--密度聚类算法 1 密度聚类 2 sklearn中的实现 1 密度聚类 密度聚类假设聚类结构能够通过样本分布的密集程度确定,通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接 ...
- 机器学习之密度聚类及代码示例
一.密度聚类 密度聚类的思想,在于通过计算样本点的密度的大小来实现一个簇/类别的形成,样本点密度越大,越容易形成一个类,从而实现聚类. 密度聚类算法可以克服基于距离的聚类算法只能发现凸型集合的缺点,其 ...
- 机器学习之密度聚类算法
基于密度的聚类算法假设聚类结构能够通过样本分布的紧密程度确定,以数据集在空间分布上的稠密程度为依据进行聚类,即只要一个区域中的样本密度大于某个阈值,就把它划入与之相近的簇中. 密度聚类从样本密度的角度 ...
- 【机器学习】聚类【Ⅴ】密度聚类与层次聚类
主要来自周志华<机器学习>一书,数学推导主要来自简书博主"形式运算"的原创博客,包含自己的理解. 有任何的书写错误.排版错误.概念错误等,希望大家包含指正. 由于字数限 ...
- 机器学习-第九章 聚类
机器学习-第九章 聚类 D系鼎溜已关注 2020.02.19 10:36:17字数 3,312阅读 375 9.1 聚类任务 在无监督学习任务中,包括了密度估计.异常检测以及聚类等.其中应用最广泛的是 ...
- 机器学习笔记(九)聚类
9.聚类 有必要回顾下前文所涉及的机器学习主流分类,有监督学习中根据预测结果离散和连续属性分为分类和回归两大类,常见的算法有:线性模型.决策树.神经网络.支持向量机.贝叶斯分类器以及集成学习. 本文开 ...
- 密度聚类与层次聚类的基本概念理解
密度聚类 密度聚类也称为基于密度的聚类,此算法假设聚类结构能够通过样本分布的紧密程度确定. DBSCAN是一种著名的密度聚类算法,它基于一组邻域(对于xj,其邻域包含的样本集与xj的距离不大于ε)参数 ...
- 关于距离,K-means,层次聚类,密度聚类以及谱聚类
目录 相似度/距离 k-Means算法 衡量聚类(轮廓系数) 层次聚类 密度聚类 谱聚类 之前博客中讲的模型基本上都是分类以及回归模型,他们都是属于有监督学习的,意为所有的样本都有一个结果值提供,我们 ...
- R语言 均值聚类、中心聚类、系谱聚类、密度聚类、最大期望聚类
关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 R版本:v_3.6.1 主要讲述5类聚类: K-means聚类 K-中心聚类 系谱聚类 密度聚类 EM聚类 5种聚类的应用实例以及详细的参数说 ...
最新文章
- SQL Server ltrim(rtrim()) 去不掉空格
- 合并多个excel——贼快
- Python 二维数组
- 用tcc编译一个c语言写的简单代码hello world
- CSS3笔记之定位篇(一)relative
- html 去除max-height,HTML Style maxHeight用法及代码示例
- spring配置数据库
- web元件库/axure元件库/常用web组件/常用表单/导航栏/边框/图标/日期时间选择器/评分组件/穿梭框/输入框/步骤条/
- 手桌面上没有计算机,手把手教你电脑桌面图标都不见了怎么办
- 2016.01.10 论文扩充、精修、查重
- Spring boot 之搭建
- 三十三、Fluent边界条件湍流参数设置详解
- Cocos2d-x制作跨平台太空射击游戏
- 微信小程序采坑三:输入框设置自动获取焦点后无法自动获取焦点
- GPS接收机-从射频信号到定位解算
- 数据结构(C)必会知识点+易错点:数组和广义表(n维数组地址计算公式,特殊矩阵对称矩阵的存储,广义表的表示方法)
- 【报错记录】阿里云OSS搭建图床 访问报错
- 反向传播 - 李宏毅机器学习笔记
- “黑客”必备书籍 你值得拥有!
- 动态分析之OllyDbg