K均值(K-means)聚类算法



K-Means算法是经典的无监督的聚类算法,它思想简单,实现起来比较方便,聚类效果也不错,因此应用很广泛。本文将讲解K-means聚类算法。

基本概念

  • : 所有数据的点集合,簇中的对象是相似的。
  • 质心: 簇中所有点的中心(计算所有点的均值而来)。
  • SSE: Sum of Sqared Error(误差平方和), 它被用来评估模型的好坏,SSE 值越小,表示越接近它们的质心. 聚类效果越 好。由于对误差取了平方,因此更加注重那些远离中心的点(一般为边界点或离群点)。

一、 K-Means原理

思想:对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

准则函数:聚类集中每一个样本点到该类中心的距离的平方之和,并使其最小化。
对所有k个模式类有:

J = ∑ j = 1 k ∑ i = 1 N j ∣ ∣ X i − Z j ∣ ∣ 2 , X i ∈ S j J=\sum_{j=1}^{k}\sum_{i=1}^{N_j}||X_i-Z_j||^2,X_i\in S_j J=j=1ki=1NjXiZj2XiSj

S j S_j Sj:第 j 个聚类集,聚类中心为 Z j Z_j Zj ;
N j N_j Nj:第 j 个聚类集 S j S_j Sj 中所包含的样本个数。

目标:聚类中心的选择应使准则函数J极小,即:使 J j J_j Jj的极值最小,所以:
∂ J j ∂ Z j = 0 \frac{\partial J_j}{\partial Z_j}=0 ZjJj=0

即:

∂ ∂ Z j ∑ i = 1 N j ∣ ∣ X i − Z j ∣ ∣ 2 = ∂ ∂ Z j ∑ i = 1 N j ( X i − Z j ) T ( X i − Z j ) = 0 \frac{\partial}{\partial Z_j}\sum_{i=1}^{N_j}||X_i-Z_j||^2=\frac{\partial}{\partial Z_j}\sum_{i=1}^{N_j}(X_i-Z_j)^T(X_i-Z_j)=0 Zji=1NjXiZj2=Zji=1Nj(XiZj)T(XiZj)=0

可解得:
Z j = 1 N j ∑ i = 1 N j X i , X i ∈ S j Z_j=\frac{1}{N_j}\sum_{i=1}^{N_j}X_i,X_i\in S_j Zj=Nj1i=1NjXi,XiSj

上式表明: S j S_j Sj类的聚类中心应选为该类样本的均值 。

如果我们想直接求上式的最小值并不容易,这是一个NP难的问题,因此只能采用启发式的迭代方法。
K-Means采用的启发式方式很简单,用下面一组图就可以形象的描述:
在这里插入图片描述
上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图d所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。

当然在实际K-Mean算法中,我们一般会多次运行图c和图d,才能达到最终的比较优的类别。

二、算法流程

2.1 算法描述

(1)任选K个初始聚类中心: Z 1 ( 1 ) Z_1(1) Z1(1) Z 2 ( 1 ) Z_2(1) Z2(1),… , Z k ( 1 ) Z_k(1) Zk(1)
   括号内序号:迭代运算的次序号。

(2)按最小距离原则将其余样本分配到K个聚类中心中的某一个,即:
在这里插入图片描述

(3)计算各个聚类中心的新向量值: Z j ( k + 1 ) j = 1 , 2 , … , K Z_j(k+1) j=1,2,…,K Zjk+1j=1,2,,K
Z j ( k + 1 ) = 1 N j ∑ X ∈ S j ( k ) X , j = 1 , 2 , . . . , K Z_j(k+1)=\frac{1}{N_j}\sum_{X\in S_j(k)}X,j=1,2,...,K Zj(k+1)=Nj1XSj(k)Xj=1,2,...,K

N j N_j Nj:第 j 类的样本数

(4) 判断:

如果 Z j ( k + 1 ) ≠ Z j ( k ) , j = 1 , 2 , … , K Z_j(k+1) \neq Z_j(k),j = 1, 2, … , K Zj(k+1)̸=Zj(k)j=1,2,,K, 则回到(2),将模式样本逐个中心分类,重复迭代计算。

如果 Z j ( k + 1 ) = Z j ( k ) , j = 1 , 2 , … , K Z_j(k+1)= Z_j(k), j = 1, 2, … , K Zj(k+1)=Zj(k)j=1,2,,K, 算法收敛,计算完毕。

2.2 算法分析:

聚类结果受到所选聚类中心的个数和其初始位置,以及模式样本的几何性质及读入次序的影响。实际应用中需要试探不同的K值和选择不同的聚类中心起始值。

优点

  • 思想简单易行;
  • 时间复杂度接近线性;
  • 对大数据集,是可伸缩和有效的;

缺点

  • 要求事先给出要生成的簇数k, 不适合的k值可能返回较差的结果;
  • 不适合发现非凸形状的簇,或者大小差别很大的簇;
  • 对噪声和离群点敏感;

2.3 k-means评价标准

k-means算法因为手动选取k值和初始化随机质心的缘故,每一次的结果不会完全一样,而且由于手动选取k值,我们需要知道我们选取的k值是否合理,聚类效果好不好,将它们画在图上直接观察是比较直观的办法。但现实是,我们的数据不会仅仅只有两个特征,一般来说都有十几个特征,而观察十几维的空间对我们来说是一个无法完成的任务。因此,我们需要一个公式来帮助我们判断聚类的性能,这个公式就是SSE (Sum of Squared Error, 误差平方和 ),它其实就是每一个点到其簇内质心的距离的平方值的总和,这个数值对应kmeans函数中clusterAssment矩阵的第一列之和。 SSE值越小表示数据点越接近于它们的质心,聚类效果也越好。 因为对误差取了平方,因此更加重视那些远离中心的点。一种肯定可以降低SSE值的方法是增加簇的个数,但这违背了聚类的目标。聚类的目标是在保持簇数目不变的情况下提高簇的质量。

2.4 k-means优缺点

1)、优点:

  • 属于无监督学习,无须准备训练集;
  • 原理简单,实现起来较为容易;
  • 结果可解释性较好;

2)、缺点:

  • 聚类数目k是一个输入参数。选择不恰当的k值可能会导致糟糕的聚类结果。这也是为什么要进行特征检查来决定数据集的聚类数目了。
  • 可能收敛到局部最小值, 在大规模数据集上收敛较慢
  • 对于异常点、离群点敏感

使用数据类型 : 数值型数据

三、项目实战

项目实战请转至:tensorflow学习笔记(十二):K-means手写体数字(MNIST)识别

  • 2
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值