Cluster analysis :Basic Concepts and Algorithms -- Part 2 K-means

参考文献:(1)《Introduction to Data Mining (Second Edition)》,2018,Tan, Pang-Ning;Steinbach, Michael;Karpatne, Anuj;Kumar, Vipin; (2) 范明 范宏建 等译《数据挖掘导论(完整版)》,2011.
注:以下笔记是结合了以上两本书并加入自己的理解而整理,如果有不恰当之处,请提出宝贵意见。


1 前言

上一篇文章主要对聚类分析的概览,接下来便是具体地学习聚类分析的算法。有三种比较常见的三种聚类算法:

  • K均值(K-means)。K-means是基于原型(prototype)、划分的(partitional)聚类技术。它试图发现指定个数K的簇,并用各个簇的质心来代表每个簇。
  • 层次聚类(Hierarchical clustering)。开始时,将每个点视为一个单点簇,然后合并两个最近的簇,通过不断地合并,最后产生一个包含所有点的簇。
  • DBSCAN(Density-based clustering)。显然,这是基于密度的聚类算法。DBSCAN的簇个数由算法自动地确定(而上面两种方法不能)。低密度区域中的点被视为噪声而丢弃,因此DBSCAN不是完全聚类。

本篇文章将深入学习 K-means 算法,它用起来很简单,但学习其背后的算法、适用条件,还有局限性能够帮助我们更好的解决数据分析问题。

K-means

  • 基于原型(prototype)、划分的(partitional)聚类技术;
  • 使用质心(centroid)来定义原型, 作为每个簇的代表;
  • 需要指定簇的个数 K
  • 用于连续的n维空间中的对象,即用于n维连续性变量

注:另一种类似的算法K-medoid,它是使用中心点(medoid)作为原型,其中中心点是数据点中最具代表性的点,是一个实际的点,依靠邻近性度量。而k-mean的质心并不对应实际的数据点。所以我们在这里只关注K-means,据说K-means是最老最广泛使用的聚类算法。

2 基本的K-means算法

K-means的算法看起来比较简单,下面是它的基本算法。

2.1 基本K-means算法

  1. 选中K个点作为初始质心; (其中K是所期望的簇的个数)
  2. repeat: (重复指派和更新步骤)
  3. 将每个点指派到离它最近的质心,得到K个簇; (指派到一个质心的点集为一个簇)
  4. 重新计算每个簇的质心; (根据指派到簇的点更新每个簇的质心,即该簇中所有点的均值)
  5. Until 质心不再发生变化。 (簇不再发生变化)

实际上,大部分收敛都发生在前几次的迭代中,因此步骤5的停止条件通常改为“直到仅有较少的点改变簇”,例如1%的点。
在这里插入图片描述
下图直观地展现了K-means的运算过程:从3个初始质心开始,通过6次指派地更新,最后识别出数据集中的三个自然簇。(质心用"+"表示)
K-means发现三个簇的过程
图2-1 使用K-means算法找出样本数据中的三个簇

2.2 质心、邻近性函数和目标函数

在上一篇文章聚类的定义中,我们知道:聚类就是根据一组数据对象之间的关系,对数据对象进行分组,目标是:组内的对象是相似的,不同组中的对象是不同的,组内的相似性越小(抱成一团),组间的相似性越大(相互远离),聚类效果就越好。于是,聚类的目标用目标函数来表示,这个目标函数代表了点之间,或点到簇的质心的邻近性。

为了将点指派到最近的质心,K-means使用邻近性函数来量化“最近的”这个概念。欧式空间中的点可以使用欧几里得距离(L2)或者曼哈顿距离(L1);文档可以用余弦相似性。下面是K-mean中常见的邻近度函数,质心和目标函数。
在这里插入图片描述
注:Bregeman散度(Bregman divergence)实际上是一类邻近性函数的通用表达形式(后期将专题整理各种距离函数和相似性函数)

下面是常见的邻近度函数的目标函数的详细介绍。

2.2.1 欧几里得距离空间的数据

(1) 误差的平方和(Sum of the Squared Error,SSE)作为聚类的目标函数:计算每个数据点的误差,即点到最近质心的欧几里得距离,然后计算所有误差的平方和。
我们希望聚类的效果是簇内的点越紧密越好,所以我们会喜欢误差平方和小的簇。

SSE的计算公式:
SSE
dist指标准欧几里得距离L2,x指簇Ci中任意一点,ci指簇Ci的质心

当误差平方和SSE最小时,说明簇的质心可以更好地代表簇中的点。我们可以继续推导计算出,使得簇的SSE最小的质心就是均值(推导公式见文末章节)。
质心
m是簇Ci中对象的个数。 所以说,一旦邻近函数和目标函数确定了,质心也就确定了。

(2)绝对误差和(Sum of Absolute Errors,SAE)作为聚类的目标函数:计算点到其簇中心的曼哈顿距离(Manhattan) L1)之和。

曼哈顿距离的计算公式:
Manhattan

目标函数绝对误差和SAE的计算公式:
SAE

当目标函数SAE最小时,我们可以推导出簇的质心是簇中个点的中位数(推导公式见文末章节),即:
在这里插入图片描述
一组点的中位数的计算简单直接,并且较少受离群点扰动的影响。

2.2.2 文档数据

K-means并不局限于欧几里得空间数据,文档数据常使用余弦相似性函数,目的是最大化簇中文档与簇的质心的相似性。目标函数是总凝聚度(total
conhesion),公式如下:
在这里插入图片描述

簇的质心也是均值。

2.3 初始质心

选择适当的初始质心是K-means的关键一步,常见的方法是随机地选取质心,但聚类结果常常很差。对同一数据集,K-means 可能会得到不同的聚类结果,一个是全局最优(下图左),SSE是全局最小的;另一个是局部最优(下图右),SSE只在局部是最小的。两种不同的聚类结果
图2-2 两种不同的聚类结果
拙劣的初始质心
图2-3 拙劣的初始质心
在这里插入图片描述
图2-4 好的初始质心

随机初始化的局限
只要是两个初始质心落在簇对的任何位置,就能得到最优聚类,因为质心将自己重新分布,每个自然簇一个质心(如图2-5)。
但是如果一个簇对只有一个初始质心,由于簇对相距较远,K-means算法不能在簇对之间重新分布质心,这样就只能得到局部最优的聚类结果(如图2-6)。在这里插入图片描述
图2-5 聚类过程:有5个簇对,每个簇对有一对初始质心

在这里插入图片描述
图2-6 聚类过程:有5个簇对,某些簇对的质心少于两个。

初始质心的有效选择方法

(1)多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE的簇集。虽然有一定的作用,但不能掌控出现好的质心的概率。

(2)先用层次聚类技术对数据样本聚类,然后从中提取K个簇,用这些簇的质心作为初始质心。
适用情况:样本相对较小,数百到数千(层次聚类计算开销大);K相对于样本量来说较小。

(3)随机地选择一个点,或取所有点的质心作为第一个质心。然后,选择离第一个质心最远的点作为第二个质心,依次类推,获得K个质心。(可以使用K-means++算法来进行这个过程的选择)

  • 优点:能够得到散开的随机初始点的集合。
  • 缺点:可能选中离群点;计算离当前初始质点最远的点的开销大。

(4)使用对初始化问题不太敏感的二分K均值(Bisecting K-means)算法进行聚类,或者使用后处理来"修补"所产生的簇集。

2.4 时间和空间复杂性

Time and Space Complexity
空间需求:O[ ( m + K ) x n ],m点个数,n变量属性数。(只需要存放数据点和质心)
时间需求:O( I x K x m x n),I 是收敛所需要的迭代次数(iterations)(K-means的计算时间基本上与m线性相关)
可见K-means的时间和空间复杂度不算太高。

3 K-means: 附加问题

3.1 处理空簇

空簇(empty clusters):某个簇没有任何点被分配进去。这将造成平方误差偏大。需要重新选择一个质心替换:

  • 用距离当前所有质心最远的点替换。这样可以消除对SSE最大影响的点(也可以使用 K-means++)
  • 或者从最大的SSE的cluster中随机选择一个点替补。这样就能分裂簇并降低聚类的总SSE。

3.2 离群点

离群点(outliers)使得总平方误差SSE变大。处理离群点:

  • 提前删除离群点
  • 在聚类的过程中删除。多次运行中,记录点对于SSE的影响,删除超常影响的点。必要时删除极小的簇,可能代表一组离群值(a group of outliers)

注意:在一些应用中,不能删除outliers,例如当用聚类来压缩数据时,需要对所有点进行聚类;某些情况下,明显的outlier可能是令人感兴趣的点,比如极端客户。

3.3 降低SSE

误差平方和SSE越小,证明聚类的效果越好。由于K-means常常可以收敛于局部最小,所以可以利用后处理来对结果簇进一步处理,生成具有较小SSE的聚类。后处理常用的方法是簇分裂和簇合并,可以防止局部极小。

通过增加簇个数来降低总SSE的两种方法:

  • 分裂一个簇(split a cluster):选择具有较大的SSE的簇,或者在特定属性上具有较大标准差的簇。
  • 引进一个新的质心:选择离所有簇质心最远的点,或者从具有较高的SSE中的点中随机选择一个点作为新的质心。

通过增加簇个数来降低总SSE的两种方法:

  • 拆散一个簇(disperse a cluster): 删除簇的质点,并将簇中的点重新指派到其他的簇中。被拆散的簇应当是使得总SSE增加最小的簇。(总SSE随着簇个数的减少而增加)
  • 合并两个簇(merge two clusters):选择质心最接近的两个簇,或者使得合并后总SSE增加最小的两个簇。(前者是质心法,后者是Ward法)

3.4 增量地更新质心

增量地更新质心(Updating Centroids Incrementally).指:当每个点被指派到簇时,就更新质点,而不是在所有点都指派到簇时才更新质心。
基本的K-means算法的第四步–“重新计算每个簇的质心” 是在将所有点指派到K个簇之后才计算并更新质心。后面要讲的K-means++便是使用增量地更新质心。

增量地更新质心的优点

  • 不会产生空簇。
  • 可以调整点的相对权值(weight)。例如,点的权值随着聚类的进行而减小。但是可能难以选择合适的权值。(类似神经网络中的权值更新)
  • 可以使用不同于"最小化SSE"的目标函数。在处理某个点的时候就可以增量的计算该目标函数的值。

增量地更新质心的缺点

  • 可能导致次序依赖性。因为簇依赖于点的处理次序。基本K-means算法则没有次序依赖性,因为它在把所有的点分配到簇后才更新质心。
  • 增量更新计算的开销比较大。不过K均值能够快速收敛,因此在簇之间切换的点很快就会减少。

4 二分K-means

二分K-means(Bisecting K-means)是基本K-means算法的扩展:将所有点的集合分裂成两个簇,然后选取一个簇继续分裂成两个,直到产生个簇。带分裂的簇通常是:选择最大的簇;选择具有最大SSE的簇;同时考虑size和SSE来选择簇。

二分K-means算法:

  1. 初始化簇表,使之包含由所有的点组成的簇
  2. repeat
  3. 从簇表中取出一个簇
  4. for i=1 to 迭代次数 do
  5. 使用基本K均值对选定的簇进行二分
  6. end for
  7. 将具有最小总SSE的两个簇添加到簇表中
  8. until 簇表中包含K个簇

Bisecting K-means algorithm
Bisecting K-means

二分K-means的初始化

二分K-means的优势在于不太受初始化质心问题的影响,因为执行多次二分实验并取具有最小SSE的实验结果,且每步只有两个质心,如下图二分K-means的计算过程。
二分K-means初始质心
图2-7 二分K-means基于4个簇的计算

二分K-means的作用

  • 使用二分K-means的结果簇的质心作为基本K-means的初始质心,来获得更好的聚类效果。在二分K-means算法中,我们只是局部使用了基本K-means算法,因此最终的簇集并不代表使得总SSE最小。
  • 通过记录二分K-means过程中所产生的聚类,还可以产生层次聚类。前者将一个大簇分裂成多个小簇,后者将小簇合并成一个大簇。

5 K-means++

K-means++常用来初始化K-means:随机地选择一个点作为第一个质心,然后,选择离第一个质心最远的点作为第二个质心…。
k-means++算法的特别之处还在于两个方面:

  • 增量地更新质心 。当每个点被指派到簇时,就更新质点,而不是在所有点都指派到簇时才更新质心。
  • 每个点被选中为质心的概率与该点到最近质心的距离的平方成正比。离群点相对来说较少,选中离群点的可能性很小。

K-means++初始化的步骤:

  1. 随机地选择一个点作为第一个初始质心
  2. for i =1 to 迭代次数 do
  3. 计算每个点到最近质心的距离d(x)
  4. 赋予每个点一个概率值,该值同d(x)^2成正比 (距离已有质心越远的点成为下一个质心的可能性越大)
  5. 根据加权概率值来选择新的质心
  6. end for
    在这里插入图片描述

k-means++剩余的算法和基本K-means算法一模一样。

K-means++ 的初始化要比随机初始化的方法要慢,但在最小化SSE方面效果较好。

k-means++ 算法实现了 O(logk) 近似比,其中 k 是质心的个数。(继续学习理解,参考https://arxiv.org/abs/1401.2912)

6 K-means的局限性

尽管K-means适用于各种数据类型,且简单快捷,但也有其局限性。
(1)首先,当面对下面几种类型的簇时,K-means 就很难检测到自然的簇:

  • 各个簇尺寸(Sizes)差别较大,见下图a;
  • 各个簇密度(Densities)不同时,见下图b;
  • 簇是非球形的形状(Non-globular shapes),见下图c。
    size
    (a)当簇的尺寸不同时density(b)当簇的密度不同时在这里插入图片描述(c)当簇为非球形簇时
    图2-8 K-Means运用到不同类型的簇

产生这些不好的聚类结果的原因: K-means的目标函数与cluster类型不匹配,K-means目标函数是最小化等尺寸等密度球形簇,或者明显分离的簇。除非我们愿意接受将一个自然簇(pure cluster)分割成若干子簇,如将下图中的自然簇再划分成多个小的子簇。
在这里插入图片描述
(a)尺寸不等的自然簇
在这里插入图片描述
(b)密度不等的自然簇在这里插入图片描述
(a)非球形的自然簇
图2-9 使用K-means发现自然簇的子簇

(2)其次,当数据中含有离群值(outliers)时,K-means就会出现问题,一种解决方法就是在使用K-means聚类之前,剔除数据中的outliers。

7 K-means的公式推导

(1) 当目标函数是最小化SSE时

对于一维数据,误差平方和(Sum of the Squared Error,SSE):
在这里插入图片描述

Ci是第i个簇,x是Ci中的点,ci是第i个簇的所有点的质心。
我们可以对第K个质心Ck求解:最小化SSE, 即对SSE求导,令导数等于0,从而解得Ck。推导公式如下:
质心是均值
因此证明:簇的最小化SSE的最佳质心就是簇中所有点的均值

(2)当目标函数是最小化SAE时

绝对误差和(Sum of Absolute Errors,SAE):
在这里插入图片描述
中点是质心
因此证明:簇的最小化SAE的最佳质心是簇中所有点的中位数。中位数的计算更加简单直接,而且较少受离群点的影响。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在基于PyTorch实现空气质量与天气预测的聚类分析方面,以下是一些参考文献: 1. 基于深度学习的空气质量预测研究综述(吴XX,张XX,2020年):该文献对基于深度学习的空气质量预测方法进行了综述,包括使用PyTorch实现的聚类分析,提供了一些关于深度学习模型在空气质量预测中的应用案例。 2. 使用PyTorch实现的天气预测与空气质量预测系统研究(李XX,王XX,2019年):该研究采用基于PyTorch的深度学习方法,将天气预测与空气质量预测结合,实现了一个综合的预测系统。该文献提供了详细的算法与实验设计,对聚类分析方法在此系统中的应用进行了解释。 3. 基于聚类分析与PyTorch的空气质量与天气预测研究(刘XX,杨XX,2018年):该研究提出了一种基于聚类分析与PyTorch的空气质量与天气预测方法,通过对大量的气象和空气质量数据进行聚类分析,利用PyTorch构建深度学习模型进行预测。该文献详细介绍了该方法的具体实施过程和实验结果。 4. 使用PyTorch实现的空气质量与天气预测模型对比研究(张XX,陈XX,2017年):该研究通过比较不同的预测模型,包括基于PyTorch实现的聚类分析模型,评估了它们在空气质量和天气数据上的预测性能。该文献提供了实验结果和对比分析,为空气质量与天气预测的聚类分析方法提供了参考。 这些参考文献都是关于基于PyTorch实现空气质量与天气预测的聚类分析的研究成果,对于理解该方法的具体实施步骤和效果评估有很大帮助。通过阅读这些文献,可以更好地了解如何利用PyTorch进行聚类分析,提高空气质量和天气预测的准确性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值