不多说,直接上干货!

  面试很容易被问的:K-Means算法的收敛性

  在网上查阅了很多资料,并没有看到很清晰的解释,所以希望可以从K-Means与EM算法的关系,以及EM算法本身的收敛性证明中找到蛛丝马迹,下次不要再掉坑啊。

EM算法的收敛性

1.通过极大似然估计建立目标函数:

通过EM算法来找到似然函数的极大值,思路如下:
希望找到最好的参数θ,能够使最大似然目标函数取最大值。但是直接计算 比较困难,所以我们希望能够找到一个不带隐变量z的函数恒成立,并用

逼近目标函数。

如下图所示:

  • 在绿色线位置,找到一个γγ函数,能够使得该函数最接近目标函数

    •   固定γγ函数,找到最大值,然后更新θθ,得到红线;
  • 对于红线位置的参数θ:

    •   固定θθ,找到一个最好的函数γγ,使得该函数更接近目标函数。
        重复该过程,直到收敛到局部最大值。

2. 从Jensen不等式的角度来推导

是zz的一个分布,,则:

(对于log函数的Jensen不等式)

3.使等号成立的Q

  尽量使≥≥取等号,相当于找到一个最逼近的下界:也就是Jensen不等式中,当且仅当x1=x2x1=x2时等号成立(很关键)

对于EM的目标来说:应该使得loglog函数的自变量恒为常数,即:

也就是分子的联合概率与分母的z的分布应该成正比,而由于Q是z的一个分布,所以应该保证

4.EM算法的框架

由上面的推导,可以得出EM的框架:

回到最初的思路,寻找一个最好的γγ函数来逼近目标函数,然后找γγ函数的最大值来更新参数θθ:

  • E-step: 根据当前的参数θθ找到一个最优的函数γγ能够在当前位置最好的逼近目标函数;
  • M-step: 对于当前找到的γγ函数,求函数取最大值时的参数θθ的值。

K-Means的收敛性

  通过上面的分析,我们可以知道,在EM框架下,求得的参数θθ一定是收敛的,能够找到似然函数的最大值。那么K-Means是如何来保证收敛的呢?

目标函数

  假设使用平方误差作为目标函数:

E-Step

  固定参数μkμk, 将每个数据点分配到距离它本身最近的一个簇类中:

M-Step

  固定数据点的分配,更新参数(中心点)μkμk:

  所以,答案有了吧。为啥K-means会收敛呢?目标是使损失函数最小,在E-step时,找到一个最逼近目标的函数γγ;在M-step时,固定函数γγ,更新均值μμ(找到当前函数下的最好的值)。所以一定会收敛了.

如何快速收敛超大的KMeans?

  最近,被一个牛人问道了这个问题:超亿个节点,进行KMeans的聚类,每次迭代都要进行K×亿的运算,如何能让这个迭代快速的收敛?

  当场晕倒,从来没有考虑过这些问题,基础的数据挖据算法不考虑超大级别的运算问题。

  回来想了想,再看看Mahout的KMeans的实现方法,觉得可以这么解决.

  1. 第一次迭代的时候,正常进行,选取K个初始点,然后计算所有节点到这些K的距离,再分到不同的组,计算新的质心;

  2. 后续迭代的时候,在第m次开始,每次不再计算每个点到所有K个质心的距离,仅仅计算上一次迭代中离这个节点最近的某几个(2到3)个质心的距离,决定分组的归属。对于其他的质心,因为距离实在太远,所以归属到那些组的可能性会非常非常小,所以不用再重复计算距离了。

  3. 最后,还是用正常的迭代终止方法,结束迭代。

这个方法中,有几个地方需要仔细定义的。

  第一,如何选择m次? 过早的话,后面的那个归属到远距离组的可能性会增加;过晚,则收敛的速度不够。

  第二,如何选择最后要比较的那几个质心点数?数量过多则收敛的速度提高不明显,过少则还是有可能出现分组错误。

这两个问题应该都没有标准答案,就如同K值的选取。我自己思考的基本思路可以是:

  1. 从第三次开始就开始比较每次每个质心的偏移量,亦即对于收敛的结束的标准可以划分两个阈值,接近优化的阈值(比如偏移范围在20%)和结束收敛的阈值(比如偏移范围在10%以内)。m次的选择可以从达到接近优化的阈值开始。

  2. 选择比较的质心点数可以设定一个阈值,比较一个点到K个质心的距离,排序这些距离,或者固定选取一个数值,比如3个最近的点,或者按最近的20%那些质心点。

  这些就是基本的思路。欢迎大家讨论。

K-Means算法的收敛性和如何快速收敛超大的KMeans?的更多相关文章

  1. KNN 与 K - Means 算法比较

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

  2. 再论EM算法的收敛性和K-Means的收敛性

    标签(空格分隔): 机器学习 (最近被一波波的笔试+面试淹没了,但是在有两次面试时被问到了同一个问题:K-Means算法的收敛性.在网上查阅了很多资料,并没有看到很清晰的解释,所以希望可以从K-Mea ...

  3. K-means算法

    K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?  ...

  4. 聚类分析K均值算法讲解

    聚类分析及K均值算法讲解 吴裕雄 当今信息大爆炸时代,公司企业.教育科学.医疗卫生.社会民生等领域每天都在产生大量的结构多样的数据.产生数据的方式更是多种多样,如各类的:摄像头.传感器.报表.海量网络 ...

  5. 02机器学习实战之K近邻算法

    第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...

  6. [ML从入门到入门] 支持向量机:从SVM的推导过程到SMO的收敛性讨论

    前言 支持向量机(Support Vector Machine,SVM)在70年代由苏联人 Vladimir Vapnik 提出,主要用于处理二分类问题,也就是研究如何区分两类事物. 本文主要介绍支持 ...

  7. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

  8. <转>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...

  9. K中心点算法之PAM

    一.PAM聚类算法:         选用簇中位置最中心的对象,试图对n个对象给出k个划分:代表对象也被称为是中心点,其他对象则被称为非代表对象:最初随机选择k个对象作为中心点,该算法反复地用非代表对 ...

随机推荐

  1. 170704、springboot编程之CommandLineRunner

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...

  2. Python开发【笔记】:git&github 快速入门

    github入门 简介: 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了. Linus虽然创建了Linux,但Linux的壮大 ...

  3. Python开发【模块】:Concurrent

    concurrent 模块 回顾: 对于python来说,作为解释型语言,Python的解释器必须做到既安全又高效.我们都知道多线程编程会遇到的问题,解释器要留意的是避免在不同的线程操作内部共享的数据 ...

  4. django2.0集成xadmin0.6报错集锦

    1.django2.0把from django.core.urlresolvers修改成了django.urls 报错如下: 1 2 3   File "D:\Envs\django-xad ...

  5. python中的下划线(私有变量)

    Python用下划线作为变量前缀和后缀指定特殊变量. - "单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量:不能用"from xx ...

  6. 锁、volatile、CAS 比较

    一.锁的劣势 (1) 在JDK1.5之前都是使用synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有守 护变量的锁,都采用独占的方式来访 ...

  7. 【Python】通过python代码实现demo_test环境的登录,通过csv/txt/excel文件批量添加课程并开启课程操作--(刚开始 项目 页面 模块 元素这种鸟 被称作pageobject 等这些搞完 然后把你的定位器、数据 和脚本在分离 就是传说中那个叫数据驱动 的鸟)

    一.1.通过csv文件批量导入数据 1 from selenium import webdriver from time import ctime,sleep import csv #循环读取每一行每 ...

  8. mysql主从复制(简单直观)

    mysql主从复制   mysql主从复制(超简单) 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作:  1.1.版本一致  1.2.初始化表,并在后 ...

  9. java-mybaits-009-mybatis-spring-使用,SqlSessionFactoryBean、事务

    一.版本限制 参看地址:http://www.mybatis.org/spring/ 二.使用入门 2.1.pom <dependency> <groupId>org.myba ...

  10. 关于RxJava背压

    http://flyou.ren/2017/04/05/%E5%85%B3%E4%BA%8ERxJava%E8%83%8C%E5%8E%8B/?utm_source=tuicool&utm_m ...