zoukankan      html  css  js  c++  java
  • K-means 和 EM 比较

    回顾

    前几篇对 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算法整明白了对自信心提升还是蛮大的, 因为它涉及概率分布, 参数估计, 最大似然, 贝叶斯等, 这些都是概率论的核心知识点呀, 是需要一定功力的哦.

  • 相关阅读:
    java.sql.SQLException: Access denied for user 'root'@'10.1.0.2' (using password: YES)
    在eclipse中安装使用lombok插件
    Socket编程实践(5) --TCP粘包问题与解决
    Socket编程实践(8) --Select-I/O复用
    Socket编程实践(6) --TCP服务端注意事项
    Socket编程实践(4) --多进程并发server
    Socket编程实践(3) --Socket API
    Socket编程实践(2) --Socket编程导引
    Socket编程实践(1) --TCP/IP简述
    Socket编程实践(11) --epoll原理与封装
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/12078473.html
Copyright © 2011-2022 走看看