在监督式学习中,我们针对一组标记的训练数据提出一个适当的假设。相比之下,在无监督学习案例中,我们面对的是一组无标记的训练数据,使用算法分析出数据的结构。
K均值 (K-means)算法
在聚类问题中,我们有未加标签的数据。我们希望有一个算法能够自动的把这些数据分成有紧密关系的子集,或是簇。K均值 (K-means)算法是现在最为广泛使用的聚类方法。
K均值是一个迭代方法,它要做两件事情:
- 簇分配。
- 移动聚类中心。
K-Means 第1步:簇分配:
- 遍历所有的样本。
- 计算每一个点最接近的中心,将其分配到最近的聚类中心。
K-Means 第2步:移动聚类中心:
- 找出属于每个聚类中心的点,计算出它们的均值位置。
- 把聚类中心移动到当前的均值位置。
K-Means 第3步:重复执行上面两步
- 一直迭代下去,聚类中心和样本簇不再改变时,K均值方法就收敛了。
K-Means的规范化描述
K均值算法接受两个输入:
- 参数K:从数据中聚类出的簇的个数。
- 训练集:
因为这是非监督学习,我们的数据集中不需要y,同时在非监督学习的 K均值算法里,我们约定 是一个n维向量,这就是“训练样本是n维而不是n+1维”的原因(按照惯例,排除 这一项)。
K均值算法:
第一步:随机初始化 个聚类中心,记作 , 一直到 。
第二步:
K均值内部循环执行以下步骤:
簇分配
首先对于每个训练样本,我们用变量 表示K个聚类中心中最接近 的那个中心的下标(具体的类别),这就是簇分配。
大写的 表示所有聚类中心的个数,小写的 则表示某个聚类中心的下标。
我们希望的是:在所有 个中心中,找到一个k使得 到 的距离是 到所有的聚类中心的距离中最小的那个,这就是计算 的方法。
这里还有另外的表示 的方法:我用范数的形式 来表示,这是第 个训练样本到聚类中心 的距离。
接下来我要做的是找出k的值,让这个式子 最小,然后将 赋值为 。
出于惯例,人们更喜欢用距离的平方 来表示 距聚类中心 的距离。
移动聚类中心
对于每个聚类中心: 从1循环到 ,将 赋值为这个簇的均值。
异常情况
如果存在一个没有点分配给它的聚类中心,通常在这种情况下,我们就直接移除那个聚类中心,并重新随机找一个聚类中心。(但是直接移除那个中心,是更为常见的方法。不过在实际过程中,这个问题不会经常出现。)
K均值的代价函数
以下便是K均值算法需要最小化的代价函数:
K均值的目标就是要最小化代价函数:
在K均值算法中,有时候也叫做失真代价函数(distortion cost function)。
随机初始化
确保
当运行 均值方法时,你需要有一个聚类中心数值 , 值要比训练样本的数量 小,即 。
随机初始化
随机挑选K个训练样本,然后我要做的是设定 让它们等于这 个样本。
运行K均值方法,你可能会得到这样的聚类结果:
但是如果你运气特别不好,随机初始化K均值方法也可能会卡在不同的局部最优上面:
我们能做的是:初始化K均值很多次,并运行K均值方法很多次,通过多次尝试来保证我们最终能得到一个足够好的结果。一个尽可能局部或全局最优的结果。
- 如果你运行K均值方法时,所用的聚类数相当小。比如聚类数是从2~10之间的任何数的话,做多次的随机初始化,通常能够保证你能有一个较好的局部最优解,保证你能找到更好的聚类数据。
- 但是如果K非常大的话,比如K比10大很多,就不太可能会有太大的影响。事实上,这种情况下有可能你的第一次随机初始化就会给你相当好的结果。
肘部法则 (Elbow Method)
对于肘部法则,我们所需要做的是改变K的值(也就是聚类类别的总数)。
我们用K值为1~N 来运行K-均值聚类算法。这就意味着所有的数据会分到1~N个类里。然后分别计算他们的代价函数(或者说计算畸变) :
在这里,你会发现这样一种模式:K从1变化到2、再从2到3时,畸变值迅速下降;然后在3的时候,到达一个肘点。此后畸变值就下降得非常慢。这样看起来,也许使用3个类是聚类数目的正确选择。这是因为那个点是曲线的肘点。就是说畸变值快速地下降,直到K=3这个点,在这之后就下降得非常慢,那么我们就选K=3。
简单小结一下肘部法则:它是一个值得尝试的方法,但事实证明肘部法则并不那么常用,其中一个原因是如果你把这种方法用到一个聚类问题上,事实上你最后得到的曲线通常看起来是更加模棱两可的。