聚类算法
一、基于密度的聚类DBSCAN算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。 该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。
动画讲解DBSCAN算法的国外网站:https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/
1.1DBSCAN算法的基本概念
1.取半径为3,MinPts为3(圆圈能够圈住的最小的数目),则可以得到如下的分类结果,其中,P9为噪音点,P10为噪音点。
-
MinPts:这个参数就是圆能够圈住的点的个数,也相当于是一个密度,一般这个值都是偏小一些,然后进行多次尝试
-
(1)Eps邻域:给定对象半径Eps内的邻域称为该对象的Eps邻域。
-
(2)核心点(core point):如果对象的Eps邻域至少包含最小数目MinPts的对象,则称该对象为核心对象。
-
(3)边界点(edge point):边界点不是核心点,但落在某个核心点的邻域内。
-
(4)噪音点(outlier point):既不是核心点,也不是边界点的任何点。6,
-
我们假设最小样本容量为6,A、B、C为核心对象:
-
(5) 直接密度可达:给定一个对象集合D,如果p在q的Eps邻域内,而q是一个核心对象,则称对象p从对象q出发时是直接密度可达的,比如 上图中的 A 和 B 、B 和 C 等。
-
(6)密度可达: 如果有一系列的点,都满足上一个点到这个点是密度直达,那么这个系列中不相邻的点就称为密度可达,比如 A 和 D。
-
(7)密度相连: 如果存在对象O∈D,使对象p和q都是从O关于Eps和MinPts密度可达的,那么对象p到q是关于Eps和MinPts密度相连的,比如这 里的 E 和 F 点就是密度相连。
1.2DBSCAN算法参数选择
半径: 半径是最难指定的 ,大了,圈住的点就多了,簇的个数就少了;反之,圈住的点少了,簇的个数就多了,这对我们最后的结果是有影响的。我们这个时候K距离可以帮助我们来设定半径r,也就是要找到突变点,比如:
1.3DBSCAN算法原理
- (1)DBSCAN通过检查数据集中每点的Eps邻域来搜索簇,如果点p的Eps邻域包含的点多于MinPts个,则创建一个以p为核心对象的簇;
- (2)然后,DBSCAN迭代地聚集从这些核心对象直接密度可达的对象,这个过程可能涉及一些密度可达簇的合并;
- (3)当没有新的点添加到任何簇时,该过程结束。
DBSCAN 算法的簇里面可以有一个或者多个核心点。如果只有一个核心点,则簇里其他的非核心点样本都在这个核心点的 Eps 邻域里。如果有多个核心点,则簇里的任意一个核心点的 Eps 邻域中一定有一个其他的核心点,否则这两个核心点无法密度可达。这些核心点的 Eps 邻域里所有的样本的集合组成一个 DBSCAN 聚类簇。
DBSCAN算法的描述如下。
输入:数据集,邻域半径 Eps,邻域中数据对象数目阈值 MinPts;
输出:密度联通簇。
处理流程如下。
- 1)从数据集中任意选取一个数据对象点 p;
- 2)如果对于参数 Eps 和 MinPts,所选取的数据对象点 p 为核心点,则找出所有从 p 密度可达的数据对象点,形成一个簇;
- 3)如果选取的数据对象点 p 是边缘点,选取另一个数据对象点;
- 4)重复(2)、(3)步,直到所有点被处理。
DBSCAN 算法的计算复杂的度为 O(n²),n 为数据对象的数目。这种算法对于输入参数 Eps 和 MinPts 是敏感的。
1.4DBSCAN算法中dbscan()函数的说明
dbscan(X, eps=0.5, *, min_samples=5, metric='minkowski',
metric_params=None, algorithm='auto', leaf_size=30,
p=2, sample_weight=None, n_jobs=None)
参数说明:
-
eps : float, optional
两个样本之间的最大距离,一个被认为是另一个样本的邻域。这不是群集中点的距离的最大界限。这是为您的数据集和距离函数选择适当的最重要的DBSCAN参数。 -
min_samples : int,可选
对于要被视为核心对象的点,邻域中的样本数(或总权重)。这包括点本身。 -
metric:最近邻距离度量参数。默认的欧式距离(即p=2的闵可夫斯基距离),可以使用的距离度量参数有:欧式距离 “euclidean”,曼哈顿距离 “manhattan”,切比雪夫距离“chebyshev”,闵可夫斯基距离 “minkowski”,带权重闵可夫斯基距离 “wminkowski”,标准化欧式距离 “seuclidean”,马氏距离“mahalanobis”。
-
metric_params : dict, optional
度量函数的其他关键字参数。 -
algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选
NearestNeighbors模块用于计算逐点距离并找到最近邻居的算法。有关详细信息,请参阅NearestNeighbors模块文档。 -
leaf_size : int,optional(默认值= 30)
叶子大小传递给BallTree或cKDTree。这可能会影响构造和查询的速度,以及存储树所需的内存。最佳值取决于问题的性质。 -
p : float,可选
正确译法:用于计算点之间距离的Minkowski矩阵的幂。 -
n_jobs : int或None,可选(默认=无)
要运行的并行作业数。 None除非在joblib.parallel_backend上下文中,否则表示1 。 -1表示使用所有处理器。
1.5DBSCAN算法的实现
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.cluster import dbscan
# make_moons 这个方法是生成两个交错的半圆环
data,_ = datasets.make_moons(500,noise = 0.1,random_state=1) # 创建数据集
# print('数据集0,1', data)
df = pd.DataFrame(data,columns = ['feature1','feature2']) # 将数据集转换为dataframe
# 可视化处理
# 绘制样本点,s为样本点大小,aplha为透明度,设置图形名称
# 看下面第1个图
df.plot.scatter('feature1','feature2'