zoukankan      html  css  js  c++  java
  • EM算法(1):K-means 算法

    目录

    EM算法(1):K-means 算法

    EM算法(2):GMM训练算法

    EM算法(3):EM算法运用

    EM算法(4):EM算法证明

              

                     EM算法(1) : K-means算法

    1. 简介

      K-means算法是一类无监督的聚类算法,目的是将没有标签的数据分成若干个类,每一个类都是由相似的数据组成。这个类的个数一般是认为给定的。

     

    2. 原理

      假设给定一个数据集$mathbf{X} = {mathbf{x}_1, mathbf{x}_2,...,mathbf{x}_N }$, 和类的个数K。我们的每个类都用一个中心点$mu_k$表示。每个数据集都应该被归为某一个类,那么我们定义$r_{nk}$:如果$mathbf{x}_n$属于类k,则$r_{nk}$=1;如果$mathbf{x}_n$不属于类k,则$r_{nk}$=0。那么我们就可以定义一个误差函数$mathbf{J}$:

              $mathbf{J} = sum_nsum_kr_{nk}||mathbf{x}_n - mu_k||^2$

      误差函数直观理解为每个数据点离自己类的中心点的距离之和。那么我们的目标就是 min $mathbf{J}$。我们发现,$mathbf{J}$中$r_{nk}$和$mu_k$都是未知的,直接求导的话没有闭式解。所以我们需要换一个方法,这就是所谓的k-keans算法。

      k-means算法分为两步。第一步,假设各个类的中心$mu_k$已知,那么所有$r_{nk}$都可以求出,计算方法采取最近邻原则,即

              $r_{nk} = 1$  if  $k = arg min_j||mathbf{x}_n - mu_j||^2$              (1)   

              $r_{nk} = 0$  otherwise                        (2)

      第二步,假设所有$r_{nk}$都已知,将$mathbf{J}$对$mu_k$求导等于零,那么:

              $frac{partialmathbf{J}}{partialmu_k}$ = $2sum_nr_{nk}(mathbf{x}_n-mu_k)$ = 0

      那么很容易得到$mu_k$的闭式解:

              $mu_k = frac{sum_nr_{nk}mathbf{x}_n}{sum_nr_{nk}}$

      k-means有更通俗的解释,第一步其实是给每个数据点都分类,分类方法采取最近邻原则;第二步是根据分类的结果,将中心点重新计算,计算方式为类中所有点的中心点。

    3. 与EM算法的关系

      这就是为什么在EM算法系列中我们要讲k-means算法的原因:k-means是最简单的EM算法。EM算法全称为Expectation-Maximization algorithm。其也是分为两步,第一步叫Expectation,第二步叫Maximization。

      EM算法取名是有其意义的,比如第一步Expectation,顾名思义就是计算期望。那么在k-means算法中,第一步计算$r_{nk}$其实是计算Expectation的一步。$r_{nk}$可以看做是$mathbf{x}_n$属于各个类的概率,只不过它们取值只有0和1,但也符合概率的定义。那么$mathbf{x}_n$ 的误差期望就是:$sum_kr_nk||mathbf{x}_n - mu_k||^2$。那么所有点的误差期望之和为:

              $sum_nsum_kr_{nk}||mathbf{x}_n-mu_k||^2$

      我们可以发现,这其实就是k-means算法中的$mathbf{J}$。

      EM算法第二步就是对求得的期望求最值。那么在k-means算法中,第二步对$mathbf{J}$求导等于零其实就是在求最值,这也正好对应EM算法的第二步。所以我们可以看到,其实k-means就是EM算法的一种。

      我们知道,用平方和来计算误差其实就是隐性假设原数据服从高斯分布,那么后续我们会看到,我们用EM算法和高斯分布,也能推导出k-means算法。

  • 相关阅读:
    随笔
    随笔
    第一个存储过程
    mysql 存储过程
    join
    随笔
    玩家注册登录
    mysql 存储二进制数据
    mysql学习
    socket listen/accept
  • 原文地址:https://www.cnblogs.com/ccienfall/p/6213072.html
Copyright © 2011-2022 走看看