1.无监督学习与聚类算法
无监督算法在训练的时候只需要特征矩阵X,不需要标签,算法通过特征的相似度对样本进行分组。
我们学过的PCA降维算法就是无监督学习的一种,聚类算法也是无监督学习的代表算法之一。
2.KMeans
KMeans是最简单的聚类算法,没有之一。
KMeans是如何工作的
(1)KMeans的核心任务
根据我们设定好的K,找出K个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中。
(2)过程
新的质心→新的簇→新的均值→新的簇
簇内误差平方和的定义和解惑
(1)被分到同一个簇中的数据是由相似性的,而不同簇中的数据是不同的。我们追求“簇内差异小,簇外差异大”,这个差异,由样本点到其所在簇的质心的距离来衡量。
(2)对于一个簇来说,所有样本点到质心的距离之和越小,我们就认为这个簇中的样本越相似,簇内差异就小。
(3)簇内平方和Inertia;整体平方和Total Inertia。
KMeans追求的,是求解能够让Inertia最小化的质心。而实际上,在质心不断变化迭代的过程中,总体平方和是越来越小的。,因此KMeans的求解过程,就变成了一个最优化问题。
3.sklearn.cluster.KMeans
重要参数n_cluster
告诉模型要分几类,这是KMeans当中唯一必填的参数。
(2)经验:当数据量很大时,KMeans时间复杂度大,利用切片数据先求得初始质心和簇,再将全部数据放入到分好的簇中,效果会比较好。
#先取出一部分数据集来求出初始的质心,并分好簇。再将整个数据集放到已经分好的簇中。
cluster_smallsub = KMeans(n_clusters=n_clusters,random_state=0).fit(X[:200])#先fit
y_pred_ = cluster_smallsub.predict(X)#再利用fit的结果predict
聚类算法的模型评估指标
聚类模型的结果不是某种标签输出,并且聚类结果是不确定的,其优劣由业务需求或者算法需求来决定,并且没有永远的答案。
(1)当真实标签已知的时候
在现实中,如果拥有真实标签,则更倾向于分类算法,但这并不排除使用聚类算法的可能性。三种方法:
①互信息法
②V-measure
③调整兰德系数
(2)当真实标签未知的时候
当真实标签不知道的时候,往往依赖于评价簇内的稠密程度(簇内差异小)和簇间的离散程度(簇外差异大)来评估聚类的效果。
①轮廓系数
轮廓系数是最常用的聚类算法的评价指标,它是对每个样本来定义的,它能够同时衡量:样本与其自身所在簇中的其他样本的相似度以及样本与其他簇中的样本的相似度。
轮廓系数的取值范围是(-1,1),越接近1表示聚类效果越好,负数代表聚类效果非常差。
在sklearn中,sihouette_score返回一个数据集中,所有样本的轮廓系数的均值;sihouette_sample返回数据集中每个样本自己的轮廓系数。
缺陷:在凸型数据上表现会虚高。
②Calinski-Harabaz Index
比起轮廓系数,Calinski-Harabaz计算速度非常快。指数值越高,表示聚类的效果也越好。
(3)案例:基于轮廓系数选择n_cluster
通常会绘制“轮廓系数分布图”和“聚类后的数据分布图”来选择我们的最佳n_clusters。
重要参数init&random_state&n_init:初始质心怎么放好?
(1)init
初始质心放置的位置不同,聚类的结果很可能也会不一样,一个好的质心选择可以让K-Means避免更多的计算,让算法收敛稳定且更快。
如果有足够的时间,K-means一定会收敛,但inertia可能收敛到局部最小值,是否能够收敛到真正的最小值很大程度上取决于质心的初始化。init就是用来帮助我们决定初始化方式的参数。
(2)random_state
一个random_state对应一个质心随机初始化的随机数种子,可以通过设置random_state参数来控制每次生成的初始质心都在同样的位置,甚至可以画学习曲线来确定最优的random_state是哪个整数。
(3)n_init
如果不指定随机数种子(random_state),sklearn中的K-means并不会只选择一个随机模式扔出结果,而会在每个随机数种子下运行多次,并使用结果最好的一个随机数种子来作为初始质心。使用n_init来选择,每个随机数种子下运行的次数。这个参数并不常用,默认为10。
重要参数max_iter&tol:让迭代停下来
我们知道,当质心不再移动,Kmeans算法就会停下来,但是在完全收敛之前,我们也可以使用max_iter(最大迭代次数),或者tol(两次迭代间Inertia下降的量),这两个参数来让迭代提前停下来。
有时限制迭代次数反而会提升模型效果。
函数cluster.k_means
函数k_means的用法是直接输入一系列数,然后直接返回结果。一次性的,函数k_means会一次返回质心,每个样本对应的簇的标签,inertia以及最佳迭代次数。
from sklearn.cluster import k_means
k_means(X,4,return_n_iter=True)
4.案例:聚类算法用于降维——KMeans的矢量化应用
(1)矢量化
将若干个标量数据组成一个矢量,然后在矢量空间给以整体量化,从而压缩了数据而不损失多少信息量。
(2)K-Means矢量化应用的背景
K-Means聚类最重要的应用之一是非结构数据(图像,声音)上的矢量化。非结构化数据往往占用比较多的储存空间,我们希望通过矢量化在保证数据质量的前提下,尽量缩小非结构化数据的大小,或者简化非结构化数据的结构。
(3)与其他降维方式的对比
K-Means聚类的矢量化量化本质是一种降维应用,但它与其他降维算法的思路不相同。
特征选择的降维是直接选取对模型贡献最大的特征;PCA的降维是聚合信息;而矢量量化的降维是在同等样本量上压缩信息的大小,即不改变特征和样本的数目,只改变在这些特征下的样本上的信息量。
(4)降维思路
图像本来有9W多种颜色,我们将颜色压缩到64种。
使用K-Means将9W种颜色聚类成64类,然后使用64个簇的质心来替代全部的9W种颜色。