聚类算法之密度聚类(DBSCAN)

DBSCAN(密度聚类)

什么是聚类

聚类是无监督学习的一个小分支,其本质就是将样本通过亲近程度对其进行分类,你可能会有疑问?分多少类别?亲近程度如何衡量?

分多少类

至于分多少类,有的是自动学习得到,比如DBSCAN等,有的是手动指定,比如K-means等。后续的代码中会有体现

亲近关系的衡量指标

至于用什么来衡量亲近程度?对于有序属性的样本,可以使用闵可夫斯基距离、欧几里得距离、曼哈顿距离来描述,对于无序属性样本,可使用VDM,下面简单介绍一个闵可夫斯基距离。
闵可夫斯基距离公式
d m k ( x i , x j ) = ( ∑ u = 1 n ∣ x i u − x j u ∣ p ) 1 p d_{mk}(x_{i},x_{j})=\left ( \sum_{u=1}^{n} \left | x_{iu} -x_{ju} \right | ^{p} \right ) ^{\frac{1}{p} } dmk(xi,xj)=(u=1nxiuxjup)p1

其中
x i x_{i} xi: 第i个样本;
x j x_{j} xj: 第j个样本;
x i u x_{iu} xiu: 第i个样本的第u个特征;
x j u x_{ju} xju: 第j个样本的第u个特征;

当p=2时,就是欧几里得距离公式,当p=1时,就是曼哈顿距离,在实际应用中,通常都是采用欧几里得距离或是曼哈顿距离。
最后再多一点解释,关于什么是无序样本和有序样本,无序样本,其实可以理解为就是不能直接测量出数据的样本,比如一个样本的特征并不能用数字表示{性格,家庭住址,婚否}。有序样本,可以直观理解为特征都是数字,比如以坐标作为一个样本,其中x,y就是其特征,都是数字,有数字自然可以计算距离。

DBSCAN(密度聚类)

DBSCAN是无监督学习的一种算法,利用给定领域和最小领域样本数,最终将样本分为多个类。

在这里插入图片描述

与K-means区别

不用像K-means一样,需要给定分类数和迭代次数,而是需要指定两个参数: ( ϵ , M i n P t s ) \left ( \epsilon ,MinPts \right ) (ϵ,MinPts)
分类目的:根据图中所示,可以通俗的说,就是找到一个中心点,在以 ϵ \epsilon ϵ为半径画圆,如果在这个圆内的点数至少有MinPts时候,就表示一个类分类完成。否则这个中心点不合格,分割失败,要重新寻找中心点。

算法流程

1.设置 ( ϵ , M i n P t s ) \left ( \epsilon ,MinPts \right ) (ϵ,MinPts) 参数
2.遍历样本集,以这个点为中心,如果其他样本有多个与中心的距离小于 ϵ \epsilon ϵ,且这样的样本个数不少于MinPts,则这个样本就是第一个中心点,停止遍历。
3.以选出的样本为中心,遍历除此之外的整个样本集合(注意,这里的遍历和第二步的遍历不一样,第二步如果一开始就找到中心点,其实不用完全遍历),找出所有与中心距离小于 ϵ \epsilon ϵ的样本,将此归为一类。
4.讲分好类的样本从整体样本集合中减去,然后重复2、3步,直到待分类样本集合为空位置。分类结束。

具体举例

假设待分类样本集合为D= x 1 、 x 2 、 x 3 、 x 4 、 x 5 、 x 6 、 x 7 、 x 8 、 x 9 、 x 10 、 x 11 、 x 12 x_{1}、x_{2}、x_{3}、x_{4}、x_{5}、x_{6}、x_{7}、x_{8}、x_{9}、x_{10}、x_{11}、x_{12} x1x2x3x4x5x6x7x8x9x10x11x12
1.设定 ( ϵ , M i n P t s ) \left ( \epsilon ,MinPts \right ) (ϵ,MinPts)为(0.8,2),表示半径最大为0.8,分类中,每个类最少2个样本。
2.遍历样本集合D,首先取出 x 1 x_{1} x1,计算与其他样本的距离,判断小于0.8的样本个数是否不少于2,加入满足条件, x 1 x_{1} x1就是中心点,停止遍历。
3.遍历样本集合D,以 x 1 x_{1} x1为中心,假如与 x 6 、 x 4 、 x 10 、 x 12 x_{6}、x_{4}、x_{10}、x_{12} x6x4x10x12距离小于0.8.则为一类 C 1 C_{1} C1={ x 1 、 x 6 、 x 4 、 x 10 、 x 12 x_{1}、x_{6}、x_{4}、x_{10}、x_{12} x1x6x4x10x12}。
4.将分好类的样本从集合中减去,D= x 2 、 x 3 、 x 5 、 x 7 、 x 8 、 x 9 、 x 11 x_{2}、x_{3}、x_{5}、x_{7}、x_{8}、x_{9}、x_{11} x2x3x5x7x8x9x11。重复第2部,找到新的中心点,重复第3步,这样第二个类就分好了,重复2、3步,直到集合D为0.

DBSCAN程序示例代码


import matplotlib.pyplot as plt
import matplotlib as mpl
import scipy.io
from sklearn.cluster import DBSCAN

def loaddata():
   data = scipy.io.loadmat('cluster_data.mat')
   return data['X']


X = loaddata()
#参数1:就是文中的$\epsilon$
#参数2:就是文中的MinPts
#参数3:亲密度衡量方式,也就是距离计算公式
model = DBSCAN(eps=0.5, min_samples=5, metric='euclidean')
model.fit(X)
print('每个样本所属的簇:',model.labels_)

cm_dark = mpl.colors.ListedColormap(['g','r','b','c'])
plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap=cm_dark, s=20)
plt.show()

补充

核心对象:就是我们选出来的中心,满足的要求上面已经介绍过。
密度直达:核心对象与领域内的每个点都是密度直达,可以理解为,在这个圆内的点和中心都是密度直达,其他的不叫密度直达。
密度可达:在同一个领域内的所有点,两个点可以通过中心相连,这样就是密度可达,所以可以理解为,这个圆内除了中心外的两个点都是密度可达。
密度相连:相比于密度可达,区别在于,点之间是在不同领域,不同领域的点可以通过多个领域的核心对象点将其相连,也就是不同园内的点,可以通过圆心最终相连。这就是密度相连。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值