问题描述
假设有下面这样一个数据集,想要对其中的数据进行分类,分为两个聚类。例如
算法流程
K-Means算法是个迭代算法,其迭代过程分为两步:聚类分配和中心移动。首先随机生成两个点,即聚类中心,如下图所示。
然后开始算法的迭代过程:
(1)首先进行聚类分配,遍历所有样本,按照样本与两个聚类中心的距离大小来将每个样本分配给两个聚类中心。即把样本分配到离他最近的那个聚类中心。
(2)然后进行聚类中心的移动。计算出同类所有数据的均值,然后将该类数据的聚类中心移动到那个均值上。
然后重复(1)和(2),直到聚类中心不再变化,这时就产生了最后的分类结果。如下图所示:
优化目标
首先定义三个符号:表示当前第i个样本所属的聚类索引;
表示第k个聚类中心的坐标;
表示第i个样本所属聚类的聚类中心的坐标。优化函数如下:
其中第一行是优化目标,1/m乘以每个样本与其聚类中心聚类的平方的总和。K-Means算法的目标就是要找到合适的和
,使优化目标最小。
事实上,K-Means算法迭代过程的第一步聚类分配,是在通过选择来最小化代价函数;而第二步中心移动,是通过选择合适的
来最小化代价函数。
初始化
假设算法要将数据分为K个聚类,那么首先在训练集中随机选取K个点作为聚类中心,但是这样可能会出现局部最优解的问题。如下图所示:
此时只能通过多次初始化,得到多个不同的c参数和μ参数,再从中选取效果最好的那个,即选出代价函数值最小的那个。在聚类数较小时,多次初始化的效果更佳。
聚类数量K
聚类数量有时是很难确定的,例如下面这个例子:
这个训练集可以被分为4个聚类,也可以被分为2个聚类,所以有时聚类数量并没有标准答案。
但有一个肘部法则,可以帮助我们在选择尽量好的聚类数量。对于一个数据集,我们设置聚类数量为1,2,3…,8,9,10,并分别求出这些聚类数量所对应的代价值,然后可能得到下图这种曲线:
曲线中那个趋势变化最明显的点就是“肘部”,那么我们就可以选择肘部这个点来作为聚类数量。但在实际情况中,我们很难得到这样的曲线,可能得到的曲线是非常模糊的,相邻两点间的差别也很小,这是肘部法则就很难应用了。
在我们应用K-Means算法进行数据聚类时,往往会用这些分类后的数据进行下一步工作,那么最好的方法就是根据下一步工作的需要来选取聚类数量。