
5.1 原理介绍
本节将讲述K-Means算法的主要原理,详细介绍其算法步骤和数学原理,并运用算法的一些技巧,最后对其优缺点做简要说明。
5.1.1 算法思想
K-Means算法属于非监督学习,在训练模型时不需要输入样本的标签,只需要输入特征就行。K-Means算法把各类样本的均值点当成中心点,通过样本与各中心点的距离来判断样本属于哪一类,常用的距离是欧氏距离。在训练过程中各类样本的中心点在不断地变化,使得模型训练迭代停止的条件可以是下列三者之一。
1)中心点不再变动。
2)各样本点到其中心点的距离之和几乎不变。
3)各个样本的归类情况不变。
整个训练的目的是使各个样本到其所属的中心点距离之和最小,因此可以将其定义为算法的损失函数,公式如下。

其中rnk取0或1,当样本n属于k这一类时取1,否则取0。||xn-uk||2是样本x到每一类的中心点距离的平方。 训练K-Means的目的就是使该损失函数最小。
5.1.2 算法流程
K-Means算法是聚类算法中比较简单的一种,整个算法是流程式的,可以通过以下几个简单的步骤来概括。
1)随机选取k个样本点作为初始的中心点。
2)计算每个样本点到k个中心点的距离,样本点离哪个中心点最近,就把该样本点归为哪一类,并记录此次分类情况。
3)将样本分为k类后,计算每一类中各个点的均值点,并把其作为新的中心点。
4)计算每个样本点到新的中心点的距离,并记录分类情况,然后与上一次计算的分类情况对比,若每一类分类结果都相同,则模型训练结束,得出各类的中心点和分类情况,否则再重复3)、4)步骤。
5.1.3 k值的选取
在K-Means的使用中,需要知道数据应该分为几类,即k取多少。但实际运用时,很多时候是不知道数据到底有几类,这就涉及k应该取多少的问题。本书建议可以使用“肘点法”来确定k的值,即k取不同的值,然后分别训练K-Means模型,随着k的增加,损失函数递减,但是递减的速度会减缓,由快变缓那一刻的点即为k取值的点,具体见后文的实例分析。