KMeans
1. 概述
聚类算法属于无监督学习(即进行模型训练时不需要标签),而KMeans又是聚类算法中的一个典型算法。聚类顾名思义就是将数据样本按照某种技术进行分类,使得每一类中的数据紧密程度高,而类与类之间的紧密程度尽量低,这些类就被称为簇。
2. 聚类和分类的区别
聚类 | 分类 | |
---|---|---|
类型 | 无监督学习,模型学习中不需要标签 | 有监督学习,模型学习过程中需要标签 |
特点 | 将混杂的数据分成多个簇,并且探究组间的数据是否存在联系 | 根据带标签的数据学习,获得对应标签的具体特征应该是什么样的,最终需要将新的数据划分到已经分好的组中 |
结果 | 可以有不同的聚类结果 | 分类的结果是确定的,给定一个数据样本,一定会有它所对应的类别 |
3. KMeans的原理
3.1 相关概念
簇:即聚类的结果,就是聚类完成后所划分成的不同的部分,簇之间没有交集,位于同一个簇内的样本都认为属于同一类。
质心:就是簇内数据的均值,就是这个簇的质心。
KMeans中的核心就是在数据集中按照我们给定的K值(簇的个数),找到对应K个质心,将离这些质心最近的数据全部归结到该簇内,具体流程如下:
3.2 相关数学公式
3.2.1 距离
上面提到最近是指距离最近,距离除了欧几里得距离外还有曼哈顿距离和余弦距离。其中欧几里得距离为 d = ( ∑ i = 0 n ( x i − u i ) 2 ) 1 / 2 d=(\sum_{i=0}^n {(x_i-u_i)}^2)^{1/2} d=(i=0∑n(xi−ui)2)1/2其中 u u u表示质心, x x x代表一个样本点, n n n是维数。
3.2.2 簇内平方和
簇中所有样本到该簇质心的距离平方和(CCS) C C S = ∑ j = 0 m ∑ i = 0 n ( x i − u i ) 2 CCS = \sum_{j=0}^m\sum_{i=0}^n{(x_i-u_i)}^2 CCS=j=0∑mi=0∑n(xi−ui)2其中 m m m表示一个簇中的所有样本个数。
3.2.3 整体平方和
数据集中的所有簇的簇内平方和相加被称为整体平方和(TCCS) T C C S = ∑ q = 0 k C C S q TCCS = \sum_{q=0}^k{CCS_q} TCCS=q=0∑kCCSq其中 k k k表示簇数。
KMeans聚类是基于距离计算来实现的。KMeans追求在固定k的前提下,进行TCCS最小化,越小的CCS就意味着每个簇内样本点到质心的距离就越近,簇内的样本相似度就越高,聚类的效果就越好。这里强调了在固定k的前提是因为,随着簇数越来越多,则CCS也在不断减小,当簇数等于样本数时CCS等于0,但是这样的聚类没有意义。
3.3 KMeans是否有损失函数
损失函数用来衡量模型的拟合效果,只有在需要求解参数的算法中才有损失函数(比如线性回归)。因此严格来说,KMeans中只是对数据进行划分,并没有拟合数据,虽然追求TCCS最小的过程与逻辑回归中最小化损失函数类似,但是KMeans没有损失函数。但是可以将TCCS作为损失函数来理解。
3.4 聚类算法的模型评估指标
3.4.1 关于CCS参数
因为聚类算法追求簇内差异小,簇间差异大,而CCS是衡量簇中数据与质心的远近程度和联系程度,CCS值越小那么联系就越紧密,聚类效果就越好。但是,这个方法存在很多问题:比如CCS会受到簇数的影响,分的簇越多CCS就会越小;在高维度数据中计算欧氏距离很耗时间等,故不采用CCS作为评估指标
3.4.2 样本标签已知的模型评估
3.4.3 样本标签未知的模型评估
- 轮廓系数
轮廓系数的定义为: s = b − a m a x ( a , b ) s = \frac{b-a}{max(a,b)} s=max(a,b)b−a其中b为一个样本点到其他最近簇中所有样本的平均距离,a为该样本点到同簇中其它样本的平均距离,因此 s s s的取值范围在(-1,1)。因此为了满足簇内差异小,簇间差异大,需要b越大越好,a越小越好,对应到轮廓系数s则是越接近1越好。
轮廓系数是针对每一个样本而言,对于整个模型来说,需要看平均轮廓系数。 - Calinski-Harabaz Index
Calinski-Harabaz Index的定义公式如下: s = t r ( B ) t r ( W ) ∗ N − k k − 1 s = \frac{tr(B)}{tr(W)}*\frac{N-k}{k-1} s=tr(W)tr(B)∗k−1N−k其中N为样本数,k为簇的个数,B是不同簇之间的协方差矩阵,W是簇内样本的协方差矩阵,tr表示矩阵的迹。协方差矩阵的迹可以衡量组间数据的离散程度,离散程度越大则迹也越大,因此希望tr(B)越大,tr(W)越小越好,对应到s上就是越大越好。该方法相对于轮廓系数而言计算很快。
4. Sklearn中的KMeans
- 类名:class sklearn.cluster.KMeans (参数)
- KMeans 类中的重要参数列表
参数含义 | |
---|---|
n_clusters | 该参数即KMeans算法中的K值,分类的类别个数 |
init | 默认值“k-means++”,表示初始质心的选择方法,可选值为:默认值、“random”或者指定的n维数组 |
random_state | 质心初始化时的随机数种子 |
n_init | 使用不同的质心随机初始化的种子运行KMeans的次数 |
max_iter | 单次运行KMeans算法的最大迭代次数 |
tol | 浮点数,指定两次迭代间簇内平方和下降的最小值,小于该值迭代求解就会停下 |
- KMeans 类的重要属性
属性含义 | |
---|---|
cluster_centers_ | 收敛到的质心 |
labels_ | 每个样本对应的标签 |
inertia_ | 簇内平方和 |
n_iter_ | 实际的迭代次数 |