k-means

假设我们有一个样本集​X=\{x^{(1)},\cdots,x^{(m)}\},我们想将这些数据聚成指定数量的几类。这里,​x^{(i)}\in \mathbb R^{n}。因为没有与x^{(i)}​对应的标签y^{(i)}​,因此,这是一个非监督的学习问题。

用k-means做聚类的具体步骤如下:

  1. 随机初始化​k个质心​\mu_{1},\mu_{2},\cdots,\mu_{k}\mu_{i}\in \mathbb R^{n}

  2. 重复以下操作,直到每个质心​\mu_{i}的值不再改变

    • 对每个样本,找到离其最近的质心,即:
      c_{(i)}=\mathop{argmin}\limits_{j}||x_{(i)}-\mu_{j}||^{2}, \quad i\in (1, m)
    • 根据属于质心的点来更新质心的值,即:
      \mu_{j}=\frac{\sum_{i=1}^{m}I(c^{(i)}=j)\cdot x^{(i)}}{\sum_{i=1}^{m}I(c^{(i)}=j)}, \quad j\in (1,k)
      其中,​为指示函数,即:
      I(c^{(i)},j)= \begin{cases} 1, &\text{if $c^{(i)}=j$}\\ 0, &\text{otherwise} \end{cases}

k-means存在的问题:

(1). 在最坏的情况下,k-means的时间复杂度是样本数量的超多项式(super-polynomial )

(2). k-means的聚类效果非常依赖于质心的初始值的选取

k-means++

k-means++可以很好的改善k-means对于质心初始值的依赖,k-means++的具体步骤如下:

  1. 从样本集X={x^{(i)},\cdots,x^{(m)}}中随机选择一个样本作为第一个质心\mu_{1}

  2. 从样本集中以概率p=\frac{D(x)^2}{\sum_{x\in X}D(x)^2}选取下一个质心\mu_{2}D(x)为样本x到质心\mu_{1}的距离。如此循环,直到完成所有的k个质心的选取。

  3. 剩下的步骤与k-means中的第二步一样:

    • 对每个样本,找到离其最近的质心,即:
      c_{(i)}=\mathop{argmin}\limits_{j}||x_{(i)}-\mu_{j}||^{2}, \quad i\in (1, m)
    • 根据属于质心的点来更新质心的值,即:
      \mu_{j}=\frac{\sum_{i=1}^{m}I(c^{(i)}=j)\cdot x^{(i)}}{\sum_{i=1}^{m}I(c^{(i)}=j)}, \quad j\in (1,k)

Refences:

  1. stanford cs229 lecture notes

  2. k-means++: The Advantages of Careful Seeding

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。