sklearn专题六:聚类算法K-Means

本文详细介绍了sklearn中的K-Means聚类算法,从无监督学习与聚类算法的基本概念出发,讲解了KMeans的工作原理、簇内误差平方和、时间复杂度,并重点讨论了参数n_clusters的选择及其模型评估指标,包括轮廓系数和Calinski-Harabaz Index。此外,还探讨了max_iter和tol参数对迭代停止的影响,以及KMeans在数据降维和矢量量化中的应用。
摘要由CSDN通过智能技术生成

目录

1 概述

1.1 无监督学习与聚类算法

1.2 sklearn中的聚类算法

2 KMeans

2.1 KMeans是如何工作的

2.2 簇内误差平方和的定义和解惑

2.3 KMeans算法的时间复杂度

3 sklearn.cluster.KMeans

3.1 重要参数n_clusters

3.1.1 先进行一次聚类看看吧

3.1.2 聚类算法的模型评估指标

3.1.2.1 当真实标签已知的时候

3.1.2.2 当真实标签未知的时候:轮廓系数

3.1.2.3 当真实标签未知的时候:Calinski-Harabaz Index

3.1.3 案例:基于轮廓系数来选择n_clusters

3.3 重要参数max_iter & tol:让迭代停下来

3.4 重要属性与重要接口

3.5 函数cluster.k_means

4 案例:聚类算法用于降维,KMeans的矢量量化应用

1 概述

1.1 无监督学习与聚类算法

在过去的五周之内,我们学习了决策树,随机森林,逻辑回归,他们虽然有着不同的功能,但却都属于 “有监督学习 的一部分,即是说,模型在训练的时候,即需要特征矩阵 X ,也需要真实标签 y。机器学习当中,还有相当一部分算法属于 无监督学习 ,无监督的算法在训练的时候只需要特征矩阵 X ,不需要标签。我们曾经学过的 PCA降维算法就是无监督学习中的一种,聚类算法,也是无监督学习的代表算法之一。
聚类算法又叫做 “无监督分类”,其目的是将数据划分成有意义或有用的组(或簇)。这种划分可以基于我们的业务需求或建模需求来完成,也可以单纯地帮助我们探索数据的自然结构和分布。比如在商业中,如果我们手头有大量的当前和潜在客户的信息,我们可以使用聚类将客户划分为若干组,以便进一步分析和开展营销活动,最有名的客户价值判断模型 RFM ,就常常和聚类分析共同使用。再比如,聚类可以用于降维和矢量量化(vector quantization),可以将高维特征压缩到一列当中,常常用于图像,声音,视频等非结构化数据,可以大幅度压缩数据量。
聚类 vs 分类

1.2 sklearn中的聚类算法

聚类算法在 sklearn中有两种表现形式,一种是类(和我们目前为止学过的分类算法以及数据预处理方法们都一样),需要实例化,训练并使用接口和属性来调用结果。另一种是函数( function),只需要输入特征矩阵和超参数,即可返回聚类的结果和各种指标。

输入数据
需要注意的一件重要事情是,该模块中实现的算法可以采用不同类型的矩阵作为输入。 所有方法都接受形状[n_samples n_features] 的标准特征矩阵,这些可以从 sklearn.feature_extraction模块中的类中获得。对于亲和力传播,光谱聚类和 DBSCAN ,还可以输入形状 [n_samples n_samples]的相似性矩阵,我们可以使用sklearn.metrics.pairwise 模块中的函数来获取相似性矩阵。

2 KMeans

2.1 KMeans是如何工作的

作为聚类算法的典型代表, KMeans 可以说是最简单的聚类算法没有之一,那它是怎么完成聚类的呢?
KMeans 算法中,簇的个数 K 是一个超参数,需要我们人为输入来确定。 KMeans的核心任务就是根据我们设定好的 K ,找出 K个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去。具体过程可以总结如下:
那什么情况下,质心的位置会不再变化呢?当我们找到一个质心,在每次迭代中被分配到这个质心上的样本都是一致的,即每次新生成的簇都是一致的,所有的样本点都不会再从一个簇转移到另一个簇,质心就不会变化了。
这个过程在可以由下图来显示,我们规定,将数据分为 4 簇( K=4 ),其中白色 X 代表质心的位置:

在数据集下多次迭代(iteration),就会有:

可以看见,第六次迭代之后,基本上质心的位置就不再改变了,生成的簇也变得稳定。此时我们的聚类就完成了,我们可以明显看出, KMeans 按照数据的分布,将数据聚集成了我们规定的 4类,接下来我们就可以按照我们的业务需求或者算法需求,对这四类数据进行不同的处理。

2.2 簇内误差平方和的定义和解惑

聚类算法聚出的类有什么含义呢?这些类有什么样的性质?我们认为, 被分在同一个簇中的数据是有相似性的,而 不同簇中的数据是不同的,当聚类完毕之后,我们就要分别去研究每个簇中的样本都有什么样的性质,从而根据业务需求制定不同的商业或者科技策略。这个听上去和我们在上周的评分卡案例中讲解的 分箱”概念有些类似,即我们分箱的目的是希望,一个箱内的人有着相似的信用风险,而不同箱的人的信用风险差异巨大,以此来区别不同信用度的人,因此我们追求 组内差异小,组间差异大 。聚类算法也是同样的目的,我们追求 “簇内差异小,簇外差异大 。而这个 差异 ,由 样本点到其所在簇的质心的距离 来衡量。
对于一个簇来说,所有样本点到质心的距离之和越小,我们就认为这个簇中的样本越相似,簇内差异就越小。而距离的衡量方法有多种,令 表示簇中的一个样本点, 表示该簇中的质心, n 表示每个样本点中的特征数目, i表示组成点 的每个特征,则该样本点到质心的距离可以由以下距离来度量:

如我们采用欧几里得距离,则一个簇中所有样本点到质心的距离的平方和为:

其中, m 为一个簇中样本的个数, j 是每个样本的编号。这个公式被称为 簇内平方和 cluster Sum of Square),又叫做 Inertia 。而将一个数据集中的所有簇的簇内平方和相加,就得到了整体平方和(Total Cluster Sum of Square ),又叫做 total inertia Total Inertia 越小,代表着每个簇内样本越相似,聚类的效果就越好。 因此 KMeans 追求的是,求解能够让 Inertia 最小化的质心。实际上,在质心不断变化不断迭代的过程中,总体平方和是越来越小的。我们可以使用数学来证明,当整体平方和最小的时候,质心就不再发生变化了。如此, K-Means的求解过程,就变成了一个最优化问题。
这是我们在这个课程中第二次遇见最优化问题,即需要将某个指标最小化来求解模型中的一部分信息。记得我们在逻辑回归中式怎么做的吗?我们在一个固定的方程y(x)=\frac{1}{1+e^{\theta^{T_{x}}}}中最小化损失函数来求解模型的参数向量 ,并且基于参数向量 的存在去使用模型。而在 KMeans 中,我们在一个固定的簇数K下,最小化总体平方和来求解最佳质心,并基于质心的存在去进行聚类。两个过程十分相似,并且,整体距离平方和的最小值其实可以使用梯度下降来求解。因此,有许多博客和教材都这样写道:簇内平方和 / 整体平方和是 KMeans 的损失函数。
解惑: Kmeans 有损失函数吗?
记得我们在逻辑回归中曾有这样的结论:损失函数本质是用来衡量模型的拟合效果的,只有有着求解参数需求的算法,才会有损失函数。 Kmeans不求解什么参数,它的模型本质也没有在拟合数据,而是在对数据进行一种探索。所以如果你去问大多数数据挖掘工程师,甚至是算法工程师,他们可能会告诉你说, K-Means不存在什么损失函数, Inertia 更像是 Kmeans 的模型评估指标,而非损失函数。
但我们类比过了 Kmeans 中的 Inertia和逻辑回归中的损失函数的功能,我们发现它们确实非常相似。所以,从 求解模型中的某种信息,用于后续模型的使用 这样的功能来看,我们可以认为 Inertia Kmeans中的损失函数,虽然这种说法并不严谨。
对比来看,在决策树中,我们有衡量分类效果的指标准确度accuracy,准确度所对应的损失叫做泛化误差,但我们不能通过最小化泛化误差来求解某个模型中需要的信息,我们只是希望模型的效果上表现出来的泛化误差很小。因此决策树, KNN 等算法,是绝对没有损失函数的。
大家可以发现,我们的 Inertia是基于欧几里得距离的计算公式得来的。实际上,我们也可以使用其他距离,每个距离都有自己对应的 Inertia 。在过去的经验中,我们总结出不同距离所对应的质心选择方法和 Inertia ,在Kmeans中,只要使用了正确的质心和距离组合,无论使用什么样的距离,都可以达到不错的聚类效果:
而这些组合,都可以由严格的数学证明来推导。在 sklearn当中,我们无法选择使用的距离,只能使用欧式距离。因此,我们也无需去担忧这些距离所搭配的质心选择是如何得来的了。

2.3 KMeans算法的时间复杂度

除了模型本身的效果之外,我们还使用另一种角度来度量算法:算法复杂度。算法的复杂度分为时间复杂度和空间复杂度,时间复杂度是指执行算法所需要的计算工作量,常用大O符号表述;而空间复杂度是指执行这个算法所需要的内存空间。如果一个算法的效果很好,但需要的时间复杂度和空间复杂度都很大,那我们将会权衡算法的效果和所需的计算成本之间,比如我们在降维算法和特征工程那两章中,我们尝试了一个很大的数据集下 KNN和随机森林所需的运行时间,以此来表明我们降维的目的和决心。
KNN 一样, KMeans 算法是一个计算成本很大的算法。在这里,我们介绍 KMeans算法的时间和空间复杂度来加深对 KMeans 的理解。
KMeans 算法的平均复杂度是 O(k*n*T) ,其中 k 是我们的超参数,所需要输入的簇数, n是整个数据集中的样本量,T 是所需要的迭代次数(相对的, KNN 的平均复杂度是 O(n) )。在最坏的情况下, KMeans的复杂度可以写作
本程序是在python中完成,基于sklearn.cluster中的k-means聚类包来实现数据的聚类,对于里面使用的数据格式如下:(注意更改程序中的相关参数) 138 0 124 1 127 2 129 3 119 4 127 5 124 6 120 7 123 8 147 9 188 10 212 11 229 12 240 13 240 14 241 15 240 16 242 17 174 18 130 19 132 20 119 21 48 22 37 23 49 0 42 1 34 2 26 3 20 4 21 5 23 6 13 7 19 8 18 9 36 10 25 11 20 12 19 13 19 14 5 15 29 16 22 17 13 18 46 19 15 20 8 21 33 22 41 23 69 0 56 1 49 2 40 3 52 4 62 5 54 6 32 7 38 8 44 9 55 10 70 11 74 12 105 13 107 14 56 15 55 16 65 17 100 18 195 19 136 20 87 21 64 22 77 23 61 0 53 1 47 2 33 3 34 4 28 5 41 6 40 7 38 8 33 9 26 10 31 11 31 12 13 13 17 14 17 15 25 16 17 17 17 18 14 19 16 20 17 21 29 22 44 23 37 0 32 1 34 2 26 3 23 4 25 5 25 6 27 7 30 8 25 9 17 10 12 11 12 12 12 13 7 14 6 15 6 16 12 17 12 18 39 19 34 20 32 21 34 22 35 23 33 0 57 1 81 2 77 3 68 4 61 5 60 6 56 7 67 8 102 9 89 10 62 11 57 12 57 13 64 14 62 15 69 16 81 17 77 18 64 19 62 20 79 21 75 22 57 23 73 0 88 1 75 2 70 3 77 4 73 5 72 6 76 7 76 8 74 9 98 10 90 11 90 12 85 13 79 14 79 15 88 16 88 17 81 18 84 19 89 20 79 21 68 22 55 23 63 0 62 1 58 2 58 3 56 4 60 5 56 6 56 7 58 8 56 9 65 10 61 11 60 12 60 13 61 14 65 15 55 16 56 17 61 18 64 19 69 20 83 21 87 22 84 23 41 0 35 1 38 2 45 3 44 4 49 5 55 6 47 7 47 8 29 9 14 10 12 11 4 12 10 13 9 14 7 15 7 16 11 17 12 18 14 19 22 20 29 21 23 22 33 23 34 0 38 1 38 2 37 3 37 4 34 5 24 6 47 7 70 8 41 9 6 10 23 11 4 12 15 13 3 14 28 15 17 16 31 17 39 18 42 19 54 20 47 21 68 22
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值