梯度下降和EM算法,kmeans的em推导

I. 牛顿迭代法
给定一个复杂的非线性函数f(x),希望求它的最小值,我们一般可以这样做,假定它足够光滑,那么它的最小值也就是它的极小值点,满足f′(x0)=0,然后可以转化为求方程f′(x)=0的根了。非线性方程的根我们有个牛顿法,所以

 

然而,这种做法脱离了几何意义,不能让我们窥探到更多的秘密。我们宁可使用如下的思路:在y=f(x)的x=xn这一点处,我们可以用一条近似的曲线来逼近原函数,如果近似的曲线容易求最小值,那么我们就可以用这个近似的曲线求得的最小值,来近似代替原来曲线的最小值

显然,对近似曲线的要求是:
1、跟真实曲线在某种程度上近似,一般而言,要求至少具有一阶的近似度;
2、要有极小值点,并且极小值点容易求解。

这样,我们很自然可以选择“切抛物线”来近似(用二阶泰勒展开近似原曲线):

 

该抛物线具有二阶的精度。对于这条抛物线来说,极值点是(-b/(2*a))

所以我们重新得到了牛顿法的迭代公式:

如果f(x)足够光滑并且在全局只有一个极值点,那么牛顿法将会是快速收敛的(速度指数增长),然而真实的函数并没有这么理想,因此,它的缺点就暴露出来了:

1、需要求二阶导数,有些函数求二阶导数之后就相当复杂了;
2、因为f″(xn)的大小不定,所以g(x)开口方向不定,我们无法确定最后得到的结果究竟是极大值还是极小值

 

II. 梯度下降

这两个缺点在很多问题上都是致命性的,因此,为了解决这两个问题,我们放弃二阶精度,即去掉f″(xn),改为一个固定的正数1/h:

这条近似曲线只有一阶精度,但是同时也去掉了二阶导数的计算,并且保证了这是一条开口向上的抛物线,因此,通过它来迭代,至少可以保证最后会收敛到一个极小值(至少是局部最小值)。上述g(x)的最小值点为

所以我们得到迭代公式

对于高维空间就是

这就是著名的梯度下降法了。当然,它本身存在很多问题,但很多改进的算法都是围绕着它来展开,如随机梯度下降等等。

这里我们将梯度下降法理解为近似抛物线来逼近得到的结果,既然这样子看,读者应该也会想到,凭啥我一定要用抛物线来逼近,用其他曲线来逼近不可以吗?当然可以,对于很多问题来说,梯度下降法还有可能把问题复杂化,也就是说,抛物线失效了,这时候我们就要考虑其他形式的逼近了。事实上,其他逼近方案,基本都被称为EM算法,恰好就只排除掉了系出同源的梯度下降法,实在让人不解。

根据一阶泰勒展开,对于一个可微函数,对于任意的x,有:

$ f(x+\alpha p)=f(x)+\alpha * g(x)*p+o(\alpha *\left| p \right|) $

其中:$ g(x)*p = \left| g(x) \right| *\left| p \right| *cos\theta $  ,$\theta$是两向量之间的夹角,p是搜索方向

当 $\theta $ 为180度得时候,$g(x)*p$ 可取到最小值,即为下降最快的方向。所以,负梯度方向为函数f(x)下降最快的方向,x为未知参数,对X进行迭代更新

如果f(x)是凸函数,则局部最优解就是全局最优解。

V. K-Means

K-Means聚类很容易理解,就是已知N个点的坐标xi,i=1,…,N,然后想办法将这堆点分为K类,每个类有一个聚类中心cj,j=1,…,K,很自然地,一个点所属的类别,就是跟它最近的那个聚类中心cj所代表的类别,这里的距离定义为欧式距离。
所以,K-Means聚类的主要任务就是求聚类中心cj。我们当然希望每个聚类中心正好就在类别的“中心”了,用函数来表示出来,就是希望下述函数L最小(kmeans目标函数是平方损失函数):

 

其中,min操作保证了每个点只属于离它最近的那一类。
如果直接用梯度下降法优化L,那么将会遇到很大困难,不过这倒不是因为min操作难以求导,而是因为这是一个NP的问题,理论收敛时间随着N成指数增长。这时我们也是用EM算法的,这时候EM算法表现为:
1、随机选K个点作为初始聚类中心;
2、已知K个聚类中心的前提下,算出各个点分别属于哪一类,然后用同一类的所有点的平均坐标,来作为新的聚类中心。

这种方法迭代几次基本就能够收敛了,那么,这样做的理由又在哪儿呢?

聚类问题:给定数据点x_1, x_2, \ldots, x_N \in \mathbb{R}^m,给定分类数目K,求出K个类中心\mu_1, \mu_2, \ldots, \mu_K \in \mathbb{R}^m,使得所有点到距离该点最近的类中心的距离的平方和\sum_{i=1}^N{\min_{1\le k \le K} ||x_i-\mu_k||_2^2}最小。

含隐变量的最大似然问题:给定数据点x_1, x_2, \ldots, x_N \in \mathbb{R}^m,给定分类数目K,考虑如下生成模型,

p(x,z|\mu_1, \mu_2, \ldots, \mu_K)\propto \begin{cases}  \exp\left(-\left|\left|{x-\mu_z}\right|\right|_2^2\right) & ||x-\mu_z||_2=\min_{1\le k \le K} ||x-\mu_k||_2\\  0 & ||x-\mu_z||_2>\min_{1\le k \le K} ||x-\mu_k||_2 \\  \end{cases}

模型中z\in\{1,2,\ldots,K\}为隐变量,表示簇的类别

这个式子的直观意义是这样的,对于某个将要生成的点x和类别号z,如果不满足“x到中心\mu_z的距离小于等于x到其他中心\mu_k的距离”的话,则不生成这个点。如果满足的话,则z取值就是这个“最近的”类中心的编号(如果有多个则均等概率随机取一个),以高斯的概率密度在这个类中心周围生成点x

用EM算法解这个含隐变量的最大似然问题就等价于用K-means算法解原聚类问题。

Q函数是完全数据的对数似然函数关于在给定X和参数$\mu$的情况下对隐变量Z的条件概率的期望,em算法通过求解对数似然函数的下界的极大值逼近求解对数似然函数的极大值。

这和K-means算法中根据当前分配的样本点求新的聚类中心的操作是一样的。


k-means是GMM的简化,而不是特例。 

共同点:都是使用交替优化算法,要优化的参数分为两组,固定一组,优化另一组。

  • GMM是先固定模型参数,优化\gamma(z_{nk}) ;然后固定\gamma(z_{nk}),优化\mu, \Sigma, \pi
  • k-means是先固定\mu(聚类中心),优化聚类赋值;然后固定聚类赋值,优化\mu

k-means对GMM的简化有:

  • \pi_k = 1/K,模型中混合权重相等
  • \Sigma_k = \epsilon I,各个成分的协方差相等,且固定为单位矩阵的倍数
  • x_n分配给各个component的方式,由基于概率变为winner-take-all方式的 hard 赋值。(kmeans中,某样本点和模型中某个子成分,如果该样本点与子成分的中心距离最小,则以高斯的概率密度在中心点周围生成这个点,否则就不生成这个点。而GMM中,每个子成分都有可能生成该样本点,概率值为子成分的系数)

所以说GMM是更为flexible的model,由于大量的简化,使得k-means算法收敛速度快于GMM,并且通常使用k-means对GMM进行初始化。

 

  

转自: 

http://spaces.ac.cn/archives/4277/

https://www.zhihu.com/question/49972233

转载于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/7274943.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring事务详解与使用

Spring事务核心对象 J2EE开发使用分层设计的思想进行,对于简单的业务层转调数据层的单一操作,事务开启在业务层或者数据层并无太大差别,当业务中包含多个数据层的调用时,需要在业务层开启事务,对数据层中多个操作进行组…

黑马程序员博学谷Java就业班课程

1、资料全无加密,可任意试看 2、内容包括课程资料 地址:https://www.boxuegu.com/class/outline-1112.html

设计模式一の设计模式详解

一、设计模式定义 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;…

Spring模板对象

Spring模块对象: 把共性的方法抽取出来固定为一个模板,后续再操作只需要填充内容即可。 比如:淘宝每次买东西都要填写地址,只是每次买的东西不一样,所以可以做一个默认地址,每次买东西都要去选商品就行了,不…

SpringMVC入门案例

SpringMVC 概述: SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 三层架构 表现层:负责数据展示业务层:负责业务处理数据层:负责数据操作 MVC(Model View Controller):一种用于设计创建…

SpringMVC请求中的普通、POJO、数组集合类型传参与类转换器

SpringMVC将传递的参数封装到处理器方法的形参中,达到快速访问参数的目的。 普通类型参数传参 参数名与处理器方法形参名保持一致 访问URL: http://localhost/requestParam1?nameitzhuzhu&age14 RequestMapping("/requestParam1")publi…

SpringMVC-HandlerInterceptor拦截器的使用与参数详解

拦截器概念: 拦截器( Interceptor)是一种动态拦截方法调用的机制,请求处理过程解析核心原理: AOP思想拦截器链:多个拦截器按照一定的顺序,对原始被调用功能进行增强 作用: 在指定的…

使用FindBugs-IDEA插件找到代码中潜在的问题

另一篇使用文档,参照:https://www.cnblogs.com/huaxingtianxia/p/6703315.html 我们通常都会在APP上线之后,发现各种错误,尤其是空指针异常,这些错误对于用户体验来说是非常不好的,但其实大部分的问题,我们都能够提前发现. 在编写代码的过程中,可能不会时…

霍炬:再谈百度:KPI、无人机,以及一个必须给父母看的案例

霍炬:再谈百度:KPI、无人机,以及一个必须给父母看的案例 作者:霍炬。 原文链接:http://www.donews.com/idonews/article/8147.shtm没想到我之前的一篇关于百度的文章引起了这么大的反馈。非常多朋友称赞我写的好&…

使用SpringMVC模拟文件上传与下载案例

文件上传下载 SpringMVC封装了Tomcat的上传文件功能 MultipartResolver接口 MultipartResolver接口定义了文件上传过程中的相关操作,并对通用性操作进行了封装MultipartResolver接口底层实现类CommonsMultipartResovlerCommonsMultipartResovler并未自主实现文件上…

JSR表单校验框架

表单校验的重要性: 表单校验保障了数据有效性、安全性 不适用表单检验数据可以随意输入,导致错误的结果。后端表单校验的重要性,比如输入框采集成绩,如果前端做了检验,但是用户比较牛逼,他在地址栏上直接加…

使用Phantom omni力反馈设备控制机器人

传统的工业机器人普遍采用电机 、齿轮减速器 、关节轴三者直接连接的传动机构,这种机构要求电机与减速器安装在机械臂关节附近,其缺点是对于多关节机械臂,下一级关节的电机与减速器等驱动装置成为上一级关节的额外负载 。这一额外负载带来的负…

Go_配置系统环境MacOS(M1)

在MacOS下和JDK一样,配不配环境其实MacOS都是可以检测的到的,安装好以后直接输入go version是一样可以的,因为都是使用开发工具的,在开发工具里配置的话是样的,如果有习惯的话就配置一下吧 下载安装及配置环境&#xf…

Go_数据类型

数据类型: 计算机存储设备最小信息单位是位(bit),最小的存储单元是字节(byte),占用字节的不同,所表示能存储的数据长度不同。数据类型用来说明数据的数据的结构,便于后面…

HashMap之扰动函数和低位掩码

我们都知道,hashMap在实现的时候,为了寻找在数组上的位置,主要做了两件事 int hash hash(key); int i indexFor(key, table.length); 这个时候得到i才是数组上的位置。 这两个方法详解如下 JDK8对扰动函数的修改,只进行了一次移…

NE2018届校招内推笔试——数据挖掘

【单选题|2分/题】 1、在只有两类的情况下,二维特征向量通过共享相同的协方差矩阵的正态分布生成,其中协方差矩阵为: 均值向量分别为:,则根据贝叶斯分类,样本分类为:() A…

不满足依赖关系

今晚上脑残,替换了实体,把报错的也都替换完成了,但是运行报错: 大概的意思就是说不满足XXXXXX依赖关系,但是找了半天都没有找到,最后是mapper的实体类全路径替换的时候,脑残在后面加上了.java。…

Go_切片(初始化、遍历、截取、修改、append、copy、切片作为函数参数、切片求和、切片求最大值)

切片: 切片的长度是不固定的,可以追加数据,可以理解是一个动态数组,切片的底层是一个结构体切片类型(slice)本身并不是动态数组或数组指针。它内部通过指针引用底层数组,设定相关属性将操作限定…

阿里巴巴Java开发手册——速读记录

本随笔基于阿里巴巴Java开发手册V1.2,陆陆续续记录一些现阶段能理解的,有启发的内容,并将持续更新 最佳实践——插件使用已经发布为随笔!http://www.cnblogs.com/jiangbei/p/7668654.html 一、编程规范 1.命名规范 (1&…

Go_指针的使用、数组指针和指针数组、指针与切片、指针与结构体、多级指针

指针: 指针是一个特殊的变量,因为它存储的数据是另一个变量的内存地址,指针本身也是有内存地址的指针的数据类型有int、float、bool、string、数组、结构体指针的作用就是可以通过变量/对象的内存地址去操作变量/对象 注意: 取址运…