ML08 -- 聚类算法K-means

老子叫甜甜 提交于 2019-12-29 20:34:47

聚类算法K-means

K-means最简单的聚类算法属于无监督算法

聚类算法和分类算法的对比

- 聚类 分类
核心 将数据分成多个组,探索每个组的数据是否有联系 从已经分组的数据中去学习,把新数据放到已经分好的组中去
学习类型 无监督,无需标签进行训练 有监督,需要标签进行训练
典型算法 K-Means,DBSCAN,层次聚类 决策树,贝叶斯,逻辑回归
算法输出 聚类结果是不确定的,
不一定总是能够反映数据的真实分类,
同样的聚类,根据不同的业务需求,可能是一个好结果,也可能是一个坏结果
分类的结果是确定的,
分类的优劣是客观的,
不是根据业务或算法需求决定

关键概念:簇与质心

簇:KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上来看簇是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类。簇是聚类结果的表现。

质心:簇中所有数据的均值uj通常被称为这个簇的质心,在一个二维平面中,一簇数据点的质心的横坐标就是这一簇数据点横坐标的均值,质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广到高维空间。

在KMeans算法中,簇的个数K是一个超参数,需要我们人为输入来确定。KMeans的核心任务就是根据我们设定好的K,找出K个最优质心,并将离这些质心最近的数据分别分配到这些质心代表的的簇中去。具体步骤

  • 1.随机抽取K个样本作为最初的质心
  • 2.开始循环:
  • 2.1.将每个样本点分配到距离他们最近的质心,生成K个簇
  • 2.2.对于每个簇,计算所有被分到改簇的样本点的平均值作为新的质心
  • 3.当质心的位置不再发生改变,迭代停止,聚类完成

当我们找到一个质心,在每次迭代中被分配到这个质心上的样本都是一致的,每次新生成的簇都是一致的,所有的样本点都不会再从一个簇转移到另一个簇,质心就不会变了。

簇内误差平方和

对于一个簇来说,所有样本点到质心的距离之和越小,我们就认为这个簇中的样本越相似,簇内差异就越小。
距离的衡量可以使用以下几种,令x表示簇中的一个样本点,μ\mu 表示簇中的质心,n表示每个样本点中的特征数目,i表示组成点x的每个特征,则该样本点到质心的距离可以由以下距离度量:

欧几里得距离: d(x,μ)=i=1n(xiμi)2d(x,\mu) = \sqrt{\sum_{i=1}^{n}(x_i - \mu_i)^2}

曼哈顿距离: d(x,μ)=i=1n(xiμ)d(x,\mu) = \sum_{i=1}^{n}(|x_i - \mu|)

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

簇内平方和Cluster Sum of Square (CSS) = j=0mi=1n(xiμi)2\sum_{j=0}^{m}\sum_{i=1}^{n}(x_i - \mu_i)^2

整体平方和Total Cluster Sum of Square = l=1kCSSl\sum_{l=1}^{k}CSS_l

m为一个簇中样本的个数,j是每个样本的编号。

KMeans追求的是能够让整体平方和最小化的质心。在质心不断迭代的过程中,总体平方和是越来越小的,我们可以使用数学公式证明,当整体平方和最小的时候,质心就不再发生变化了。

簇数和轮廓系数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
簇数越多,整体平方和越小
簇数:不能作为模型的衡量指标。根据簇数计算出inertia,inertia不是有界的不好衡量,而且inertia对数据的分布有假设,会让聚类算法在一些细长簇,环形簇或不规则簇中表现不佳。

如何衡量聚类算法的效果?

KMeans的目标是:确保簇内差异小,簇外差异大。通过衡量簇内差异来衡量聚类的效果。使用轮廓系数

在这里插入图片描述

轮廓系数:评价簇内的稠密程度,和簇间的离散程度的指标
取值范围(-1,1),

  • 越接近1,表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似
  • 为负,表示样本点与簇外的样本更相似
  • 为0,代表两个簇中的样本相似度一致,两个簇应该是同一个簇

如果一个簇中的大多数样本具有比较高的轮廓系数,则簇会有较高的总轮廓系数,则整个数据集的平均轮廓系数越高,则聚类越合适

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!