KMeans是一种无监督的聚类模型(不熟悉的朋友可以看这篇博客),其中,模型的求解可以用EM算法实现
我们知道,KMeans的 $ Loss function $ 为
\[ J=\sum _{n=1}^N\sum _{k=1}^K r_{nk}||x_n - u_k||^2 \]
其中,$ K $ 为聚类中心数量, $ u_k $ 为每个聚类中心的向量表示
Estep
在KMeans中,Estep主要完成对数据集的划分,也就是确定这个数据“属于”哪个聚类中心。用更数学的语言表达就是
\[ r_{nk} = { \begin{cases} 1 & if \ k = argmin_j ||x_n - u_j||^2 \\ 0 & otherwise. \\ \end{cases} } \]
Mstep
Mstep主要完成对每个聚类中心的更新。对于 $ Loss function $ 简单求导便可知:
\[ u_k = \frac{\sum _n r_{nk}x_n}{\sum _n r_{nk}} \]
将Estep和Mstep不停地迭代,直到收敛~
代码如下: https://github.com/shiyi001/EM-Algorithm/tree/master/KMeans