python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是许多机械学习领域的基础,好比隐式马尔科夫算法(HMM),LDA主题模子的变分推断算法等等。本文对于EM算法,我们主要从以下三个偏向学习:

  • 1,最大似然
  • 2,EM算法头脑及其推导
  • 3,GMM(高斯夹杂模子)

1,最大似然概率

  我们经常会从样本考察数据中,找到样本的模子参数。最常用的方式就是极大化模子漫衍的对数似然函数。怎么明了呢?下面看我逐一道来。

  假设我们需要观察我们学习的男生和女生的身高漫衍。你会怎么做啊?你说那么多人不能能一个一个的去问吧,一定是抽样了。假设你在校园随便捉了100个男生和100个女生。他们共200小我私家(也就是200个身高的样本数据,为了利便示意,下面我们说的“人”的意思就是对应的身高)都在课堂了。那么下一步怎么办?你最先喊:“男的左边,女的右边”,然后就统计抽样获得的100个男生的身高。假设他们的身高是遵守高斯漫衍的。然则这个漫衍的均值 μ 和方差 σ2 我们不知道,这两个参数就是我们要估量的。记做 θ = [ μ,   δ ] T

  用数学的语言来说就是:在学校那么多男生(身高)中,我们自力地凭据概率密度 p(x | θ) ,我们知道了是高斯漫衍 N(μ,   δ)的形式,其中的未知参数是 θ = [ μ,   δ ] T 。抽到的样本集是 X={X1, X2, X3…..Xn},其中 Xi 示意抽到的第 i 小我私家的身高,这里的 N 就是100,示意抽到的样本个数。

  由于每个样本都是自力地从 p(x | θ)  中抽取的,换句话说这 100 个男生中的任何一个,都是随便抽取的,从我们的角度来看这些男生之间是没有关系的。那么,我们从学习这么多男生中为什么正好抽到了这 100小我私家呢?抽到这 100 小我私家的概率是多少呢?由于这些男生(的身高)是遵守同一个高斯漫衍 p(x | θ)的。那么我们抽到男生A(的身高)的概率是 p(xA | θ),抽到男生B的概率是 p(xB | θ),那由于他们是自力的,以是很显著,我们同时抽到男生A和男生B的概率是 p(xA | θ) * p(xB | θ),同理,我同时抽到这 100 个男生的概率就是他们各自概率的乘积了。用数学家的口吻说就是从漫衍是 p(x | θ) 的总体样本中抽取到这 100 个样本的概率,也就是样本集 X 中各个样本的团结概率,用下式示意:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   这个概率反映了,在概率密度函数的参数是 θ 时,获得 X 这组样本的概率。由于这里 X 是已知的,也就是说我抽取到这100小我私家的身高是可以测出来的,也就是已知的。而 θ 是未知的,则上面这个公式只有 θ 是未知的,以是他是关于 θ 的函数。这个函数反映的是在差异的参数 θ 的取值下,取得当前这个样本集的可能性,因此称为参数 θ 相对于样本集 X 的似然函数(likehood  function),记为 L(θ)。

  这里泛起了一个观点,似然函数。还记得我们的目的吗?我们需要在已经抽到这一组样本X的条件下,估量参数  θ 的值。怎么估量呢?似然函数有什么用呢?我们下面先领会一下似然的观点。

  直接举个例子:

    某位同砚与一位猎人一起外出狩猎,一只野兔从前方窜过。只听一声枪响,野兔应声倒下,若是要你推测,这一发掷中的子弹是谁打的?你就会想,只发一枪便打中,由于猎人掷中的概率一样平常大于这位同砚掷中的概率,以是这一枪应该是猎人射中的。

  这个例子所作的推断就体现了极大似然法的基本头脑。下面再说一个最大似然估量的例子。

  再例如:假设你去赌场了,然则不知道能不能赚钱,你就在门口堵着出来,出来一小我私家你就问人家赚钱照样赔钱,若是问了五小我私家,假设五小我私家都说自己赚钱了,那么你就会以为,赚钱的概率一定是非常大的。

  从上面两个例子,你获得了什么结论?

  总的来说:极大似然估量就是估量模子参数的统计学方式

  回到男生身高的例子。在学校那么多男生中,我一抽就抽到这 100 个男生(示意身高),加入不是其他人,那是不是示意在整个学校中,这 100 小我私家(的身高)泛起的概率最大啊,那么这个概率怎么示意呢?就是上面谁人似然函数 L(θ)。以是我们就只需要找到一个参数 θ ,其对应的似然函数 L(θ) 最大,也就是说抽到这 100 个男生(的身高)的概率最大,这个叫做 θ 的最大似然估量量,记为:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   有时,可以看到 L(Θ) 是连乘的,以是为了便于剖析,还可以界说对数似然函数,将其变为连加的:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   现在我们知道了,要求出 Θ ,只需要使 Θ 的似然函数 L(Θ) 极大化,然后极大值对应的 Θ 就是我们的估量。这里就回到了求最值的问题了。怎么求一个函数的最值?固然是求导,然后令导数为零,那么解这个方程获得的 Θ  就是了(条件是函数L(Θ)延续可微)。那若是 Θ 是包罗多个参数的向量,那么若何处置呢?固然是求 L(Θ) 对所有参数的偏导数,也就是梯度了,那么 n 个未知的参数,就有 n 个方程,方程组的解就是似然函数的极值点了,固然就获得了这 n 个参数了。

  最后使用PPT整理一下,更直观:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  以是,实在最大似然估量你可以把它看做是一个反推。多数情形下我们是凭据已知条件来推断效果,而最大似然估量是已经知道了效果,然后寻找使该效果泛起的可能性最大的条件,以此作为估量值。好比,若是其他条件一定的话,吸烟者发生肺癌的危险是不吸烟者的五倍,那么若是我们知道有小我私家是肺癌,我想问你这小我私家是吸烟照样不吸烟。你若何判断,你可能对这小我私家一无所知,你所知道的只有一件事,那就是吸烟更容易发生肺癌,那么你会展望这小我私家不吸烟吗?我相信你更可能会说,这小我私家吸烟,为什么?这就是“最大可能”,我只能说他“最有可能”是吸烟的,“他是吸烟的”这一估量才是“最有可能”获得“肺癌” 这样的效果,这就是最大似然估量。

  总结一下:极大似然估量,只是概率论在统计学的应用,它是参数估量的方式之一。说的是已知某个随机样本知足某种概率漫衍,然则其中详细的参数不清楚,参数估量就是通过若干次实验,考察其效果,行使效果推出参数的也许值。最大似然估量是确立在这样的头脑上:已知某个参数能使这个样本泛起的概率最大,我们固然不会再去选择其他小概率的样本,以是爽性把这个参数作为估量的真实值。

  而求最大似然估量值的一样平常步骤

  • 1,写出似然函数
  • 2,对似然函数取对数,并整理
  • 3,求导数,令导数为0,获得似然方程
  • 4,解似然方程,获得的参数即为所求

2,EM算法要解决的问题

  上面说到,通过样本考察数据中,找到样本的模子参数。然则在一些情形下,我们获得的考察数据有未考察到的隐含数据,此时我们未知的有隐含数据和模子参数,因而无法直接用极大化对数似然函数获得模子漫衍的参数。怎么办呢?这就是EM算法可以派上用场的地方了。

  下面,我们重新回到上面谁人身高漫衍估量的问题。现在,通过抽取获得的那100个男生的身高和已知的其身高遵守高斯漫衍,我们通过最大化其似然函数,就可以获得了对应高斯漫衍的参数 θ = [ μ,   δ ] T 了。那么,对于我们学习的女生的身高漫衍也可以用同样的方式获得了。

  再回到例子自己,若是没有“男的左边,女的右边”这个步骤,或者说这二百小我私家已经混到一起了,这时刻,你从这二百小我私家(的身高)内里随便给我指一小我私家(的身高),我都无法确定这个的身高是男生的身高,照样女生的身高。也就是说你不知道抽取的那二百小我私家内里的每一小我私家到底是从男生的谁人身高漫衍内里抽取的,照样女生的谁人身高漫衍抽取的。用数学的语言就是:抽取的每个样本都不知道是从谁人漫衍抽取的

  这个时刻,对于每一个样本或者你抽取到的人,就有两个器械需要展望或者估量的了,一是这小我私家是男生照样女的?二是男生和女生对应的身高的高斯漫衍的参数是多少

  以是问题就难了。

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  只有当我们知道了那些人属于同一个高斯漫衍的时刻,我们才气够对这个漫衍的参数做出靠谱的展望,例如刚最先的最大似然所说的,但现在两种高斯漫衍的人混在一块了,我们又不知道那些人属于第一个高斯漫衍,那些人属于第二个,以是就没法估量这两个漫衍的参数。反过来,只有当我们对这两个漫衍的参数做出了准确的估量的时刻,才气知道到底那些人属于第一个漫衍,那些人属于第二个漫衍。

  这就成了一个先有鸡照样先有蛋的问题了。鸡说,没有我,谁把你生出来的啊。蛋不平,说,没有我你从哪蹦出来的啊。为领会决这个你依赖我,我依赖你的循环依赖问题,总得有一方要先打破僵局,说,不管了,我先随便整一个值出来,看你怎么变,然后我再凭据你的变换调整我的变换,然后云云迭代着不停相互推导,最终就会收敛到一个解,这就是EM算法的基本头脑了。

  不知道大家能明了其中的头脑吗,然后再举个例子。

  例如小时刻,老妈给一大袋子糖果给你,叫你和你姐姐平分,然后你懒得去点糖果的个数,以是你也就不知道每小我私家到底该分多少个,咱们一样平常怎么做呢?先把一袋糖果目测的分为两袋,然后把两袋糖果拿在左右手,看谁人重,若是右手重,那么很显著右手这袋糖果多了,然后你再在右手这袋糖果中抓一把放到左手这袋,然后再感受下谁人重,然后再从重的那袋抓一小把放入轻的那一袋,继续下去,直到你感受两袋糖果差不多相等了为止。然后为了体现公正,你还让你姐姐先选。

  EM算法就是这样,假设我们想估量A和B两个参数,在最先状态下二者都是未知的,但若是知道了A的信息就可以获得B的信息,反过来知道了B也就获得了A。可以思量首先赋予A某种初值,以此获得B的估量值,然后从B的当前值出发,重新估量A的取值,这个历程一直连续到收敛为止。

   EM 的意思是“Expectation  Maximization”,在我们上面这个问题内里,我们先随便猜一下男生(身高)的正态漫衍的参数:如均值和方差。例如男生的均值是1米7,方差是 0.1 米(固然了,刚最先一定没有那么准),然后盘算出每小我私家更可能属于第一个照样第二个正态漫衍中的(例如,这小我私家的身高是1米8,那很显著,他最大可能属于男生的谁人漫衍),这个是属于Expectation 一步。有了每小我私家的归属,或者说我们已经也许地按上面的方式将这 200 小我私家分为男生和女生两部门,我们就可以凭据之前说的最大似然那样,通过这些被也许分为男生的 n 小我私家来重新估量第一个漫衍的参数,女生的谁人漫衍同样方式重新估量。这个就是 Maximization。然后,当我们更新了这两个漫衍的时刻,每一个属于这两个漫衍的概率又变了,那么我们就再需要调整 E 步、…. 云云往复,直到参数基本不再发生转变为止。

  这里把每小我私家(样本)的完整形貌看做是三元组  yi = {xi,  zi1,  zi2},其中, xi 是第 i 个样本的观察值,也就是对应的这小我私家的身高,是可以观察到的值。zi1和zi2示意男生和女生这两个高斯漫衍中哪个被用来发生值 xi,就是说这两个值符号这小我私家到底是男生照样女生(的身高漫衍发生的)。这两个值我们是不知道的,是隐含变量。确切的说, zij 在 xi 由第 j个高斯漫衍发生时值为1,否则为0。例如一个样本的观察值为 1.8,然后他来自男生的谁人高斯漫衍,那么我们可以将这个样本示意为 {1.8,  1, 0}。若是 zi1 和 zi2的值已知,也就是说每小我私家我已经符号为男生或者女生了,那么我们就可以行使上面说的最大似然算法来估量他们各自高斯漫衍的参数。然则他们未知,以是我们只能用 EM算法。

  咱们现在不是由于谁人恶心的隐含变量(抽取获得的每隔样本都不知道是谁人漫衍抽取的)使得原本简朴的可以求解的问题变庞大了,求解不了吗。那怎么办呢?人类解决问题的思绪都是想能否把庞大的问题简朴化。好,那么现在把这个庞大的问题逆回来,我假设已经知道这个隐含变量了,哎,那么求解谁人漫衍的参数是不是很容易了,直接按上面说的最大似然估量就好了。那你就问我了,这个隐含变量是未知的,你怎么就来一个假设说已知呢?你这种假设是没有依据的。以是我们可以先给这个漫衍弄一个初始值,然后求这个隐含变量的期望,当成是这个隐含变量的已知值,那么现在就可以用最大似然求解谁人漫衍的参数了吧,那假设这个参数比之前的谁人随机的参数要好,它更能表达真实的漫衍,那么我们再通过这个参数确定的漫衍去求这个隐含变量的期望,然后再最大化,获得另一个更优的参数,…迭代,就能获得一个皆大欢喜的效果了。

  这里最后总结一下EM算法的思绪:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   以是EM算法解决问题的思绪就是使用启发式的迭代方式,既然我们无法直接求出模子漫衍参数,那么我们可以先料想隐含数据(EM算法的E步),接着基于考察数据和展望的隐含数据一起来极大化对数似然,求解我们的模子参数(EM算法的M步)。由于我们之前的隐藏数据是展望的,以是此时获得的模子参数一样平常还不是我们想要的效果。不外没关系,我们基于当前获得的模子参数,继续展望隐含数据(EM算法的E步),然后继续极大化对数似然,求解我们的模子参数(EM算法的M步)。以此类推,不停的迭代下去,直到模子漫衍参数基本无转变,算法收敛,找到合适的模子参数。

  下面再看看本文中EM算法最后一个例子:抛硬币

  Nature Biotech在他的一篇EM tutorial文章《Do, C. B., & Batzoglou, S. (2008). What is the expectation maximization algorithm?. Nature biotechnology, 26(8), 897.》中,用了一个投硬币的例子来讲EM算法的头脑。
  好比两枚硬币A和B,若是知道每次抛的是A照样B,那可以直接估量(见下图a)。

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法
  若是不知道抛的是A照样B(这时就刺激了吧,对的,这就是咱们不知情的隐变量),只观察到5轮循环每轮循环10次,共计50次投币的效果,这时就没法直接估量A和B的正面概率。这时,就轮到EM算法进场了(见下图b)。
python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   可能直接看,这个例子欠好懂,下面我们来通俗化这个例子。

  照样两枚硬币A和B,假定随机投掷后正面朝上概率划分为PA,PB。我们就不抛了,直接使用上面的效果,每一轮都是抛10次,总共5轮:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   硬币A被抛了30次,在第二轮,第三轮,第五轮划分泛起了9次,8次,7次正,以是很容易估量出PA,类似的PB 也很容易盘算出来,如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   然则问题来了,若是我们不知道抛的硬币是A照样B呢(即硬币种类是隐变量),然后再轮流抛五次,获得如下的效果呢?

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   下面问题变得有意思了,现在我们的目的照样没有变,照样估量PA和PB,需要怎么做呢?

思绪如下

  显然这里我们多了一个硬币种类的隐变量,设为 z,可以把它看做一个10维的向量(z1, z2, …z10),代表每次投掷时所使用的硬币,好比z1,就代表第一轮投掷时使用的硬币是A照样B。

  • 然则,这个变量Z不知道,就无法去估量PA和PB,以是我们先必须估量出Z,然后才气进一步估量PA和PB。
  • 可是要估量Z,我们又得知道PA和PB,这样我们才气用极大似然概率法去估量Z,这不是前面提的鸡生蛋和蛋生鸡的问题吗,若何解?

  谜底就是先随机初始化一个PA和PB,用它来估量Z,然后基于Z,照样凭据最大似然概率规则去估量新的PA和PB,若是新的PA和PB和我们初始化的PA和PB一样,叨教这说明了什么?

  这说明我们初始化的PA和PB是一个相当靠谱的估量!

  这就是说,我们初始化的PA和PB,凭据最大似然概率就可以估量出Z,然后基于Z,凭据最大似然概率可以反过来估量出P1和P2,当与我们初始化的PA和PB一样时,说明是P1和P2很可能就是真实的值。这里包罗了两个交互的最大似然估量。

  若是新估量出来的PA和PB和我们初始化的值差异很大,怎么办呢?就是继续用新的P1和P2迭代,直至收敛。

做法如下

  我们不妨,这样,先随便给PA和PB赋一个值,好比:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  以是我们的初始值 theta 为:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   然后,我们看看第一轮投掷最可能是哪个硬币,(五正五负):

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  实在上式很简朴就是:PA= 0.6*0.6*0.6*0.6*0.6*0.4*0.4*0.4*0.4*0.4 = 0.0007962624000000002(后面类似)

     PB= 0.5**10 = 0.0009765625

  然后求出选择PA的概率和PB的概率值

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   然后依次求出其他四轮中响应的概率。做成表格如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   然后我们通过上面的概率值来估量Z,也许是这样的:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   这样我们通过最大似然估量规则就估算出来PA和PB的值了,如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   然后我们再次迭代,继续估算,假设我们估算到第10次,就算出PA和PB的值是准确的了,如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  下面我们来对比初始化的PA和PB和新估量的PA和PB,和最终的PA和PB:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   我们可以发现,我们估量的PA和PB相比于他们的初始值,更靠近于他们的真实值,就这样不停迭代,不停靠近真实值,这就是EM算法的巧妙之处。

  可以期待,我们继续凭据上面的思绪,用估量出的PA和PB再来估量Z,再用Z来估量新的PA和PB,频频迭代下去,就可以最终获得PA和PB的真值了。而这里我们假设为 0.8 和 0.52。此时无论怎么迭代,PA和PB的值都市保持在 0.8和0.52稳定,于是,我们就找到了PA和PB的最大似然估量。

  下面在推导EM算法之前,我们先学习一下Jensen不等式

3,导数性子和Jensen不等式

  在学习Jensen不等式之前,我们先说说二阶导数的一些性子。

3.1,二阶导数的性子1

  若是有一个函数 f(x) 在某个区间 I 上有 f ”(x)(即二阶导数) > 0 恒确立,那么对于区间 I上的随便 x,  y 总有:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   若是总有 f”(x) < 0 确立,那么上式的不等号反向。

   几何的直观注释:若是有一个函数 f(x) 在某个区间 I 上有 f ”(x)(即二阶导数) > 0 恒确立,那么在区间 I 上 f(x)的图像上的随便两点连出的一条线段,这两点之间的函数图像都在该线段的下方,反之在该线段的上方。

3.2,二阶导数的性子2:判断函数极大值以及极小值

  连系一阶,二阶导数可以求函数的极值。当一阶导数即是0,而二阶导数大于0时,为极小值点。当一阶导数即是0,而二阶导数小于0时,为极大值点;当一阶导数和二阶导数都即是0,为驻点

  驻点:在微积分,驻点(Stationary Point)又称为平稳点、稳定点或临界点(Critical Point)是函数的一阶导数为零,即在“这一点”,函数的输出值住手增添或削减。对于一维函数的图像,驻点的切线平行于x轴。对于二维函数的图像,驻点的切平面平行于xy平面。值得注重的是,一个函数的驻点纷歧定是这个函数的极值点(思量到这一点左右一阶导数符号不改变的情形);反过来,在某设定区域内,一个函数的极值点也纷歧定是这个函数的驻点(思量到边界条件),驻点(红色)与拐点(蓝色),这图像的驻点都是局部极大值或局部极小值

3.3,二阶导数的性子3:函数凹凸性

  设 f(x) 在 [a, b] 上延续,在(a, b)内具有一阶和二阶导数,那么:

  • (1)若在(a, b)内 f ”(x) > 0,则 f(x) 在[a, b]上的图形是凹的
  • (2)若在(a, b)内 f ”(x) < 0,则 f(x) 在[a, b]上的图形是凸的

3.4 期望

  在概率论和统计学中,数学期望(mean)(或均值,也简称期望)是实验中每次可能效果的概率乘以其效果的总和,是最基本的数学特征之一。它反映随机变量平均取值的巨细。

  需要注重的是:期望值并纷歧定等同于知识中的“期望”——“期望值”也许与每一个效果都不相等。期望值是该变量输出值的平均数。期望值并纷歧定包罗于变量的输出值聚集里。

  大数定理划定:随着重复次数靠近无限大,数值的算术平均值险些一定地收敛于期望值。

离散型

  若是随机变量只取得有限个数或无限能按一定顺序逐一列出,其值域为一个或若干个有限或无限区域,这样的随机变量称为离散型随机变量。

  离散型随机变量只取得有限个值或无限能按一定顺序逐一列出,其值域为一个或若干个有限或无限区间,这样的随机变量称为离散型随机变量。

  离散型随机变量的一切可能的取值 xi 与对应的概率 p(xi) 乘积之和称为该离散型随机变量的数学期望(若该求和绝对收敛),记为E(x)。它是简朴算术平均的一种推广,类似加权平均。

  公式

  离散型随机变量X的取值为X1, X2, X3….Xn, p(X1),p(X2), p(X3)….P(Xn)为X对应取值的概率,可以明了为数据 X1, X2, X3…..Xn泛起的频率 f(Xi),则:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  例子

  某都会有10万个家庭,没有孩子的家庭有 1000 个,有一个孩子的家庭有 9 万个,有两个孩子的家庭有 6000个,有 3个孩子的家庭有 3000个。

  则此都会中任一个家庭中孩子的数目是一个随机变量,记为X。它可取值 0, 1, 2, 3 。

  其中,X取 0 的概率为 0.01 ,取 1的概率为 0.9,取 2的概率为0.06,取 3的概率为0.03

  则它的数学期望为:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   即此都会一个家庭平均有小孩 1.11 个,固然人不能能用1.11来算,约即是2个。

  设 Y 是随机变量X的函数:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   它的漫衍律为:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

延续型

  设延续型随机变量 X 的概率密度函数为 f(x),若积分绝对收敛,则称积分的值为随机变量的数学期望,记为 E(x),即:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   若随机变量 X的漫衍函数 F(x) 可示意成一个非负可积函数 f(x)的积分,则称 X为延续型随机变量,f(x)称为 X 的概率密度函数(漫衍密度函数)。

  数学期望 E(X) 完全由随机变量 X 的概率漫衍所确定。若X遵守某一漫衍,也称 E(X) 是这一漫衍的数学期望。

  定理:  

  若随机变量 Y 相符函数 Y = g(x),且下面函数绝对收敛,则有下下面的期望

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   该定理的意义在于:我们求 E(Y) 时不需要盘算出 Y的漫衍律或概率漫衍,只要行使X的漫衍律或者概率密度即可。

  上述定理还可以推广到两个或以上随机变量的函数情形。

  设 Z 是随机变量 X, Y 的函数 Z = g(X, Y)(g是延续函数),Z是一个一维随机变量,二维随机变量(X, Y)的概率密度为 f(x,  y),则有:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

离散型随机变量与延续型随机变量的区别

  离散型随机变量与延续型随机变量都是由随机变量取值局限确定。

  变量取值只能取离散型的自然数,就是离散型随机变量。例如,一次掷20个硬币,k额硬币正面朝上,k是随机变量。k的取值只能是自然数0, 1, 2 ,3, 4, 。。。。20。而不能取小数 3.5 ,无理数 √ 20 ,因此k是离散型随机变量。

  若是变量可以在某个区间内取任一实数,即变量的取值可以是延续的,这随机变量就称为延续型变量。例如公共汽车每 15 分钟一班,某人在站台等车时间 x 是个随机变量,x的取值局限是 [0, 15),它是一个区间,从理论上说在这个区间内可取任一实数 3.5 ,无理数 ,√ 20 等,因而称这随机变量是延续型随机变量。

3.5  Jensen不等式

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

        若是用图示意会很清晰:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

4,EM算法的推导

  从上面的总结,我们知道EM算法就是迭代求解最大值的算法,同时算法在每一次迭代时分为两步,E步和M步。一轮轮迭代更新隐含数据和模子漫衍参数,直到收敛,即获得我们需要的模子参数。

  这时刻你就不平了,说你老迭代迭代的,你咋知道新的参数的估量就比原来的好啊?为什么这种方式行得通呢?有没有失效的时刻呢?什么时刻失效呢?用到这个方式需要注重什么问题呢?

  为了说明这一串问题,我们下面学习EM算法的整个推导历程。

  首先,我们接着上面的问题聊,就是100名学生的身高问题,总结一下问题,如下:

  样本集 {x(1),   x(2) , …. x(m)},包罗 m 个自力的样本,其中每个样本 i 对应的种别 z(i) 是未知的,以是很难用极大似然求解。而我们的目的就是想找到每个样例隐含的种别z,能使得p(x, z) 最大。

  p(x, z) 的最大似然估量如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   上式中,我们要思量每个样本在各个漫衍中的情形。原本正常求偏导就可以了,然则由于有隐含数据的存在,也就是log后面另有求和,这个就没有办法直接求出 theta了。

  对于每一个样例 i,让Qi 示意该样例隐含变量 z 的某种漫衍,Qi 知足的条件是:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   若是 z 是延续性的,那么Qi是概率密度函数,需要将求和符号换做积分符号。继续上面的例子,假设隐藏变量 z是身高,那就是延续的高斯漫衍;假设隐藏变量是男女,那就是伯努利漫衍 。

  以是说若是我们确定了隐藏变量z,那求解就容易了,可是怎么求解呢?这就需要一些特殊的技巧了。

  技巧:Jensen不等式应用于凹函数时,不等号偏向反向

  我们知道:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  以是对右式分子分母同时乘以 Q(z):

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   为什么要这么做呢?说白了就是要凑Jensen不等式(Q(z) 是Z的漫衍函数),下面继续

   这里假设:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   则上式可以写为:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   我们由Jensen不等式可以知道(由于对数函数是凹函数):

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   则代入 上式:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   以是:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  上面这个历程可以看做是对 l(Θ) 求了下界。对于Qi 的选择,有多种可能,那种更好呢?假设 Θ 已经给定,那么 l(Θ) 的值就取决于 Q(z)和P(x,  z)了。

追了多年的开发框架,你还认识指针吗?

4.1 若何优化下界?

   由于下界对照好求,以是我们要优化这个下界来使得似然函数最大。那么若何优化下界呢?

  随着我们的参数变换,我们的下界是不停增大的趋势。我们红色的线是恒大于零的。简朴来说,就是EM算法可以看做是J 的坐标上升法,E步牢固 theta,优化 Q,M步牢固Q,优化 theta。

   迭代到收敛

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  可能用这个图更显著(参考:https://blog.csdn.net/u010834867/article/details/90762296)

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   我们需要调整上式中Q(z)和P(x,  z) 这两个概率,使下界不停上升,以迫近 l(Θ) 的真实值,那么什么时刻算是调整好了呢?当不等式酿成等式时,说明我们调整后的概率能够等价于  l(Θ) 了。凭据这个思绪,我们要找到等式确立的条件。凭据Jensen不等式,要想让等式确立,就需要什么呢?下面继续说。

4.2  若何能使Jensen不等式等号确立呢?

  什么时刻,使得我们的似然函数最大呢?固然是取等号的时刻。什么时刻等号确立呢?

  由上面Jensen不等式中所说,我们要知足Jensen不等式的等号,则当且仅当 P(x=E(x)) = 1的时刻,也就是说随机变量X是常量。在这里,我们则有:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  c为常数,不依赖于 z。对此式子做进一步推导,由于Q(z) 是z的漫衍函数,以是知足:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   所有的分子和即是常数C(分母相同),即:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   多个等式分子分母相加稳定,这个以为每个样例的两个概率比值都是 c,那么就可以求解 Q(z)了。

4.3  Q(z)的求解

  我们知道Q(z) 是z的漫衍函数,而且:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   由上式就可得C就是 P(xi,  z)对Z求和,我们上面有公式。

   从上面两式,我们可以获得:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   Q(z) 代表第 i 个数据是来自 zi 的概率。

  至此,我们推出了在牢固其他参数 Θ 后,Q(z)的盘算公式就是后验概率,解决了Q(z)若何选择的问题。这一步就是E步,确立 l(Θ) 的下界。

  以是去掉 l(Θ) 式中为常数的部门,则我们需要极大化的对数似然下界为:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   注重上式也就是我们EM算法的M步,就是在给定 Q(z)后,调整Θ,去极大化 l(Θ)的下界(在牢固Q(z)后,下界还可以调整的更大)。

  E步我们再强调一次,注重到上式Q(z)是一个漫衍,因此 下式可以明了为 logP(x, z; Θ) 基于条件概率漫衍 Q(z)的期望。

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  至此,我们学习了EM算法那中E步和M步的详细数学寄义。

5,EM算法的一样平常流程

  下面我们总结一下EM算法的流程。

  输入:考察数据 x = {x1,  x2, … xm},团结漫衍 p(x, z; θ),条件漫衍 p(z|x; θ),最大迭代次数 J 。

  1)随机初始化模子参数 θ 的初值 θ0

  2)循环重复,即for j from 1 to J  最先EM算法迭代。

      E步:盘算团结漫衍的条件概率期望

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

       M步:极大化L(θ,  θj),获得 θj+1

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   3)若是 θj+1 已经收敛,则算法竣事,否则继续回到步骤E步迭代。

  输出:模子参数 θ。

   用PPT总结如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

6,EM算法的收敛性思索

  (这里直接粘贴刘建平先生的博客了。利便。。)

  EM算法的流程并不庞大,然则另有两个问题需要我们思索:

  • 1) EM算法能保证收敛吗?
  • 2)EM算法若是收敛,那么能保证收敛到全局最大值吗?

  首先,我们先看第一个问题,EM算法的收敛性。要证实EM算法收敛,则我们需要证实我们的对数似然函数的值在迭代的历程中一直在增大。即:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  由于:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   令:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   上面两个式子相减获得:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  在上式中划分取 Θ 为 Θj 和 Θj+1 ,而且相减获得:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   要证实EM算法的收敛性,我们只需要证实上式的右边是非负的即可。

  由于 Θj+1  使得L(Θ,Θ)极大,因此有:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  上式的意思是说极大似然估量单调递增,那么我们会到达最大似然估量的最大值。

   而对于第二部门,我们有:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   上式中,第二个不等式使用了Jensen不等式,只不外和前面的使用相反而已,最后一个等式使用了概率漫衍累积为1的性子。

  至此,我们获得了:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   从上面的推导可以看出,EM算法可以保证收敛到一个稳定点,然则却不能保证收敛到全局的极大值点,因此它是局部最优的算法,固然,若是我们的优化目的 L(Θ,Θ)是凸的,则EM算法可以保证收敛到全局最大值,这点和梯度下降法这样的迭代算法相同。至此我们也回覆了上面的第二个问题。

  若是我们从算法头脑的角度来思索 EM 算法,我们可以发现我们的算法里已知的是考察数据,未知的隐含数据和模子参数。在E步,我们所做的事情是牢固模子参数的值,优化隐含数据的漫衍,而在M步,我们所做的事情是牢固隐含数据漫衍,优化模子参数的值。对照下其他的机械学习算法,实在许多算法都有类似的头脑。好比SMO算法,坐标轴下降法都是由了类似的头脑来求解问题。

7,GMM(高斯夹杂模子)

  我们上面已经推导了EM算法,下面再来说一下高斯夹杂模子。高斯夹杂模子是什么呢?顾名思义就是用多个高斯模子来形貌数据的漫衍,就是说我们的数据可以看做是从多个Gaussian Distribution 中天生出来的。那GMM是由K个Gaussian漫衍组成,以是每个Gaussian称为一个“Component”。

  首先说一句,为什么是高斯夹杂模子呢?而不是其他模子呢?

  由于从中央极限定理知:只要k足够大,模子足够庞大,样本量足够多,每一块小区域就可以用高斯漫衍形貌(简朴说:只要样本量足够大时,样本均值的漫衍逐步变为正态漫衍)。而且高斯函数具有优越的盘算性能,以是GMM被普遍的应用

  有时刻单一的高斯漫衍不能很好的形貌漫衍,如下图,二维高斯密度函数的等概率先为椭圆(固然后面会做演习)

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   从上图我们看到,左图用单一高斯漫衍去形貌,显然没有右图用两个高斯漫衍去形貌的效果好。

  以是我们引入夹杂高斯模子。

  如下图所示,我们用三个高斯漫衍去形貌一个二维的数据:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   现在我们界说 K 个高斯密度叠加:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

  对于每个高斯密度函数有自己的均值 μk 和方差 ∑k , πk作为夹杂的比例系数有:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   下图中(a)为差异夹杂比例下的高斯概率密度漫衍;(b)为夹杂状态下的概率密度漫衍;(c)为概率密度漫衍的外面图:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   以是 p(x) 可以改写为:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   并与公式(1)对比,有:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   则后验概率 p(k|x),凭据贝叶斯理论,可示意为:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   因此GMM由 μ, ∑ , π 确定,并在有参数 K的存在。

  而GMM模子的求解方式和EM算法是一样的,就是不停的迭代更新下去。一个最直观的领会算法的思绪就是参考K-Means算法。博客地址:

Python机械学习条记:K-Means算法,DBSCAN算法

  这里再简朴的说一下,在K-Means聚类时,每个聚类簇的质心是隐含数据。我们会假设K个初始化质心,即EM算法的E步;然后盘算获得每个样本最近的质心,而且把样本聚类到最近的这个质心,即EM算法的M步,重复这个E步和M步,知道质心不再转变为止,这样就完成了K-Means聚类。固然K-Means算法是对照简朴的,现实问题并没有这么简朴,然则也许可以说明EM算法的头脑了。

  上面遗留了一个问题,就是单一的高斯漫衍不能很好的形貌漫衍,而两个高斯漫衍形貌的好。为了将这个说的透彻,我们这样做:我们天生四簇数据,其中两簇数据离的稀奇近,然后我们看看K-Means算法是否能将这两簇离的稀奇近的数据凭据我们的想法区离开,再看看GMM算法呢,若是可以区分,那么我们将数据拉伸呢?

  以是下面我们会做两个实验,对于随机天生的数据,我们会做K-Means算法和GMM算法的效果比对,然后再对数据举行处置,再做K-Means算法和GMM算法的效果比对。

  首先天生四簇数据,效果如下:

from sklearn.datasets.samples_generator import make_blobs
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture

# 天生新的数据
X, y_true = make_blobs(n_samples=800, centers=4, random_state=11)
plt.scatter(X[:, 0], X[:, 1])

   图如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   我们看看K-Means分类效果:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   我们再看看GMM算法的效果:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   都能分出来,这样很好,下面我们对数据举行处置:拉伸

rng = np.random.RandomState(13)
X_stretched = np.dot(X, rng.randn(2, 2))

      我们拉伸后,看看原图效果:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   下面划分使用K-Means算法和GMM算法看效果:

  首先是K-Means算法

kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')

   效果如下

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   K-Means算法没有把拉伸的数据离开,而是凭据聚类的头脑,将上面的数据聚在一起,将下面的数据聚在一起。

  我们再看看GMM算法的效果:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   是不是GMM算法区分出来我们想要的效果了。以是在这个问题上GMM算法的优势就体现出来了。

  完整代码去我的GitHub上拿(地址:https://github.com/LeBron-Jian/MachineLearningNote)。

8,Sklearn实现GMM(高斯夹杂模子)

  Sklearn库GaussianMixture类是EM算法在夹杂高斯漫衍的实现,现在简朴记录下其参数说明。

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   对此源码中的参数,我们领会其意义:

  • 1. n_components:夹杂高斯模子个数,默以为1
  • 2. covariance_type:协方差类型,包罗{‘full’,‘tied’, ‘diag’, ‘spherical’}四种,划分对应完全协方差矩阵(元素都不为零),相同的完全协方差矩阵(HMM会用到),对角协方差矩阵(非对角为零,对角不为零),球面协方差矩阵(非对角为零,对角完全相同,球面特征),默认‘full’ 完全协方差矩阵
  • 3. tol:EM迭代住手阈值,默以为1e-3.
  • 4. reg_covar:协方差对角非负正则化,保证协方差矩阵均为正,默以为0
  • 5. max_iter:最大迭代次数,默认100
  • 6. n_init:初始化次数,用于发生最佳初始参数,默以为1
  • 7. init_params: {‘kmeans’, ‘random’}, defaults to ‘kmeans’.初始化参数实现方式,默认用kmeans实现,也可以选择随机发生
  • 8. weights_init:各组成模子的先验权重,可以自己设,默认凭据7发生
  • 9. means_init:初始化均值,同8
  • 10. precisions_init:初始化精确度(模子个数,特征个数),默认凭据7实现
  • 11. random_state :随机数发生器
  • 12. warm_start :若为True,则fit()挪用会以上一次fit()的效果作为初始化参数,适合相同问题多次fit的情形,能加速收敛,默以为False。
  • 13. verbose :使能迭代信息显示,默以为0,可以为1或者大于1(显示的信息差异)
  • 14. verbose_interval :与13挂钩,若使能迭代信息显示,设置多少次迭代后显示信息,默认10次。

  下面看看网友对源码的剖析:

(1)首先将模子完全转换成对数盘算,凭据高斯密度函数公式划分盘算k个组成高斯模子的log值,即logP(x|z)的值
def _estimate_log_gaussian_prob(X, means, precisions_chol, covariance_type):
# 盘算精度矩阵的1/2次方log_det(代码精度矩阵是通过cholesky获取)
    log_det = _compute_log_det_cholesky(
        precisions_chol, covariance_type, n_features)
# 对应上面四种协方差类型,划分盘算精度矩阵与(x-u)相乘那部门log_prob
    if covariance_type == 'full':
        log_prob = np.empty((n_samples, n_components))
        for k, (mu, prec_chol) in enumerate(zip(means, precisions_chol)):
            y = np.dot(X, prec_chol) - np.dot(mu, prec_chol)
            log_prob[:, k] = np.sum(np.square(y), axis=1)

    elif covariance_type == 'tied':
        log_prob = np.empty((n_samples, n_components))
        for k, mu in enumerate(means):
            y = np.dot(X, precisions_chol) - np.dot(mu, precisions_chol)
            log_prob[:, k] = np.sum(np.square(y), axis=1)

    elif covariance_type == 'diag':
        precisions = precisions_chol ** 2
        log_prob = (np.sum((means ** 2 * precisions), 1) -
                    2. * np.dot(X, (means * precisions).T) +
                    np.dot(X ** 2, precisions.T))

    elif covariance_type == 'spherical':
        precisions = precisions_chol ** 2
        log_prob = (np.sum(means ** 2, 1) * precisions -
                    2 * np.dot(X, means.T * precisions) +
                    np.outer(row_norms(X, squared=True), precisions))
# 最后盘算出logP(x|z)的值
return -.5 * (n_features * np.log(2 * np.pi) + log_prob) + log_det   

(2)P(x|z)*P(z)盘算每个模子的概率漫衍P(x,z),求对数则就是相加了
def _estimate_weighted_log_prob(self, X):
 return self._estimate_log_prob(X) + self._estimate_log_weights()

(3)最后最先盘算每个模子的后验概率logP(z|x),即Q函数
def _estimate_log_prob_resp(self, X):
weighted_log_prob = self._estimate_weighted_log_prob(X)
#盘算P(X)
log_prob_norm = logsumexp(weighted_log_prob, axis=1)
 with np.errstate(under='ignore'):
 # 忽略下溢,盘算每个高斯模子的后验概率,即占比,对数则相减
log_resp = weighted_log_prob - log_prob_norm[:, np.newaxis]
    return log_prob_norm, log_resp
(4)挪用以上函数
 #返回所有样本的概率均值,及每个高斯漫衍的Q值
def _e_step(self, X):
log_prob_norm, log_resp = self._estimate_log_prob_resp(X)
    return np.mean(log_prob_norm), log_resp
2.对应M step

def _m_step(self, X, log_resp):
#凭据上面获得的每个高斯模子的Q值(log_resp)。重新估算均值self.means_,协方差self.covariances_,当前相符各高斯模子的样本数目self.weights_(函数名起的像权重,现实指的是数目)
n_samples, _ = X.shape
self.weights_, self.means_, self.covariances_ = (
            _estimate_gaussian_parameters(X, np.exp(log_resp), self.reg_covar,
                                          self.covariance_type))
#更新当前各高斯模子的先验概率,即P(Z)
self.weights_ /= n_samples
#凭据cholesky剖析盘算精度矩阵
self.precisions_cholesky_ = _compute_precision_cholesky(
            self.covariances_, self.covariance_type)
然后重复以上历程,就完成了EM算法的实现啦。

   下面进入我们的实战环节。。。

  数据(可以去我的GitHub上拿,地址:https://github.com/LeBron-Jian/MachineLearningNote)

  数据的靠山是这样的,这里简朴先容一下:在某个区域有一个桥,桥东面有一个区域,桥西边有一个区域。假设我们这两个地方是存放共享单车的,那给出的数据是天天某个时间点,共享单车被骑走的数据。(此数据是关于时间序列的数据),数据有 42312条,每条数据有两个特征(也就是前面提到的两个区域)。

  首先我们展示一下数据,代码如下:

import pandas as pd

filename = 'Fremont.csv'
data = pd.read_csv(filename, index_col='Date', parse_dates=True)
res = data.head()
print(res)

   数据如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   为了直观,我们绘图,看看原数据长什么样子:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   这样是很难看出特征的吧,原数据是凭据小时来统计两个区域的数据,下面我们对数据举行重采样,按周举行盘算,我们再看看效果:

# 展示原数据
# data.plot()
data.resample('w').sum().plot()

   注重这个resample 的意思,是凭据时间索引举行合并后求和盘算的。就是在给定的时间单元内重取样,常见的时间频率为:

  • A year
  • M month
  • W week
  • D day
  • H hour
  • T minute
  • S second

   说明了了意思,下面我们看看按周举行盘算的图:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   现在数据直观上看起来清晰多了吧,固然我们对于时间序列问题,不止可以接纳重取样查看数据,也可以接纳滑动窗口,下面实验一下接纳365天做一个滑动窗口,这里是窗口的总和,代码和图如下:

# 对数据接纳滑动窗口,这里窗口是365天一个
data.resample('D').sum().rolling(365).plot()

  图如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   下面我们不凭据时间来算了,纰谬这五年的数据举行剖析了,我们想看看某一天的数据漫衍,若何做呢?

# 查看某一天的数据漫衍
data.groupby(data.index.time).mean().plot()
plt.xticks(rotation=45)

   图如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   我们可以看到在早上七点到九点,West区域骑走的共享单车对照多,而在下昼的四点到六点,East骑走的共享单车对照多。

  下面我们将这两个特征划分命名为East和West,再看看前五个小时时间变换图。

# 查看前五个小时时间变换
# pivot table
data.columns = ['West', 'East']
data['Total'] = data['West'] + data['East']
pivoted = data.pivot_table('Total', index=data.index.time, columns=data.index.date)
res = pivoted.iloc[:5, :5]
print(res)

   效果如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

 

   我们展示一下 24个小时的两地数据图:

# 绘图展示一下
pivoted.plot(legend=False, alpha=0.01)
plt.xticks(rotation=45)

   图如下(数据对照多,绘图对照慢,等等就OK):

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   对数据剖析完后,我们最先使用模子训练,这里为了能将数据展示在二维图上,我们做这样一个处置,首先我们将数据转置,究竟将数据分为许多特征,而且只有24个数据欠好。以是将样本数分为1763,特征为24个,则效果就对照好了。。。。

  而这样是可以做的,然则利便演示,我们希望将数据转换为二维的,那我们需要对数据举行降维,我们把二十四个特征降维到二维空间,降维代码如下:

X = pivoted.fillna(0).T.values
print(X.shape)
X2 = PCA(2).fit_transform(X)
print(X2.shape)
plt.scatter(X2[:, 0], X2[:, 1])

   转换为二维,数据如图所示:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   数据经由PCA降维后,其物理意义很难注释,我们可以看到图中都有负值了,以是不要纠结这个问题。

  下面看GMM算法的代码:

gmm = GaussianMixture(2)
gmm.fit(X)
labels_prob = gmm.predict_proba(X)
print(labels_prob)
labels = gmm.predict(X)
print(labels)
plt.scatter(X2[:, 0], X2[:, 1], c=labels, cmap='rainbow')

   我们看看展望出来的label概率和label值(GMM算法对照稀奇,我们可以知道某个种别的概率值):

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   使用GMM算法,分类的图如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

   下面我们将二维数据还原回去,看效果,代码如下:

fig, ax = plt.subplots(1, 2, figsize=(14, 6))
pivoted.T[labels == 0].T.plot(legend=False, alpha=0.1, ax=ax[0])
pivoted.T[labels == 1].T.plot(legend=False, alpha=0.1, ax=ax[0])
ax[0].set_title('Purple Cluster')
ax[1].set_title('Red Cluster')

   图如下:

python机械学习条记:EM算法,Python机械学习条记:K-Means算法,DBSCAN算法

 

完整代码及其数据,请移步小编的GitHub

  传送门:请点击我

  若是点击有误:https://github.com/LeBron-Jian/MachineLearningNote

 

 

 PS:这篇文章是我整理自己学习EM算法的条记,连系先生的PPT,然后找到网友优异的博客,将自己的明了写到这里。

参考文献:https://www.cnblogs.com/pinard/p/6912636.html

https://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html

https://blog.csdn.net/fuqiuai/article/details/79484421

https://blog.csdn.net/u010834867/article/details/90762296

https://zhuanlan.zhihu.com/p/28108751

https://blog.csdn.net/lihou1987/article/details/70833229

https://blog.csdn.net/v_july_v/article/details/81708386

原创文章,作者:28qn新闻网,如若转载,请注明出处:http://www.28qn.com/archives/9625.html