回顾

前几篇对 k-means 有过理解和写了一版伪代码, 因为思想比较非常朴素, 就是初始化几个中心点, 然后通过计算距离的方式, "物以类聚", 不断迭代中心点, 最后收敛, (中心点不变化) 就搞定了, 代码也容易实现, 算法也基本不涉及数学, 感觉就是通用的全民入门算法. 跟 KNN 这种hello world 级别是一个等级, 简单易懂, 实用性高, 易实现.

而相对 EM 算法则有些难明白一些, 它涉及几个核心概念: 隐变量, 参数估计, 先验分布, 贝叶斯. 它所要解决的问题, 其实就是,当无法直接观测到总体参数时, 但有知道它是由其他隐含因子影响着的, 再此之下, 如何进行参数估计, 其实也就是咱当年学统计学中, 用样本来估计总体, 方法无非是,极大似然法, 全概率与贝叶斯, 高斯分布 这些基础知识而已.

为了说明EM算法, 显示以扔硬币 的小案例来直观认识 EM 算法的 E, M 步骤分别是做了什么事情, 从比较直观来看, 然后有引入高斯混合模型 来深刻推导了一波EM算法, 同时证明了EM算法的收敛性. 推导的难点在于, 如何去定义

E, M步骤, 然后技巧上是用了Jensen不等式, 并引入了 concave函数的特性(全局最优解), 过程其实就用到了高斯分布, 化简用的是全概率 与贝叶斯的关系, 也就是全概率, 联合分布, 条件概率..这些基础知识, 嗯. 总体来说还是不难的, 可能写代码实现有点小复杂, 后面试着整一整, 这里主要重点整透理论, 代码会copy 就差不多行了.

K-means 与 EM

其实, 不难发现, 高斯混合模型(Mixture of Gaussian) EM 算法与 K-means 是相似的. K-means 从 EM 视角来看,

  • Expectation : 每一个点赋值(概率为1)一个 cluster
  • Maximization: 更新每一个 cluster 的中心

由此可得到:K-means 算法其实是EM算法的一种特殊情况.

K-means 选择将一个数据点归为一个 cluster (概率100%, hard decision); 而 EM 算法选择将一个数据点看作是多个cluster (或分布) 的混合物(soft decision).

case: 人的气质类型

(补一下性格的本质: 是习惯, 习惯决定性格, 性格决定命运, 是有科学性滴)

记得以前学心理学的时候, 谈到气质类型的章节, 一种经典的体液分法(5世纪前), 认为人体有四种液体, 不同的体液比例混合形成了四种典型气质类型:

  • 多血质: 活泼, 敏感, 好动, 反应快, 喜欢交往...., 典型人物: 王熙凤, 姚明, 科比, 詹姆斯
  • 胆汁质: 直率, 热情, 冲动, 情绪化... 典型人物: 张飞, 鲁智深, 奥尼尔, 恩比德
  • 粘液质: 安静, 稳重, 反应慢, 沉默寡言, 善于忍耐, 典型人物: 鲁肃, 司马懿, 邓肯, 卡哇伊
  • 抑郁质: 孤僻, 行动迟缓, 体验深刻, 多愁善感, 善于察觉细节... 典型人物: 林黛玉, 罗斯

需求: 如何通过一个的性格(行为习惯) 来判断小陈同学的气质类型

  • K-means: 小陈同学比较孤僻, 沉默寡言, 总沉浸在自己的世界... 但偶尔也活泼好动..嗯, 就判定为抑郁型
  • EM: 综合来看, 小陈同学有 30%是多血的, 50%是粘液的, 抑郁, 胆汁各10%, 嗯...大概率, 偏向粘液质一点.

从偏理论来看

E-步骤

K-means 的 \(r_{nk}\) 判断每个样本属于对应的类别 k

def \(r_{nk}\) :

​ IF \(k = arg \ min_j \ ||x_n - u_k||^2\) :

​ return 1

​ ELSE:

​ return 0

就是逐个计算每个样本到各中心距离, 离哪个近,就归为该类, 复杂度是 O(kn)

就相当于咱之前推导高斯混合里面的 \(w_j^{(i)}\)

EM 的判别则为:

\(p^{(i)} (k|n) = \frac {p_k^{(i)} g(x_n; m_k^{(i)} \sigma_k^{(i)})}{\sum \limits _{m=1}^K p_k^{(i)} g(x_n; m_k^{(i)} \sigma_k^{(i)})}\)

就是一个全概率下的贝叶斯嘛.

def $P(k|n) $ :

​ IF \(k = arg \ max _s \ p(s| x_n, m_k, \sigma_k)\) :

​ return 1

​ ELSE:

​ return 0

M-步骤

K-means 就是在遍历完一轮后, 进行中心点的更新

\(\mu_k = \frac {\sum \limits _{n} r_{nk} x_n}{\sum \limits _{n} r_{nk}}\)

就是将当前该类别下的所有点, 加起来, 再求平均, 得到中心

EM 也是做一样的事情呀

\(m_k^{(i+1)} = \frac {\sum \limits _{n=1}^N p^{(i)}(k|n)x_n} {\sum \limits _{n=1}^N p^{(i)}(k|n)}\)

就到这里吧, 这篇主要是回忆和小结一波 k-means 和 EM算法, 感觉EM算法整明白了对自信心提升还是蛮大的, 因为它涉及概率分布, 参数估计, 最大似然, 贝叶斯等, 这些都是概率论的核心知识点呀, 是需要一定功力的哦.

K-means 和 EM 比较的更多相关文章

  1. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  2. 软件——机器学习与Python,聚类,K——means

    K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...

  3. Andrew Ng机器学习公开课笔记 -- Mixtures of Gaussians and the EM algorithm

    网易公开课,第12,13课 notes,7a, 7b,8 从这章开始,介绍无监督的算法 对于无监督,当然首先想到k means, 最典型也最简单,有需要直接看7a的讲义   Mixtures of G ...

  4. Weka中EM算法详解

    private void EM_Init (Instances inst) throws Exception { int i, j, k; // 由于EM算法对初始值较敏感,故选择run k mean ...

  5. 快速查找无序数组中的第K大数?

    1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高 ...

  6. 高斯混合模型参数估计的EM算法

    # coding:utf-8 import numpy as np def qq(y,alpha,mu,sigma,K,gama):#计算Q函数 gsum=[] n=len(y) for k in r ...

  7. 网络费用流-最小k路径覆盖

    多校联赛第一场(hdu4862) Jump Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. numpy.ones_like(a, dtype=None, order='K', subok=True)返回和原矩阵一样形状的1矩阵

    Return an array of ones with the same shape and type as a given array. Parameters: a : array_like Th ...

  9. 当我们在谈论kmeans(2)

        本稿为初稿,后续可能还会修改:如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/ 其他:建设中- 当我们在谈论kmeans(2 ...

  10. 当我们在谈论kmeans(3)

        本系列意在长期连载分享,内容上可能也会有所删改: 因此如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/(暂时公式显示有问题) ...

随机推荐

  1. Tomcat下载教程

    首先确定你Windows系统是64位,还是32位(现在大部分是64位) 查看操作系统位数步骤:(WindowsXP,Windows7,Windows8,Windows10查看步骤大同小异,举例Wind ...

  2. linux学习(三)系统目录结构

    登录系统后,在当前命令窗口下输入命令: ls / 你会看到如下图所示: 树状目录结构: 以下是对这些目录的解释: /bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令. /boot: ...

  3. 201271050130-滕江南-《面向对象程序设计(java)》第十二周学习总结

    201271050130-滕江南-<面向对象程序设计(java)>第十二周学习总结 项       目 内      容 这个作业属于哪个课程 https://www.cnblogs.co ...

  4. [C8] 聚类(Clustering)

    聚类(Clustering) 非监督学习:简介(Unsupervised Learning: Introduction) 本章节介绍聚类算法,这是我们学习的第一个非监督学习算法--学习无标签数据,而不 ...

  5. C++ class 外的 ++ 重载,左++,右++,重载示例。

    #include <iostream> // overloading "operator ++ " outside class // ++ 是一元操作符 /////// ...

  6. 题解:swj社会摇基础第一课

    题目链接 思路:dp,f[i]表示构成i所需要的最小步数 //swj么么哒 #include<bits/stdc++.h> using namespace std; int n; cons ...

  7. MySQL实战45讲学习笔记:第三十七讲

    一.本节概况 今天是大年初二,在开始我们今天的学习之前,我要先和你道一声春节快乐! 在第 16和第 34篇文章中,我分别和你介绍了 sort buffer.内存临时表和 join buffer.这三个 ...

  8. 基于Django的Rest Framework框架的认证组件

    0|1一.认证组件的作用 在一个程序中有一些功能是需要登录才能使用的,原生Django中的auth组件可以用来解决这个认证问题,drf框架中也有对应的认证组件来解决这个问题. models.py   ...

  9. ubuntu / zsh shell / oh-my-zsh / 常用插件

    记录一下 zsh 的下载与配置,省得每次重装系统都要上网到处查. 安装 zsh shell sudo apt install zsh 切换 shell chsh -s /bin/zsh 安装 oh-m ...

  10. 【shell脚本】定时备份数据库===dbbackup.sh

    定时备份数据库是很有必要的 一.脚本内容 [root@localhost dbbackup]# cat dbbackup.sh #!/bin/bash #备份数据库 mysqldump -uroot ...