K-Means算法及多种优化改进算法,聚类模型评估、面试总结

一、聚类分析

聚类分析是根据在数据中发现的描述对象(数据)及其关系的信息,将数据划分成有意义或有用的组(簇)。其目标是:
组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不相关的);
组内的相似性(同质性)越大,组间差别越大,聚类就越好。

二、不同的聚类类型

1层次的(嵌套的)与划分的(非嵌套的)
划分聚类:简单地将数据对象集划分成不重叠的子集(簇),是的每个数据对象恰在一个子集中
层次聚类:允许簇具有子簇;层次聚类是嵌套簇的集合,组成一棵树
2互斥的、重叠的与模糊的
互斥的:每个对象都指派到单个簇
重叠的:一个对象同时属于多个簇
模糊的:每个对象以一个0(绝对不属于)和1(绝对属于)之间的值作为属于某个簇的权重(概率)
3完全的与部分的
完全的:将每个对象指派到一个簇中
部分的:数据集中有些对象可能是噪声、离群点或“特定聚类任务不感兴趣的点”,这些对象可能不属于明确定义的簇。

三、不同的簇类型

在这里插入图片描述
1明显分离的
簇是对象的集合,其中每个对象到同簇中的每个对象的距离比到不同簇中任意对象的距离都近(或更相似);
如图(1),不同组中的任意两点之间的距离都大于组内任意两点之间的距离
明显分离的簇可以是任意形状的。
2基于原型的
簇是对象的集合,其中每个对象到定义该 簇的原型的距离比到其他簇的原型的距离更近(或更相似);
对于许多数据类型,原型可以视为最靠近中心的点,也称为“基于中心的簇”,如图(2);
这种簇趋向于呈球形状。
簇的原型:
指的是质心,即簇中所有点的平均值;
当数据具有分类属性时,质心没有意义,簇的原型就是中心点,即簇中最有代表性的点。

3基于图的
如果数据用图来表示,其中结点为对象,而边代表对象之间的联系,则簇可以定义为连通分支,即互相连通但不与组外对象连通的对象组;
基于图的簇的一个重要例子是 基于邻近的簇 ,当两个对象的距离在指定的范围之内,这两个对象就是相连的;也就是说,每个对象到该簇某个对象的距离比到不同簇中任意点的距离更近;
如图(3),两个球形之间有数据连接,基于邻近的簇,就将其看作是同一个簇
这种簇,当数据具有噪声时可能出现问题,比如,图中连接两个球形簇的数据点是噪声点,此时就会由于噪声出现问题。

4 基于密度的
簇是对象的稠密区域,被低密度区域环绕;
如图(4),数字10,上的数据明显比其他地方稠密,低密度的区域被视为噪声点
这种簇可能会因为数据密度的不同出现问题。

5共同性质的(概念簇)
如图(5),由两个环组成,聚类算法需要通过非常具体的簇概念来成功检测这些簇,发现这样的簇的过程就称为概念簇。
过于复杂的簇概念将会设计模式识别领域

四、K-means 算法

K均值是基于原型的、划分的聚类技术,它试图发现用户指定个数 K KK 的簇;K均值 用质心定义原型,其中质心是一组点的均值。K均值 是一种使用广泛的最基础的聚类算法,作为学习聚类算法的开始非常适合。
1、 K均值 算法的一般步骤
选择 K KK 个初始质心,其中 K KK 是用户指定的参数,即所期望的簇的个数;
每个点指派到最近的质心,而指派到一个质心的点集为一个簇;
然后,根据指派到簇的点,重新计算每个簇的质心
重复指派和更新操作,直到簇不发生变化,或等价地,直到质心不在发生变化
在这里插入图片描述
图中红色的 “*” 表示质心,属于同一簇的对象具有同样的颜色;
第1步,初始化质心,将点指派到初始最近的质心,这些质心都在点的较大组群中
第2步,把点指派到最近的质心后,更新质心(质心向左右下的点群),再次将点指派到更新后的质心
第3步,更新质心,将点指派到更新后的最近的质心
第4步,更新质心,再次指派点到最近的质心,此后不再发生变化,算法停止
由于图是手动画的,所以每步的图有些差别,不过不影响理解
下面是 K均值 算法涉及的几个问题:
选择初始质心
当质心随机初始化时,K均值 的不同运行将产生不同的总 SSE SSESSE,选择适当的初始化质心是基本 K KK 均值过程的关键步骤,常见的方法是随机地选择初始化质心,但是簇的质量常常很差。
在这里插入图片描述
不好的初始质心带来的效果:
尽管所有的初始质心都在自然簇中,结果也找到了最小 SSE SSESSE 聚类;
但是仅得到了一个次最优聚类,具有较高的平方误差。
在这里插入图片描述
以上数据由两个簇组成,其中簇对(上下)中的簇更靠近,而离另一对中的簇较远
随机初始化的局限:
处理选取初始质心问题的一种常用技术就是:多次运行,每次使用一组不同的随机初始质心,然后选取具有最小 SSE SSESSE 的簇集;
该策略虽然简单,但是效果可能不好,这取决于数据集和寻找的簇的个数;
如果我们对每个簇对用两个初始质心,则即使两个质心在同一个簇中,质心也会自己重新分布,从而找到“真正的”簇;
如果一个簇只用一个初始质心,而另一个使用三个质心,则两个真正的簇将合并,而一个真正的簇将分裂
指派点到最近的质心
为了将点指派到最近的质心,我们需要 邻近性度量 来量化所考虑的数据的“最近”的概念,通常,对于欧氏空间中的点使用欧几里得距离,对于文档数据使用余弦相似性。
质心和目标函数
由于质心可能随数据邻近性度量和聚类目标不同而改变,因此在指派点到最近的质心后需要重新计算每个簇的质心。
在这里插入图片描述
聚类的目标通常用一个目标函数表示,该函数依赖于点之间,或点到簇的质心的邻近性;例如:最小化每个点到最近质心的距离的平方。
在这里插入图片描述
K均值 质心的数学推导:
在这里插入图片描述
2、 K-means 算法思考

根据以上三个问题的讨论可知,随机选择初始质心存在的问题即使重复运行多次也不能克服,因此常常使用其他技术进行初始化:
一种有效的方法是取一个样本,并使用层次聚类技术对它聚类,从层次聚类中提取 K KK 个簇,并用这些簇的质心作为初始质心;
另一种选择初始化质心的方法是随机地选择第一个点,或取所有点的质心作为第一个点,然后对于每个后继初始质心,选择离已经选取过的初始质心最远的点(使用这种方法既可以确保质心是随机的,而且是散开的)。但是这种方法可能选中离群点,并且求离当前初始质心集最远的点开销也非常大。
此外,还可以使用对初始化问题不太敏感的 K均值 的变种:二分 K 均值
3、 K-means 总结
(1)K-means算法在迭代的过程中使用所有点的均值作为新的质点(中心点),如果簇中存在异常点,将导致均值偏差比较严重

例如一个簇中有{2,4,6,8,100} {2,4,6,8,100}{2,4,6,8,100}五个数据,那么新的质心为24,显然这个质心离绝大多数点都比较远,在当前情况下,使用中位数6可能比使用均值的想法更好,使用中位数的聚类方法叫做K-Mediods聚类(K中值聚类)
(2) K-means 算法是初始质心敏感的,选择不同的初始质心可能导致不同的簇划分规则

为了避免这种敏感性导致的最终结果异常性,可以采用初始化多套初始质心构造不同的分类规则,然后选择最优的构造规则
(3) K-means算法缺点:

K值是用户给定的,在进行数据处理前,K值是未知的,不同的K值得到的结果也不一样;
对初始簇质心是敏感的
不适合发现非凸形状的簇或者大小差别较大的簇
特殊值(离群值)对模型的影响比较大
(4)K-means算法优点:

理解容易,聚类效果不错
处理大数据集的时候,该算法可以保证较好的伸缩性和高效率
当簇近似高斯分布的时候,效果非常不错
sklearn 库中自带的 KMeans 模型对模拟产生的数据进行聚类,API如下:

sklearn.cluster.KMeans(n_clusters=8, init=’k-means++, n_init=10, max_iter=300, 
	tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, 
	copy_x=True, n_jobs=None, algorithm=’auto’)

在这里插入图片描述
本案例实现不同数据分布对 KMeans 聚类的影响,主要有旋转后的数据、簇具有不同方差的数据、簇具有不同数目的数据
在这里插入图片描述
可见 K-means 对明显分离的球状数据的效果很好;
对有重叠的数据在重叠处效果不是很好;
对于较少的数据,对聚类会产生不好影响,相当于噪声对聚类的影响

五、二分 K均值

为了解决 K-Means 算法对 初始簇心比较敏感 的问题,二分K-Means 算法是一种弱化初始质心的一种算法,二分 K均值 不太受初始化问题的影响。
1、 二分K-Means的具体思路步骤如下:
将所有样本数据作为一个簇放到一个队列中
从队列中选择一个簇进行 K-means 算法划分,划分为两个子簇,并将子簇添加到队列中
循环迭代第二步操作,直到中止条件达到(聚簇数量、最小平方误差、迭代次数等)
队列中的簇就是最终的分类簇集合
2、从队列中选择划分聚簇的规则一般有两种方式:
对所有簇计算误差和 SSE ( SSE 也可以认为是距离函数的一种变种),选择 SSE 最大的聚簇 进行划分操作(优选这种策略)
选择 样本数据量最多的簇 进行划分操作
在这里插入图片描述
迭代1找到两个簇对;
迭代2分裂了最右边的簇对;
迭代3分裂了最左边的簇对
执行多次二分试验,并选取具有最小 SSE 的试验结果,且每步只有两个质心
3、不同的簇类型带来的影响
对于发现不同的簇类型,二分K-Means 和 K均值 都具有一些局限性。当簇具有非球形形状或具有不同尺寸或密度时,二分K-Means 很难检测到“自然的”簇。我们还是通过图来理解:
在这里插入图片描述
上图,K均值 不能发现那三个自然簇,因为其中一个簇比其他两个大得多,因此较大的簇被分开,而一个较小的簇与较大的簇的一部分合并到一起;
中图,两个较小的簇比较大的簇稠密的多;
下图,两个自然簇不是球形形状
这三种情况的问题在于 K均值 的目标函数与我们试图发现的簇的类型不匹配,因为 K均值 目标函数是最小化等尺寸和等密度的球形簇,或者明显分离的簇。
二分K-均值算法的伪代码:

将所有点看成一个簇
当簇数目小于k时
	对于每一个簇
		计算总误差
		在给定的簇上面进行K-均值聚类(k=2)
		计算将该簇一分为二之后的总误差
	选择使得误差最小的那个簇进行划分操作

六、K-Means++ 、 K-Means|| 算法

为了解决 K-Means 算法对初始簇心比较敏感的问题,K-Means++ 算法和 K-Means 算法的区别主要在于初始的K个中心点的选择方面,K-Means 算法使用随机给定的方式,K-Means++算法采用下列步骤给定K个初始质点:
在这里插入图片描述

七、Canopy 算法

在这里插入图片描述
Canopy 算法过程图形说明:
在这里插入图片描述
在这里插入图片描述
Canopy 算法得到的最终结果的值,聚簇之间是可能存在重叠的,但是不会存在某个对象不属于任何聚簇的情况
由于 K-Means 算法存在初始聚簇中心点敏感的问题,常用使用 Canopy + KMeans 算法混合形式进行模型构建:

先使用 canopy 算法进行“粗”聚类得到 K KK 个聚类中心点
K-Means 算法使用 Canopy 算法得到的 K KK 个聚类中心点作为初始中心点,进行“细”聚类

八、Mini Batch K-Means 算法

Mini Batch K-Means 算法是 K-Means 算法的一种优化变种,采用 小规模的数据子集 (每次训练使用的数据集是在训练算法的时候随机抽取的数据子集) 减少计算时间,同时试图优化目标函数;Mini Batch K-Means 算法可以减少 K-Means 算法的收敛时间,而且产生的结果效果只是略差于标准K-Means 算法。
算法步骤如下:
首先抽取部分数据集,使用 K-Means 算法构建出 K KK 个聚簇点的模型;
继续抽取训练数据集中的部分数据集样本数据,并将其添加到模型中,分配给距离最近的聚簇中心点更新聚簇的中心点值;
循环迭代第二步和第三步操作,直到中心点稳定或者达到迭代次数,停止计算操作。
案例:K-Means 和 Mini Batch K-Means 算法比较
本案例基于scikit 包中的创建模拟数据的 API 创建聚类数据,使用 K-means 算法和 Mini Batch K-Means 算法对数据进行分类操作,比较这两种算法的聚类效果以及聚类的消耗时间长度。

sklearn.cluster.MiniBatchKMeans(n_clusters = 8, init ='k-means ++', max_iter = 100,
	batch_size = 100, verbose = 0, compute_labels = True, random_state = None,
	tol = 0.0, max_no_improvement = 10, init_size = None,
	n_init = 3, reassignment_ratio = 0.01)

在这里插入图片描述
在这里插入图片描述
上图可见,Mini Batch K-Means 算法比 K-Means 算法训练的时间大大减少,并且效果也差不多,只有少数数据点不同。

九、聚类模型评估

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十、总结

K-means 简单并且可以用于各种数据类型,它也相当有效,尽管常常多次运行;
K-means 的某些变种(包括二分K均值)甚至更有效,并且不太受初始化问题的影响;
K-means 并不适合所有的数据类型,它不能处理非球形,不同尺寸和不同密度的簇
K-means 对包含离群点的数据进行聚类,也存在问题;

十一:面试总结

1、简述一下K-means算法的原理和工作流程
上面
2、K-means中常用的到中心距离的度量有哪些?
曼哈顿距离和欧几里得距离
3、K-means中的k值如何选取?
上文
4、K-means算法中初始点的选择对最终结果有影响吗?
不同的初始值结果可能不一样
5、K-means聚类中每个类别中心的初始点如何选择?
(1)这k个点的距离尽可能远
(2)可以对数据先进行层次聚类,得到K个簇之后,从每个类簇中选择一个点,该点可以是该类簇的中心点,或者是距离类簇中心点最近的那个点。
6、K-means中空聚类的处理
(1)选择一个距离当前任何质心最远的点。这将消除当前对总平方误差影响最大的点。
(2)从具有最大SSE的簇中选择一个替补的质心,这将分裂簇并降低聚类的总SSE。如果有多个空簇,则该过程重复多次。
(3)如果噪点或者孤立点过多,考虑更换算法,如密度聚类
7、K-means是否会一直陷入选择质心的循环停不下来?
(1)迭代次数设置
(2)设定收敛判断距离
8、如何快速收敛数据量超大的K-means?
相关解释可以去这个博客稍做了解https://blog.csdn.net/sunnyxidian/article/details/89630815
9、K-means算法的优点和缺点是什么?
K-Means的主要优点:
(1)原理简单,容易实现
(2)可解释度较强

K-Means的主要缺点:
(1)K值很难确定
(2)局部最优
(3)对噪音和异常点敏感
(4)需样本存在均值(限定数据种类)
(5)聚类效果依赖于聚类中心的初始化
(6)对于非凸数据集或类别规模差异太大的数据效果不好

————————————————
版权声明:本文为CSDN博主「Daycym」的原创文章
原文链接:https://blog.csdn.net/Daycym/article/details/84774164

  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值