【聚类】详解常用的聚类算法(K-Means、DBSCAN等)

  • 本文收录于《深入浅出讲解自然语言处理》专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅!
  • ​个人主页:有梦想的程序星空
  • ​个人介绍:小编是人工智能领域硕士,全栈工程师,深耕Flask后端开发、数据挖掘、NLP、Android开发、自动化等领域,有较丰富的软件系统、人工智能算法服务的研究和开发经验。
  • ​如果文章对你有帮助,欢迎关注点赞收藏订阅。

1、聚类的背景概念

聚类是将物理或抽象对象的集合分成由类似的对象组成的多个类的过程。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。聚类是一种运用广泛的探索性数据分析技术,人们对数据产生的第一直觉往往是通过对数据进行有意义的分组,通过对对象进行分组,使相似的对象归为一类,不相似的对象归为不同类。

无监督学习中,目标通过对无标记数据训练样本的学习来揭示数据内在的性质规律,将数据集中的样本划分为多个不相交的子集,为数据进一步分析提供基础。

聚类的评判标准簇间相似度高,簇内相似度低的时候效果最好。

2、K-Means聚类算法

聚类原则:以空间中k个点为中心进行聚类,对最靠近中心的对象归类。逐次计算各簇中心的值为新的中心值,迭代更新,直至得到最好的聚类结果。

目标函数:各簇成员到其聚类中心的距离的平方和最小,如下所示:

\mathop {\arg \min }\limits_c J(c) \Rightarrow \mathop {\arg \min }\limits_c \sum\limits_{i = 1}^k {||x - {c_i}||_2^2}

其中,c为聚类中心集合,共有k个聚类中心。

算法流程

(1)适当选择k个类的初始中心;

(2)在第n次迭代中,对任意一个样本,求其到k个中心的距离,将该样本归到距离最短的中心所在的类/簇;

(3)利用均值等方法更新该类的中心值;

(4)对于所有的k个聚类中心,如果利用(2)(3)的迭代法更新后,聚类中心的位置保持不变,则迭代结束;否则,继续迭代。

KMeans算法的适用场景:它比较适合服从高斯分布的样本数据集的划分。

优点:(1)原理比较简单,实现也是很容易,收敛速度快。(2)算法的可解释度比较强。(3)主要需要调参的参数仅仅是簇数。

缺点:(1)需要事先确定分类的簇数,即k值。(2)采用迭代方法,得到的结果只是局部最优。(3)对初始值的选取比较敏感。当数据量非常大时,算法的时间开销是非常大的(改进:Mini Batch K-Means精确度会降低,在可接受的范围即可))。(4)若簇中含有异常点,将导致均值偏离严重,对噪声和孤立点数据敏感(改进1:离群点检测的LOF算法,通过去除离群点后再聚类,可以减少离群点和孤立点对于聚类效果的影响;改进2:改成求点的中位数,这种聚类方式即K-Mediods聚类(K中值))。(5)对于不是凸的数据集比较难收敛(改进:基于密度的聚类算法更加适合,比如DBSCAN算法)。

 问题1:kmeans算法结果易受初始点影响,该怎么办?

由于kmeans算法结果易受初始点影响,得到的结果是局部最优,为次,我们可以运行n次K-Means算法,每次运行的初始点均为随机生成。然后在n次运行结果中,选取目标函数(代价函数)最小的聚类结果。

问题2:聚类数量k如何确定?

通常在数据集有多少个聚类是不清楚的。对于低维的数据,对其可视化,我们可以通过肉眼观察到有多少个聚类,但这样并不准确,而且大部分数据也无法可视化显示。我们可以通过构建一个代价函数与聚类数量k的关系图,横坐标是聚类数量,每个聚类数量对应的代价函数J均是n次运行的最优结果。

sklearn代码

sklearn.cluster.KMeans(n_clusters=8)

其中,n_clusters为开始的聚类中心数量,整型,缺省值为8,生成的聚类数,即产生的质心(centroids)数。

方法:

estimator.fit(x)

estimator.predict(x)

estimator.fit_predict(x):计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)。

3、Mini Batch K-Means算法

Mini Batch K-Means算法是K-Means算法的一种优化变种,采用小规模的数据子集(每次训练使用的数据集是在训练算法的时候随机抽取的数据子集)减少计算时间,同时试图优化目标函数;Mini Batch K-Means算法可以减少K-Means算法的收敛时间,而且产生的结果效果只是略差于标准K-Means算法。

算法步骤如下:

    • 首先抽取部分数据集,使用K-Means算法构建出K个聚簇点的模型;

    • 继续抽取训练数据集中的部分数据集样本数据,并将其添加到模型中,分配给距离最近的聚簇中心点;

    • 更新聚簇的中心点值(每次更新都只用抽取出来的部分数据集)  ;

    • 循环迭代第二步和第三步操作,直到中心点稳定或者达到迭代次数,停止计算操作   ------- 这个算法思想类似于SGD算法;

       每次都是使用与上一次不同的抽样数据进行更新簇中心点,可以重复更新循环多次

Mini Batch K-Means减少K-Means算法的收敛时间,而且产生的结果效果只是略差于标准K-Means算法。适用场景:大量数据聚类,效果比K-Means差一些。

4、学习向量化(LVQ)

 LVQ带有类标记,采用迭代优化。样本集D,学习效率m,初始化原型向量p并设置其标记。

假设数据样本带有类别标记,利用这些监督信息来辅助聚类。

5、DBSCAN算法

DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数(\varepsilon ,MinPts)用来描述邻域的样本分布紧密程度。其中,\varepsilon描述了某一样本的邻域距离阈值,MinPts描述了某一样本的距离为\varepsilon的邻域中样本个数的阈值。

DBSCAN的聚类定义很简单:由密度可达关系导出的最大密度相连的样本集合,即为最终聚类的一个类别,或者说一个簇。

这个DBSCAN的簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里其他的非核心对象样本都在这个核心对象的\varepsilon-邻域里;如果有多个核心对象,则簇里的任意一个核心对象的\varepsilon-邻域中一定有一个其他的核心对象,否则这两个核心对象无法密度可达。这些核心对象的\varepsilon-邻域里所有的样本的集合组成的一个DBSCAN聚类簇。

 DBSCAN算法是确定性的,当以相同的顺序给出相同的数据时,总是生成相同的簇。但是,当以不同顺序提供数据时,结果可能不同。

优点:

可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。
可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。

缺点:

如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

sklearn代码

class sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, metric='euclidean', algorithm='auto', 
    leaf_size=30, p=None, n_jobs=1)

6、谱聚类

谱聚类是从图论中演化出来的算法,后来在聚类中得到了广泛的应用。它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高。通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。

对象形式:
class sklearn.cluster.SpectralClustering(n_clusters=8, eigen_solver=None, 
    random_state=None, n_init=10, gamma=1.0, affinity='rbf', n_neighbors=10, eigen_tol=0.0, 
    assign_labels='kmeans', degree=3, coef0=1, kernel_params=None, n_jobs=1)
 
函数形式:
sklearn.cluster.spectral_clustering(affinity, n_clusters=8, n_components=None, eigen_solver=None, 
    random_state=None, n_init=10, eigen_tol=0.0, assign_labels='kmeans')

关注微信公众号【有梦想的程序星空】,了解软件系统和人工智能算法领域的前沿知识,让我们一起学习、一起进步吧!

  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: k-meansdbscan都是常用聚类算法k-means算法是一种基于距离的聚类算法,它将数据集划分为k个簇,每个簇的中心点是该簇中所有点的平均值。该算法的优点是简单易懂,计算速度快,但需要预先指定簇的数量k,且对初始中心点的选择敏感。 dbscan算法是一种基于密度的聚类算法,它将数据集中的点分为核心点、边界点和噪声点三类。核心点是指在半径为ε内至少有MinPts个点的点,边界点是指在半径为ε内不足MinPts个点但与核心点相邻的点,噪声点是指既不是核心点也不是边界点的点。该算法的优点是不需要预先指定簇的数量,能够发现任意形状的簇,但对于不同密度的簇效果可能不同,且需要设置合适的参数ε和MinPts。 ### 回答2: K-meansDBSCAN都是常用聚类算法K-means算法是一种基于中心点的聚类算法,其目标是将数据点划分到不同的簇中,使得同一簇内的数据点彼此相似度高,不同簇间的数据点相似度低。算法工作流程如下: 1. 随机选择K个初始中心点; 2. 将各个数据点分配给最近的中心点,形成K个簇; 3. 对于每个簇,计算其中所有数据点的平均值,将该平均值作为新的中心点; 4. 重复步骤2和步骤3,直到簇的中心点不再发生变化或达到预设迭代次数。 K-means算法的优点是简单易懂、计算时间短,对于大规模数据也有不错的效果。但是其缺点也比较明显,如需要指定簇的数量,且对于空间形状不规则的数据或噪声数据处理效果较差。 DBSCAN算法是一种基于密度的聚类算法,其核心思想是将密度相连的数据点划分为一个簇中,将稀疏区域中的数据点划分为噪声数据。算法工作流程如下: 1. 选择一个数据点,检查其邻域内是否有足够多的数据点,如果有足够多的数据点,则将该数据点作为核心点; 2. 核心点的邻域内所有的点组成一个簇,将所有邻域内密度不足的点视为噪声数据,未被分配簇的点到簇中; 3. 扫描所有未被访问的点,如果该点被一个簇访问,则将其加入该簇中。 DBSCAN算法的优点是可以发现任意形状的簇,不需要指定簇的数量,而且可以有效处理噪声数据。但是其缺点也比较明显,如容易受到密度相差悬殊的数据分布影响,计算时间随着数据规模的增大而呈指数增长。 综上,两种算法各有优缺点,需要根据应用场景选择合适的算法。 ### 回答3: K-meansDBSCAN是常用聚类算法,它们可以用于将数据集中的数据对象分组成不同的簇。虽然K-meansDBSCAN都是聚类算法,但它们之间有很多的区别。 K-means是一种迭代算法,其原理是将所有数据对象划分为K个簇,在每次迭代中,计算每个簇的中心点,并将与中心点最近的数据对象划分到该簇中。然后重新计算每个簇的中心点,并再次将数据对象划分到最近的簇中,直到收敛为止。K-means算法简单且易于理解,但需要人工对簇的数量做出选择。 DBSCAN是一种基于密度的聚类算法,它的核心思想是,一个簇是由相互密集连接的数据对象组成的,而簇与簇之间的密度差别较大。DBSCAN算法的过程是首先选取一个未被访问的数据对象,然后找出该对象的密度可达的所有数据对象,将它们归为一个簇,并递归地找出这些簇的邻居,直到所有的数据对象都被归为一个簇或者标记为噪声点。DBSCAN算法不需要人工指定簇的数量,因此比K-means更加灵活和自适应。 总之,K-meansDBSCAN算法聚类过程中采用了不同的原理和策略,各有其适用的场景。K-means适用于数据分布比较规则和簇的数量明确的情况下,而DBSCAN适用于数据分布不规则、簇的数量不确定或者簇的密度变化不同的情况下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序遇上智能星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值