KMeans算法

本文详细介绍了KMeans算法的基本概念、初始化方法、Mini-Batch K-Means、聚类数量选择以及优缺点。强调了KMeans算法对初始中心点的选择敏感,推荐使用K-Means++方法。同时,提出了通过拐点和轮廓分数来确定最优聚类数量,并讨论了KMeans在预处理和图像压缩中的应用。
摘要由CSDN通过智能技术生成

无监督问题,将相似的样本分到一组,难点是如何评估和调参
注意!!!!!!!:对输入数据进行标准化很重要!!!!
it is important to scale the input features.虽然不能保证所有的cluster被聚类的很好,但是通常会改善一些。

一、基本概念

工作原理:

  1. 选取k个点作为初始的类中心点,这些点一开始都是从数据集中随机抽取的
  2. 将每个点分配到最近的类中心点,这样就形成了k个类,然后重新计算每个类的中心点
  3. 重复第二步,直到类不发生变化,或者设置最大迭代数,只要达到最大迭代次数就会结束聚类

质心:centroid,均值,即向量各维取平均值,中心点
距离的度量: 常用欧几里得距离和余弦相似度(要先标准化操作)
优化目标:对所有的K簇进行优化(每个簇里要优化每个样本点x到中心点c的距离越小越好)
在这里插入图片描述

Kmeans算法做出来的分类结果很大程度上由起始centroid决定。如果起始中心点设置不好,最终的结果也只能是局部最优。

二、Centroid Initialization Methods

  1. 可以试着将大概的各个cluster的中心点,输入到算法中。(比如说之前用了其他的聚类算法得到的中心点)
  2. 可以多跑几次,使用不同的随机起始中心点。然后选取最优的。在sklearn中由n_init控制
    如何衡量聚类结果是最优的呢?叫做inertia [ɪˈnɜːrʃə] :mean squared distance between each instance and its closest centroid
    通过Kmeans.inertia_ 调用或者Kmeans.score(x) 会得到负的inertia值(great is better)
  3. 通常初始中心点生成使用 K-Means++ 方法。不需要改成random。

三、Mini-Batch K-Means

K-Means算法在Sklearn中默认采用accelerated K-Means:避免不必要地距离计算

如果要用最原始地K-Means算法可以将 algorithm参数调成'full'

Mini-batch:
不用所有的数据集进行迭代,而是使用小批量的数据。每轮使用小批量数据迭代后,centroid只移动一点点

from sklearn.cluster import MiniBatchKMeans

minibatch_kmeans = MiniBatchKMeans(n_clusters=5)
minibatch_kmeans.fit(X)

Mini-Batch 比原版的运算更快,但inertia(一种聚类的评估指标)会更差一些,尤其当clusters增多时
在这里插入图片描述

四、找寻最优的聚类数量

4.1 拐点

一般来说我们并不知道有多少个聚类K。如果只用inertia单纯的衡量聚类的好坏,是不够的!!
因为随着K聚类的不断地增加,inertia必定减少
The inertia is not a good performance metric when trying to choose k since it keeps getting lower as we increase k. Indeed, the more clusters there are, the closer each instance will be to its closest centroid, and therefore the lower the inertia will be.
在这里插入图片描述
可以看出k=4 是一个拐点,尽管k=5是最优解,但很靠近了。拐点左边的K值没必要在测试了,可以测拐点右边的K值。(这个方法来选择最优的K值是很粗糙的)

4.2 silhouette score 轮廓分数

[ˌsɪluˈet]
silhouette score = (b – a) / max(a, b)
ai:计算样本i到同簇其他样本的平均距离。ai越小,说明样本i越应该被聚类到该簇。将ai称为样本i的簇内不相似度
bi: 计算样本i到其他簇的所有样本的平均距离,bi是这些平均距离中的最小值!!!bi =min{b1, b2, bik}
在这里插入图片描述

s值越接近1越好,取值是[-1,1] ,接近于0,说明此时的样本靠近聚类边界,-1说明很可能被分错了

from sklearn.metrics import silhouette_score
silhouette_score(</
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值