一、k-means算法的基本介绍
k-means算法是一个十分经典的聚类算法,同时它也是一个无监督的算法。对于一组没有标记的数据,如果我们需要将其分为几组的话,这时候我们就可以使用到K-means算法了。
给定n个样本的集合,每个样本都由一个特征向量表示,特征向量的维度为m。k-means算法的目标就是将这n个样本划分为k个集合(k<<n),集合两两之间无交集,k个集合的总和就是样本整体X。
每个集合都有一个中心点,某个样本距离哪个集合的中心点距离最近就将其划分为某个集合。
两个向量间距离的衡量方法有很多,k-means中一般使用的是欧氏距离:
k-means算法的目标是通过损失函数最小化来选取最优的划分策略,它的损失函数就是所有样本到达所属集合的中心点的距离最小:
其中𝐶(𝑖)=𝑙表示样本i属于集合l。 表示k个集合的中心点。计算集合中心点的方法我们采用的是:
即该集合中所有样本的在所有维度的平均值。
k-means算法在理解起来是很简单的,不幸的是,求解起来确是很难的,无法求出最优的解,需要使用到迭代的方法,也就是我们下文中介绍的EM算法
二、k-means算法的理论基础——EM算法
EM算法时机器学习中乃至统计学中非常常用的一种算法。在各种模型的优化中都会使用到该算法,比如贝叶斯优化,马尔可夫优化等,K-means算法中的优化算法也是EM算法,因此我们首先来介绍一下EM算法。
EM算法是一种迭代的算法,用于含有隐变量的概率模型参数的极大似然估计。
什么叫含有隐变量的极大似然估计呢?首先我们来个不含有隐变量的极大似然估计。
不含隐变量的极大似然估计
假设我投掷一枚硬币10次,出现的正反面的情况为(0,1,1,1,0,1,1,1,1,0)。如果现在想要求该硬币的参数(也就是硬币为正面的概率)
通过极大似然估计我们有:
很显然我们可以很简单地知道𝑝=0.7时结果最优。
将其推广到K-means算法中,如果我们知道了每个类别的中心点,我们也很容易知道每个样本的类别。
包含隐变量的极大似然估计
介绍了无隐变量的极大似然估计,现在我们介绍一个包含隐变量的似然估计(该例子来自于统计学习方法[李航]中p.175至p.176中的例子,当然我会引入自己的理解)
(三硬币模型)假设有A,B,C三枚硬币。它们出现为正面时的概率是𝜋,𝑝,𝑞。现在我们需要做一个实验:先投掷A硬币,假设其出现正面就投掷B,反之就投掷C。根据B,C出现的结果,做如下记录:正面记录1,反面记录0。(注意,虽然我们每次实验开始都是投掷A,根据A的结果去选择B或者C,但是A的投掷结果并没有被记录下来。)
我们独立地进行了10次实验,观测的结果是:
1,1,0,1,0,0,1,0,1,1
我们只能观测到以上10次结果,每一次的投掷结果都不知道它由硬币B还是硬币C产生的