[Scikit-learn] 2.3 Clustering - kmeans

参考

 

Clusering, GMM, Variational Inference, The Dirchlet Process 这是一个学习渐进的过程,那么,就先从聚类开始。

From: 漫谈 Clustering 系列


 

K-means

cluster

那么计算机要如何来完成这个任务呢?当然,计算机还没有高级到能够“通过形状大致看出来”,不过,对于这样的 N 维欧氏空间中的点进行聚类,有一个非常简单的经典算法,也就是本文标题中提到的 k-means 。

在介绍 k-means 的具体步骤之前,让我们先来看看它对于需要进行聚类的数据的一个基本假设吧:对于每一个 cluster ,我们可以选出一个中心点 (center) ,使得该 cluster 中的所有的点到该中心点的距离小于到其他 cluster 的中心的距离。虽然实际情况中得到的数据并不能保证总是满足这样的约束,但这通常已经是我们所能达到的最好的结果,而那些误差通常是固有存在的或者问题本身的不可分性造成的。例如下图所示的两个高斯分布,从两个分布中随机地抽取一些数据点出来,混杂到一起,现在要让你将这些混杂在一起的数据点按照它们被生成的那个分布分开来:

【这里的图例对理解很有帮助】

gaussian

由于这两个分布本身有很大一部分重叠在一起了,例如,对于数据点 2.5 来说,它由两个分布产生的概率都是相等的,你所做的只能是一个猜测;稍微好一点的情况是 2 ,通常我们会将它归类为左边的那个分布,因为概率大一些,

然而此时它由右边的分布生成的概率仍然是比较大的,我们仍然有不小的几率会猜错。

而整个阴影部分是我们所能达到的最小的猜错的概率,这来自于问题本身的不可分性,无法避免。因此,我们将 k-means 所依赖的这个假设看作是合理的。

 

基于这样一个假设,我们再来导出 k-means 所要优化的目标函数:设我们一共有 N 个数据点需要分为 K 个 cluster ,k-means 要做的就是最小化

\displaystyle J = \sum_{n=1}^N\sum_{k=1}^K r_{nk} \|x_n-\mu_k\|^2

这个函数,其中 r_{nk} 在数据点 n 被归类到 cluster k 的时候为 1 ,否则为 0 。直接寻找 r_{nk} 和 \mu_k 来最小化 J 并不容易,不过我们可以采取迭代的办法:先固定 \mu_k ,选择最优的 r_{nk} ,很容易看出,只要将数据点归类到离他最近的那个中心就能保证 J 最小。下一步则固定 r_{nk},再求最优的 \mu_k。将 J 对 \mu_k 求导并令导数等于零,很容易得到 J 最小的时候 \mu_k 应该满足:

\displaystyle \mu_k=\frac{\sum_n r_{nk}x_n}{\sum_n r_{nk}}

亦即 \mu_k 的值应当是所有 cluster k 中的数据点的平均值。【这里很像GMM的PI值】

由于每一次迭代都是取到 J 的最小值,因此 J 只会不断地减小(或者不变),而不会增加,这保证了 k-means 最终会到达一个极小值。虽然 k-means 并不能保证总是能得到全局最优解,但是对于这样的问题,像 k-means 这种复杂度的算法,这样的结果已经是很不错的了。

下面我们来总结一下 k-means 算法的具体步骤:【算法】

    1. 选定 K 个中心 \mu_k 的初值。这个过程通常是针对具体的问题有一些启发式的选取方法,或者大多数情况下采用随机选取的办法。因为前面说过 k-means 并不能保证全局最优,而是否能收敛到全局最优解其实和初值的选取有很大的关系,所以有时候我们会多次选取初值跑 k-means ,并取其中最好的一次结果。
    2. 将每个数据点归类到离它最近的那个中心点所代表的 cluster 中。
    3. 用公式 \mu_k = \frac{1}{N_k}\sum_{j\in\text{cluster}_k}x_j 计算出每个 cluster 的新的中心点。
    4. 重复第二步,一直到迭代了最大的步数或者前后的 J 的值相差小于一个阈值为止。

 

短板,弊端,无能为力之处:

然而并不是所有的数据都能满足这样的要求,对于数值类型的特征,比如身高,可以很自然地用这样的方式来处理,但是类别 (categorical) 类型的特征就不行了。举一个简单的例子,如果我现在要对犬进行聚类,并且希望直接在所有犬组成的空间中进行,k-means 就无能为力了,因为欧氏距离 \|x_i-x_j\|^2 在这里不能用了:一只 Samoyed 减去一只 Rough Collie 然后在平方一下?天知道那是什么!再加上一只 German Shepherd Dog 然后求一下平均值?根本没法算,k-means 在这里寸步难行!

 

k-medoids

并且我们已经证明在固定了各个数据点的 assignment 的情况下,这样选取的中心点能够把目标函数 J 最小化。然而在 k-medoids 中,我们将中心点的选取限制在当前 cluster 所包含的数据点的集合中

换句话说,在 k-medoids 算法中,我们将从当前 cluster 中选取这样一个点——它到其他所有(当前 cluster 中的)点的距离之和最小——作为中心点。

【理解小助手】

k-means 和 k-medoids 之间的差异就类似于一个数据样本的均值 (mean) 和中位数 (median) 之间的差异:前者的取值范围可以是连续空间中的任意值,而后者只能在给样本给定的那些点里面选。那么,这样做的好处是什么呢?
一个最直接的理由就是 k-means 对数据的要求太高了,它使用欧氏距离描述数据点之间的差异 (dissimilarity) ,从而可以直接通过求均值来计算中心点。这要求数据点处在一个欧氏空间之中。

 

  • 时间复杂度

从 k-means 变到 k-medoids ,时间复杂度陡然增加了许多:在 k-means 中只要求一个平均值 O(N) 即可,而在 k-medoids 中则需要枚举每个点,并求出它到所有其他点的距离之和,复杂度为 O(N^2) 。

  • 对相似度的定义

在 k-medoids 中,我们把原来的目标函数 J 中的欧氏距离改为一个任意的 dissimilarity measure 函数 \mathcal{V}

\displaystyle\tilde{J} = \sum_{n=1}^N\sum_{k=1}^K r_{nk}\mathcal{V}(x_n,\mu_k)

最常见的方式是构造一个 dissimilarity matrix \mathbf{D} 来代表 \mathcal{V},其中的元素 \mathbf{D}_{ij} 表示第 i 只狗和第 j 只狗之间的差异程度,例如,两只 Samoyed 之间的差异可以设为 0 ,一只 German Shepherd Dog 和一只 Rough Collie 之间的差异是 0.7,和一只 Miniature Schnauzer 之间的差异是 1 ,等等。

 

K-Means

K-Medoids

初始据点随机选取

初始随机据点限定在样本点中

使用Means(均值)作为聚点,对outliers(极值)很敏感

使用Medoids(中位数)作为聚点

对数据要求高,要求数据点处于欧式空间中

可适用类别(categorical)类型的特征——(4)

时间复杂度:O(n*k*t),t为迭代次数

时间复杂度:O(n^2 *k*t),t为迭代次数——(4)

K-Means 算法对小规模数据集较高效

K-Medoids算法对大规模数据性能更好,但伸缩性较差——(3)

都有可能陷入局部最优解的困境之中

K的含义相同,都需要开始人为设定簇数目

都是无监督算法

References:

    1. Velmurugan T. Efficiency of K-Means and K-Medoids algorithms for clustering arbitrary data points[J]. International Journal of Computer Technology & Applications, 2012, 3(5): 1758-64.
    2. Arbin N, Mokhtar N Z, Suhaimi N S, et al. Comparative Analysis between K-Means and K-Medoids for Statistical Clustering[J].
    3. Velmurugan T, Santhanam T. Computational complexity between K-means and K-medoids clustering algorithms for normal and uniform distributions of data points[J]. Journal of computer science, 2010, 6(3): 363.
    4. http://blog.pluskid.org/?p=40
    5. https://www.youtube.com/watch?v=u1NtKPuXQKo

 

Vector Quantization by k-means

实际做法就是:

  1. 将每个像素点当作一个数据,跑一下 K-means ,得到 k 个 centroids。
  2. 然后用这些 centroids 的像素值来代替对应的 cluster 里的所有点的像素值。
  3. 对于彩色图片来说,也可以用同样的方法来做,例如 RGB 三色的图片,每一个像素被当作是一个 3 维向量空间中的点。 

 【一种容易理解的压缩算法】

 

posted @ 2017-09-13 19:52  郝壹贰叁  阅读(270)  评论(0编辑  收藏  举报