DBSCAN算法原理
DBSCAN算法概述
概念

名词含义

1、2核心对象和E邻域:某个点A,在半径E内的密度达到算法的阈值,则A点是核心对象。
3、4直接密度可达和密度可达:A点和B点、B点和C点是直接密度可达;A点和C点是密度可达。

5边界点:如图中的B、C,如名字的直接含义
6离群点:如图中的N,如名字的直接含义
算法工作原理

假设密度阈值为4。
第一步点A半径为E的区域内有4个点达到了阈值。
第二步:以A点周边的点为对象,半径为E的区域画圆,有核心对象DEF密度阈值都达到了4。
第三步:DEF为圆心,半径为E继续画圆,如果达到阈值就继续画圆,不断向外扩张,直到未达到阈值的BC边界点就停止。

DBSCAN聚类流程可视化展示
eps:半径
minPoints:圆内最少点数,即阈值
初始点随机选取
DBSCAN中API参数详解
class sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, metric=’euclidean’, metric_params=None, algorithm=’auto’, leaf_size=30, p=None, n_jobs=None)
参数
eps:(半径) DBSCAN算法参数,即我们的ϵϵ-邻域的距离阈值,和样本距离超过ϵϵ的样本点不在ϵϵ-邻域内。默认值是0.5.一般需要通过在多组值里面选择一个合适的阈值。eps过大,则更多的点会落在核心对象的ϵϵ-邻域,此时我们的类别数可能会减少, 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。
min_samples:(minPoints) DBSCAN算法参数,即样本点要成为核心对象所需要的ϵϵ-邻域的样本数阈值。默认值是5. 一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点,类别数也会变多。反之min_samples过小的话,则会产生大量的核心对象,可能会导致类别数过少。
**metric:**最近邻距离度量参数。可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离(即p=2的闵可夫斯基距离)就可以满足我们的需求。可以使用的距离度量参数有:
a) 欧式距离 “euclidean”:
b) 曼哈顿距离 “manhattan”
c) 切比雪夫距离“chebyshev”
…
还有一些其他不是实数的距离度量,一般在DBSCAN算法用不上,这里也就不列了。
**metric_params:**不用管。
**algorithm:**最近邻搜索算法参数,算法一共有三种,第一种是蛮力实现,第二种是KD树实现,第三种是球树实现。对于这个参数,一共有4种可选输入,‘brute’对应第一种蛮力实现,‘kd_tree’对应第二种KD树实现,‘ball_tree’对应第三种的球树实现, ‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。需要注意的是,如果输入样本特征是稀疏的时候,无论我们选择哪种算法,最后scikit-learn都会去用蛮力实现‘brute’。个人的经验,一般情况使用默认的 ‘auto’就够了。 如果数据量很大或者特征也很多,用"auto"建树时间可能会很长,效率不高,建议选择KD树实现‘kd_tree’,此时如果发现‘kd_tree’速度比较慢或者已经知道样本分布不是很均匀时,可以尝试用‘ball_tree’。而如果输入样本是稀疏的,无论你选择哪个算法最后实际运行的都是‘brute’。
p: 最近邻距离度量参数。只用于闵可夫斯基距离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离, p=2为欧式距离。如果使用默认的欧式距离不需要管这个参数。
【属性】
Labels_:
每个点的分类标签。
代码
"""
DBSCAN算法
"""
import pandas as pd
from sklearn.cluster import DBSCAN
from sklearn import metrics
beer = pd.read_table(r'/Users/dx/Desktop/Python数据分析与机器学习/13.k-means聚类/K-means聚类/data.txt',
sep = ' ')#txt文件中分隔符是空格
#传入变量(列名)
X = beer[["calories","sodium","alcohol","cost"]]
'''
eps:半径
min_samples:最小密度【就是圆内最少有几个样本点】
labels:分类结果【自动分类,-1为离群点】
'''
db = DBSCAN(eps = 20 ,min_samples = 3).fit(X)
labels = db.labels_
##添加结果到原数据框
beer['cluster_db'] = labels
beer.sort_values('cluster_db')
#查看分类结果:可以看到-1的卡路里和酒精明显少,0类卡路里和酒精高,1类比0类低
beer.groupby('cluster_db').mean()
#对聚类效果评分
'''
采用轮廓系数评分
X:数据集 scaled_cluster:聚类结果
score:非标准化聚类结果的轮廓系数
'''
score = metrics.silhouette_score(X, labels)
print(score)#0.673,结果还不错

DBSCAN是一种基于密度的空间聚类算法,通过核心对象、E邻域和密度可达的概念进行聚类。它不依赖于先验知识的类别数量,能发现任意形状的簇。在参数设置上,`eps`表示邻域距离阈值,`min_samples`表示成为核心对象所需的邻域内点数。算法通常使用欧氏距离,但支持多种距离度量。在大规模数据集上,可以选择使用KD树或球树加速计算。
5502

被折叠的 条评论
为什么被折叠?



