今天我们来看看聚类的另一个算法,DBSCAN,
回顾一下,聚类是什么,有点什么用呢?
在样本中寻找自然集群,事先是不知道存在哪些集群的,探索数据的结构关系,常用于对客户细分,对文章聚类等。
我们就简单了解一下就行了,以后有机会再细细探究。
DBSCAN是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。
它的使用有什么特点呢?
1、聚类的时候不需要预先指定簇的个数。
2、聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类。
3、聚类簇的形状没有偏倚。
有所长就必有所短,它也是存在一定的短板的。
1、它最终获得的簇的个数也是不能确定的。
2、当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差。
3、算法聚类效果依赖与距离公式选取。
DBSCAN算法将会存在3种基本类型数据点:
——核心点:
在半径eps内含有超过Minpts数目的点
——边界点:
在半径eps内点的数量小于Minpts,但是落点在核心领域内。
——噪音点:
不是上述的两种类型的点。
DBSCAN的3个基础概念:
1)密度直达:
给定一个对象集合D,如果p在q的Eps邻域内,而q是一个核心对象,则称对象p从对象q出发时是直接密度可达的;
2)密度可达:
如果存在一个对象链p1,p2,p3..pi…,pn,满足p1 = p和pn = q,pi是从pi+1关于Eps和MinPts直接密度可达的,则对象p是从对象q关于Eps和MinPts密度可达的;
3)密度相连:
如果存在对象O∈D,使对象p和q都是从O关于Eps和MinPts密度可达的,那么对象p到q是关于Eps和MinPts密度相连的
DBSCAN的算法原理:
1)将所有未处理的点进行基础分类,分为上述的三个类型。
2)把处理后的噪音点删除。
3)为距离在eps之内的所有核心点之间赋予一条边。
4)每组连通的核心点形成一个簇
5)将每个边界点指派到一个与之关联的核心点的簇中
在下面的图片中,核心点之间的领域距离小于eps,则存在密度相连,这种密度相连是存在密度的对称性的关系。
实现使用DBSCAN的算法运用,我们用python包引入就行。
首先,我们要建立好项目,并且导入我们所需要的模块。
Import numpy as np
From sklearn.cluster import DBSCAN
DBSCAN的主要参数:
Eps:两个样本被看作邻居节点的最大距离
Min_samples:簇的样本数
Metric:距离计算方法
举个例子:sklearn.cluster.DBSCAN(eps=1.0, min_sample=3, metric=’euclidean’)
DBSCAN的属性:
core_sample_indices_core_sample_indices_:核心样本在原始训练集中的位置。components_components_:核心样本的一份副本。
labels_labels_:每个样本所属的簇标记。对于噪声样本,其簇标记为-1副本。
DBSCAN方法:
fit(X[,y,sample_weight])fit(X[,y,sample_weight]):训练模型。
fit_predict(X[,y,sample_weight])fit_predict(X[,y,sample_weight]):训练模型并预测每个样本所属的簇标记。
用DBSCAN算法进行数据训练,并且用labels添加簇标签
db=sklearn.cluster.DBSCAN(eps=1.0,min_sample=3).fit(X) ### X为数据集
labels= db.labels_
计算标签为-1,也就是噪声数据的比例。
raito=len(labels[labels[:] == -1]) / len(labels)
print('Noise raito:',format(raito, '.2%'))
打印簇的标号和数据
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
for i in range(n_clusters_): print('Cluster ',i,':') print(list(X[labels == i].flatten()))
我们下次再见。
领取专属 10元无门槛券
私享最新 技术干货