聚类算法总结 - 优缺点对比

前言

聚类算法是一种无监督的算法,由于不需要训练集,算法简单快速,引用在一些工程里比较简单突出,今天来了解一下聚类算法。

k-means算法(k均值算法)

算法步骤:

  • (1)随机选取 K 个点,作为 K 类的聚类中心,用 K i K_i Ki表示

  • (2)遍历所有的数据点 P j P_j Pj,通过计算距离,找到距离 P j P_j Pj 最近的聚类中心点 K i K_i Ki,此时可以说第 j 个数据属于第 i 类

  • (3)分别计算第 i 类的所有数据的中心点,作为该类的新的聚类中心点。

  • (4)重复进行(2)(3)步骤。直到每一类的聚类中心不再发生变化

从算法中我们需要确定以下几个标准:

  • k值的确定,我们必须确定我们算法中需要分几类
  • 计算距离公式,这个公式我们可以利用欧式距离来计算,
  • 聚类中心的计算:因为要不断更新聚类中心点,需要一个更新策略来更新
优点
  • k-平均算法是解决聚类问题的一种经典算法,算法简单、快速。
  • 对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是 O ( n k t ) O(nkt) O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k<<n。这个算法经常以局部最优结束。
  • 算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,而簇与簇之间区别明显时,它的聚类效果很好。
缺点
  • 对 K 值敏感。也就是说,K 的选择会较大程度上影响分类效果。在聚类之前,我们需要预先设定 K 的大小,但是我们很难确定分成几类是最佳的,比如上面的数据集中,显然分为 2 类,即K = 2 最好,但是当数据量很大时,我们预先无法判断。

  • 对离群点和噪声点敏感。如果在上述数据集中添加一个噪音点,这个噪音点独立成一个类。很显然,如果 K = 2,其余点是一类,噪音点自成一类,原本可以区分出来的点被噪音点影响,成为了一类了。如果 K = 3,噪音点也是自成一类,剩下的数据分成两类。这说明噪音点会极大的影响其他点的分类。

  • 初始聚类中心的选择。K-means 是随机选择 K 个点作为初始的聚类中心。但是,我们可以对这个随机性进行一点约束,使迭代速度更快。举个例子,如果上面的数据集我随机选择了(0,0)和(1,0)两个点,或者选择了(1.5,1.5)和(9,9)两个点,即可以加快迭代速度,也可以避免陷入局部最优。

  • 只能聚凸的数据集。所谓的凸数据集,是指集合内的每一对点,连接两个点的直线段上的每个点也在该集合内。通俗讲就是K-means 聚类的形状一般只能是球状的,不能推广到任意的形状,但是有研究表明,若采用 Bregman 距离,则可显著增强此类算法对更多类型簇结构的适用性

改进
  • 针对K值的选择问题,主要是 K 的值必须认为预先设定,并且在整个算法执行过程中无法更改。此时,可以利用 ISODATA 算法:当属于某个类别的样本数过少,就将这个类别剔除;当属于这个类别的样本过多、分散程度很大的时候,就将这个类别分为两个子类,此时 K 也就会 + 1了,一些说明:虽然有很多启发式用于自动确定 k 的值,但是实际应用中,最常用的仍然是基于不同的 K 值,多次运行取平均值(周志华 《机器学习》书 P218)

  • 针对离群点和噪声点,我们可以使用一些算法,比如 RANSAC 、LOF 等剔除离群点。此外,基于 K-means 的改进算法有 k-medoids 和 k-medians

  • 对于初始聚类中心点的问题,K-means ++ 不再随机选择 K 个聚类中心:假设已经选取了 m 个聚类中心( 0 < m < K),m = 1时,随机选择一个聚类中心点;在选取第 m+1 个点的时候,距离当前 m 个聚类中心点的中心越远的点,越会以更高的概率被选为第 m+1 个聚类中心。这种方法在一定程度上可以让“随机”选择的聚类中心点的分布更均匀。此外还有 canopy 算法等。

  • K-means 是使用欧式距离来测量,显然,这种度量方式并不适合于所有的数据集。换句话说,K-means 比较适合聚那些球状的簇。参照 SVM 中核函数的思想,将样本映射到另外一个特征空间,就可以改善聚类效果。代表算法是;kernel K-means

DBSCAN算法:基于密度的聚类算法

算法流程:

  • 以每一个数据点 x i x_i xi为圆心,以 eps值 为半径画一个圆圈。这个圆圈被称为 x i x_i xi eps 邻域

  • 对这个圆圈内包含的点进行计数。
    (1) 如果一个圆圈里面的点的数目超过了密度阈值 MinPts,那么将该圆圈的圆心记为核心点,又称核心对象。
    (2) 如果某个点的 eps 邻域内点的个数小于密度阈值但是落在核心点的邻域内,则称该点为边界点
    (3) 既不是核心点也不是边界点的点,就是噪声点

  • 核心点 x i x_i xi的 eps 邻域内的所有的核心点连在一起,这样不断的将区域内的核心点连在一起,核心点的区域内又有核心点相当于从 x 1 x_1 x1 - > x 2 x_2 x2 - > . . . - > x n x_n xn,类似于密度传导一样,那么, x n x_n xn x 1 x_1 x1 密度可达。这个性质说明了由密度直达的传递性,可以推导出密度可达。

  • 如果对于 x k x_k xk,使 x i x_i xi x j x_j xj都可以由 x k x_k xk密度可达,那么,就称 x x i x_i xi x j x_j xj 密度相连。将密度相连的点连接在一起,就形成了我们的聚类簇。

通过上述算法我们可以看到算法需要两个参数:

  • eps值,半径值,用来做区域
  • MinPts值,用来判断哪些点是核心点

西瓜书上的算法图:

[外链图片转存失败(img-XUnqJLD8-1566869759407)(https://raw.githubusercontent.com/Klauszhao/picture/master/picture/cluster/DBSCAN%E8%81%9A%E7%B1%BB%E7%AE%97%E6%B3%95.png)]

英文算法:
[外链图片转存失败(img-rOHqxEAp-1566869523673)(https://raw.githubusercontent.com/Klauszhao/picture/master/picture/cluster/DBSCAN%E8%8B%B1%E6%96%87%E7%89%88.jpg)]

优点
  • 自适应的聚类,不需要提前设定K值大小,可以自适应的做聚类结果。

  • 对噪声不敏感。这是因为该算法能够较好地判断离群点,并且即使错判离群点,对最终的聚类结果也没什么影响

  • 能发现任意形状的簇。这是因为DBSCAN 是靠不断连接邻域呢高密度点来发现簇的,只需要定义邻域大小和密度阈值,因此可以发现不同形状,不同大小的簇

  • 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响

缺点
  • 对两个参数的设置敏感,即圈的半径 eps 、阈值 MinPts

  • DBSCAN 使用固定的参数识别聚类。显然,当聚类的稀疏程度不同,聚类效果也有很大不同。即数据密度不均匀时,很难使用该算法

  • 如果数据样本集越大,收敛时间越长。此时可以使用 KD 树优化

 
from sklearn.datasets.samples_generator import make_circles
import matplotlib.pyplot as plt
 
import time
from sklearn.cluster import KMeans
 
from sklearn.cluster import DBSCAN
 
X,y_true = make_circles(n_samples=1000,noise=0.15) #这是一个圆环形状的
 
plt.scatter(X[:,0],X[:,1],c=y_true)
plt.show()
 
 
#DBSCAN 算法
t0 = time.time()
dbscan = DBSCAN(eps=.1,min_samples=6).fit(X)  # 该算法对应的两个参数
t = time.time()-t0
plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_)
plt.title('time : %f'%t)
plt.show()

凝聚式层次聚类

层次聚类可以分为凝聚(agglomerative)层次聚类和分裂(divsive)层次聚类。分裂层次聚类采用的就是"自顶而下"的思想,先将所有的样本都看作是同一个簇,然后通过迭代将簇划分为更小的簇,直到每个簇中只有一个样本为止。凝聚层次聚类采用的是"自底向上"的思想,先将每一个样本都看成是一个不同的簇,通过重复将最近的一对簇进行合并,直到最后所有的样本都属于同一个簇为止。

算法步骤:

  • 我们首先将每个数据点视为一个单一的簇,即如果我们的数据集中有 X 个数据点,那么我们就有 X 个簇。然后,我们选择一个测量两个簇之间距离的距离度量标准。作为例子,我们将用 average linkage,它将两个簇之间的距离定义为第一个簇中的数据点与第二个簇中的数据点之间的平均距离。
  • 在每次迭代中,我们将两个簇合并成一个。这两个要合并的簇应具有最小的 average linkage。即根据我们选择的距离度量标准,这两个簇之间的距离最小,因此是最相似的,应该合并在一起。
  • 重复步骤 2 直到我们到达树根,即我们只有一个包含所有数据点的簇。这样我们只需要选择何时停止合并簇,即何时停止构建树,来选择最终需要多少个簇!

从算法中我们可以知道,我们需要提供一下:

  • 距离计算公式,计算两个类之间的距离

在凝聚层次聚类中,判定簇间距离的两个标准方法就是单连接(single linkage)和全连接(complete linkage)。单连接,是计算每一对簇中最相似两个样本的距离,并合并距离最近的两个样本所属簇。全连接,通过比较找到分布于两个簇中最不相似的样本(距离最远),从而来完成簇的合并。

凝聚层次聚类除了通过单连接和全连接来判断两个簇之间的距离之外,还可以通过平均连接(average linkage)和ward连接。使用平均连接时,合并两个簇所有成员间平均距离最小的两个簇。使用ward连接,合并的是使得SSE增量最小的两个簇。

优点
  • 1、距离和规则的相似度容易定义,限制少
  • 2、不需要预先制定聚类数
  • 3、可以发现类的层次关系
缺点
  • 1,计算复杂度太高;
  • 2,奇异值也能产生很大影响;
  • 3,算法很可能聚类成链状

参考博客

聚类算法(一)—— k-means算法以及其改进算法
聚类算法(三)——基于密度的聚类算法(以 DBSCAN 为例)
聚类算法(二)、聚类算法的系统性比较

  • 19
    点赞
  • 182
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值