密度聚类(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=data
labels=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==label
ax.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 = data
clst = 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 = data
epsilons = 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=data
min_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,请参考:
相关推荐
DBSCAN 聚类,是一种基于密度的聚类算法,它类似于均值漂移,...作者博客中详细介绍了DBSCAN的算法原理,可以通过文章结合学习,代码包含详细注释,只需要导入自己的聚类数据,运行代码便可以得出聚类结论与图像。
最近在Science上的一篇基于密度的聚类算法《Clustering by fast search and find of density peaks》引起了大家的关注(在我的博文“论文中的机器学习算法——基于密度峰值的聚类算法”中也进行了中文的描述)。...
"fuzzy-fs-master_DBSCAN_DBSCAN聚类算法_K._python_聚类_"这一标题暗示了我们将深入探讨一种名为DBSCAN的聚类算法,以及与之相关的Python实现。DBSCAN(Density-Based Spatial Clustering of Applications with ...
在机器学习领域,聚类是一种无监督学习方法,主要用于数据的分类和组织,不依赖于预先标记的数据。本文将深入探讨两种广泛使用的聚类算法——KMeans和DBSCAN,并通过Python语言来阐述其实现。 首先,KMeans算法是...
密度聚类dbscan算法—python代码实现(含二维三维案例、截图、说明手册等) DBSCAN算法的python实现 它需要两个输入。第一个是。包含数据的csv文件(无标题)。主要是。py’将第12行更改为。 第二个是配置文件,其中...
DBSCAN聚类算法的实现,对图片内的物体进行分类,综合考虑了像素和像素点的位置,运行速度较慢。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
在Python机器学习领域,恶意代码聚类分析是一种重要的技术,用于识别、分类和理解大量复杂的恶意软件行为。这种分析方法可以有效地帮助安全专家们发现潜在的威胁模式,预测未来的攻击,并提升网络安全防御策略。以下...
DBSCAN(Density-Based Spatial Clustering of Applications with Noise...在实际应用中,结合Python的scikit-learn库,可以方便地实现DBSCAN聚类。然而,合理选择参数和考虑算法效率对于获得良好的聚类效果至关重要。
在数据分析和机器学习领域,聚类是一种常用的技术,用于发现数据中的自然群体或模式,而无需预先知道具体的分类信息。本篇文章将详细讲解三种聚类方法:K-means、GMM(高斯混合模型)以及DBSCAN(基于密度的空间聚类...
在本课程“宅着宅着就学习惯了”中,我们深入探讨了机器学习领域中的一个重要概念——聚类算法,并且特别关注了其中的KMeans算法。聚类是一种无监督学习方法,它允许我们根据数据的内在相似性将数据点分组到不同的簇...
在Python数据分析和机器学习领域,聚类是一种常用的技术,它属于无监督学习范畴,主要用于发现数据中的内在结构和模式,而无需预先知道具体的类别或标签。在这个“Python数据分析与机器学习-聚类实践”主题中,我们...
种子数据程序部分_K._DBSCAN_聚类分析.zip 这个压缩包文件主要涉及的是数据挖掘中的一个关键算法——DBSCAN(Density-Based Spatial Clustering of Applications with Noise)。DBSCAN是一种基于密度的空间聚类算法...
`scikit-learn`是Python中最受欢迎的机器学习库之一,它提供了多种聚类算法,包括K-Means、DBSCAN等。 首先,我们需要导入必要的库: ```python from sklearn.cluster import DBSCAN import numpy as np import ...
Python机器学习图片聚类是一个广泛应用于图像分析和计算机视觉领域的技术。它可以帮助我们无监督地组织和分类大量的图片,无需预先知道每个类别的具体信息。在这个"python机器学习图片聚类demo"中,我们将深入探讨...
DBSCAN算法实现,基于Python语言,非调用sklearn库,参考了周志华《机器学习》的算法流程,代码清晰易懂。
包含KMeans、DBSCAN、LDA和Single_Pass的文本聚类算法程序(python实现)。 详细信息: 基于KMeans的无监督中文文本聚类 基于DBSCAN的无监督中文文本聚类 基于LDA的无监督文本聚类 基于single pass 策略进行聚类,不...
Python的科学计算库Scikit-learn提供了丰富的机器学习算法,包括`KMeans`和`DBSCAN`。`sklearn.cluster.KMeans`是KMeans的实现,而`sklearn.cluster.DBSCAN`则是DBSCAN的实现。使用这些类,用户可以方便地进行聚类...
《Python机器学习编程与实战》课程的PPT课件涵盖了从Python基础知识到机器学习实践的广泛内容,旨在帮助学习者掌握Python在数据处理和机器学习领域的应用。以下是对每个章节主要内容的详细阐述: 1. **第1章 Python...
在数据分析和机器学习领域,K-Means是一种广泛使用的无监督学习算法,它主要用于执行聚类分析,即将数据集中的样本点自动分组到不同的类别中。K-Means算法的核心思想是通过迭代过程,不断调整样本点的所属类别,以...