前言:

  本次实验是用EM来学习HMM中的参数,并用学好了的HMM对一些kinect数据进行动作分类。实验内容请参考coursera课程:Probabilistic Graphical Models 中的的最后一个assignmnet.实验用的是kinect关节点数据,由于HMM是一个时序模型,且含有隐变量,所以这个实验不是很好做。大家对HMM不熟悉的话可以参考网友的实验:code.

  kinect人体关节数据中, 每个关节点由3个坐标数据构成,多个关节点数据(实验中为10个)构成一个pose,多个pose构成一个action,每个action所包含的pose个数可能不等。其示意图如下:

 

  图中有3个action: clap, high kick, low kick. 而每个action可以由不同的pose序列构成,上面的每个action中列举出了3种情况,其长短可不一。在HMM模型中,上面模型中每个节点代表的是观察节点,代表一个pose,该pose可由状态变量(隐变量)产生,比如具有3个pose的action示意图如下:

  

  其中的状态变量S1,S2,S3并不是该pose的action标签,而是介于pose和action之间的一个隐藏类别,它与action和pose数据同时有关,这里state的物理意义不是十分明确,state节点的个数可由验证集通过实验来确定。

  实验中一些函数的简单说明:

  [P loglikelihood ClassProb] = EM_cluster(poseData, G, InitialClassProb, maxIter):

  实验1的内容。poseData大小为N*10*3,表示N个pose的数据。G,P和练习八意思一样,为模型的结构信息。InitialClassProb大小为N*K,表示这N个样本分别属于K个类别的初始概率,ClassProb表示EM聚类完成后这N个样本属于各个类别的概率值。loglikelihood中保存的是每次EM迭代时的log似然值。模型中的隐变量为每个样本所属的类别。程序中的E步是:给定模型中的参数(每个关节点的CLG参数),求出每个样本属于各个类别的概率。M步为:给定每个样本属于K个类别的概率后,来求模型中每个关节点的参数。

  [mu sigma] = FitG(X, W):

  该函数类似于练习八中的FitGaussianParameters(),只是这里每个样本多了一个可信度权值,求高斯参数的时候需要把这个权值考虑进去。

  [Beta sigma] = FitLG(X, U, W):

  该函数类似于练习八中的FitGaussianParameters(),也是多了一个参数W,表示输入进来的数据X和父节点数据U的可信度为W中对应的值。每个state都会学习到的自己的参数beta和sigma,为HMM模型中的发射矩阵。

  out = logsumexp(A):

  很明显是求exp(A),然后求和,最后取log值,内部采用了防止数据溢出的方法。如果A是一个矩阵,则上面的操作是针对A的每一行进行的。

  [P loglikelihood ClassProb PairProb] = EM_HMM(actionData, poseData, G, InitialClassProb, InitialPairProb, maxIter):

  实验2的内容。参数结构比较复杂,简单介绍下。

  actionData结构体向量:该向量中的每一个元素都是一个action。action.action表示对应动作的名称,在本函数中,因为是训练某个类别的HMM模型,所以其名称都一样。action.marg_ind,表示该action的pose数据在poseData向量中的行索引,同时也为pose属于各个state的概率值在ClassProb中的索引。action.pair_ind:action中连续的pose之间的边在PairProb中的索引,PairProd矩阵中的每一行表示对应edge两端之间的state转移概率。

  poseData, G, InitialClassProb,maxIter和前面的差不多。

  InitialPairProb:大小为V*K^2的矩阵,其中V为模型中边的数目,K为HMM模型中状态的个数,该矩阵与HMM转移矩阵的计算有关。

  博文前面的HMM action示意图中对应的poseData, PairProb值形式如下所示:

  

  返回值P和以前的P结构稍有不同,因为这里考虑到了HMM之间的状态转移,所以有P.transMatrix来表示HMM中状态转移矩阵,尺寸为K*K。另外P.c不再表示每个pose所属action的概率分布,而是初始状态分布。P.c表示在这些数据下,这个action对应state的先验概率。

  EM_HMM()函数的作用是:用某个action的序列样本actionData来训练它的HMM模型,对应的模型参数包括转移概率,发射概率(包括各个状态下的关节点参数),初始概率。主要分为2个步骤:E步:给定参数,通过clique tree求数据;M步:给定数据,求HMM参数,比如初始状态分布计算:

  

  转移概率的计算公式为:

  

  与发射概率相关的CLG参数计算参考练习八

  [M, PCalibrated] = ComputeExactMarginalsHMM(F):

  F为HMM模型的factorlist,M为在该模型上进行精确推导的条件概率,与以前练习4实验中的推理类似。PCalibrated为校正好的clique tree,

  [accuracy, predicted_labels] = RecognizeActions(datasetTrain, datasetTest, G, maxIter):

  实验3的内容。datasetTrain为训练HMM模型时的样本,它是长度为3的向量(本实验只有3个动作类别),每个元素都是一个结构体。第1个结构体表示动作clap的数据,结构体中包含了actionData, poseData, InitialClassProb, InitialPairProb信息。第2个结构体为high_kick动作的数据,第3个结构体为low_kick动作的数据。datasetTest为测试样本,也是一个结构体,里面有actionData,poseData和labels. labels对应每个action的标签,“clap” = 1, “high kick” = 2, “low kick” = 3。实现该函数时首先用datasetTrain训练3个HMM模型参数,然后针对datasetTest中的每个action数据,计算它的posedata在每个模型各个状态下的概率。然后在这3个模型上分别建立clique tree,并算出生成这些样本的概率,概率值最大的那个模型对应的action为其分类类别。

  相关理论知识点:

  这部分可参考Corsera中的课件以及网友demonstrate的blog:PGM 读书笔记节选(十四)

  不完全数据(incomplete data)主要包含2部分:缺失数据(missing data)和含隐变量的数据。

  缺失数据又分2种情况:一是数据样本中有一些没有被观察到的量,一般用问号代替。另外一种是数据样本中直接少了一些数据,至于少了哪些数据,在哪些位置(序列数据)少了数据,都无法知道。

  Missing at Random(MAR):随机缺失的一些样本,此时在给定观察到的样本条件下,没被观察的样本与控制缺失的开关变量相互独立。

  带有隐变量的Likelihood函数值会有多个极值点,并且极值点的个数与隐变量的个数成指数关系(实际上,这些局部极值的log似然值也不相同)。带缺失数据的情形与之类似。有多个极值点的函数时即使学习到了其中一个极值点的参数,这组参数也未必就是模型中的true parameters. 隐变量的likelihood的另一个缺点就是likelihood函数不能按照变量和CPD等来局部分解,并且模型中一些不相关的参数也开始相关了(引入了新的v-structure)。

  带隐变量likelihood函数参数的求解虽然可以采用一些高级的梯度下降法,但实际中用得较多的是EM算法。关于EM算法可以参考我前面的博文对EM算法的简单理解. 在隐变量likelihood这里,简单来说E步为给定模型参数,产生”完全”数据(把那些隐变量的数据也生成出来);M步为给定”完全”数据,计算模型参数。EM算法的特点是在前面迭代过程中收敛速度较快,越到后面收敛越慢。

  梯度下降法是沿着一条直线进行搜索,而EM算法是沿着一个凸函数曲线来搜索其极值,有理论保证EM算法迭代过程中对应似然函数值不会下降。

  参考资料:

网友的实验:code.

PGM练习八:结构学习

coursera课程:Probabilistic Graphical Models

网友demonstrate的blog:PGM 读书笔记节选(十四)

PGM练习四:图模型的精确推理

EM算法学习笔记_1(对EM算法的简单理解)

机器学习&数据挖掘笔记_25(PGM练习九:HMM用于分类)的更多相关文章

  1. 机器学习&数据挖掘笔记_14(GMM-HMM语音识别简单理解)

    为了对GMM-HMM在语音识别上的应用有个宏观认识,花了些时间读了下HTK(用htk完成简单的孤立词识别)的部分源码,对该算法总算有了点大概认识,达到了预期我想要的.不得不说,网络上关于语音识别的通俗 ...

  2. 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)

    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...

  3. [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...

  4. 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

    前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考 ...

  5. 机器学习&数据挖掘笔记_24(PGM练习八:结构学习)

    前言: 本次实验包含了2部分:贝叶斯模型参数的学习以及贝叶斯模型结构的学习,在前面的博文PGM练习七:CRF中参数的学习 中我们已经知道怎样学习马尔科夫模型(CRF)的参数,那个实验采用的是优化方法, ...

  6. 机器学习&数据挖掘笔记_23(PGM练习七:CRF中参数的学习)

    前言: 本次实验主要任务是学习CRF模型的参数,实验例子和PGM练习3中的一样,用CRF模型来预测多张图片所组成的单词,我们知道在graph model的推理中,使用较多的是factor,而在grap ...

  7. 机器学习&数据挖掘笔记_22(PGM练习六:制定决策)

    前言: 本次实验是将一些简单的决策理论和PGM推理结合,实验内容相对前面的图模型推理要简单些.决策理论采用的是influence diagrams,和常见图模型本质一样, 其中的决策节点也可以用CPD ...

  8. 机器学习&数据挖掘笔记_20(PGM练习四:图模型的精确推理)

    前言: 这次实验完成的是图模型的精确推理.exact inference分为2种,求边缘概率和求MAP,分别对应sum-product和max-sum算法.这次实验涉及到的知识点很多,不仅需要熟悉图模 ...

  9. 机器学习&数据挖掘笔记_18(PGM练习二:贝叶斯网络在遗传图谱在的应用)

    前言: 这是coursera课程:Probabilistic Graphical Models上的第二个实验,主要是用贝叶斯网络对基因遗传问题进行一些计算.具体实验内容可参考实验指导教材:bayes ...

随机推荐

  1. linux之LVM

    一.简介 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵 ...

  2. 浅析C语言指针问题

    首先明白c语言操作符的优先级及结合性就很容易理解了. 链接 1.关于char *s 及 char s[] char *s指向的是一个字符串对象的指针,可以理解为间接引用,比如 char *s = “1 ...

  3. java 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)

    参考文章:http://ifeve.com/java-concurrency-thread-directory/ 其中的竞态,线程安全,内存模型,线程间的通信,java ThreadLocal类小节部 ...

  4. UILabel实现自适应高宽

    UILabel是iOS开发常用的控件.UILabel的属性需要了解,UILabel的特殊显示效果也需要我们掌握.UILabel自适应高宽度是很多初学者遇到的技术性难题.比如段文字,要让他完全地分行显示 ...

  5. Java多线程16:线程组

    线程组 可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示: 线程组的作用是:可以批量管理线程或线程组对象,有效地对线 ...

  6. 【读书笔记】javascript 继承

    在JavaScript中继承不像C#那么直接,C#中子类继承父类之后马上获得了父类的属性和方法,但JavaScript需要分步进行. 让Brid 继承 Animal,并扩展自己fly的方法. func ...

  7. 系统空闲时间判断&命名验证

    一.系统空闲时间判断 需要一个自动登录注销的功能,当鼠标移动和或者键盘输入的时候认为当前用户在线,否则过了设置时间就自动退出.好在前辈们留下了这样的一个类: MouseKeyBoardOperate: ...

  8. 动态绑定HTML

    在Web前端开发中,我们经常会遇见需要动态的将一些来自后端或者是动态拼接的HTML字符串绑定到页面DOM显示,特别是在内容管理系统(CMS:是Content Management System的缩写) ...

  9. 【吐血分享】SQL Server With As 递归获取层级关系数据

    纯洁的一周又开始了,今天看到一则新闻,笑尿了,和袁友们一起娱乐下 最近两月在做基于Saas模式的人力资源管理产品,平常数据库设计我经常会遇到如下需求场景: 以前商城类网站在设计类型表的时候,设计成单表 ...

  10. 不插网线,看不到IP的解决办法

    在Windows中,如果不插网线,就看不到IP地址,即使这个块网卡已经绑定了固定IP,原因是操作系统开启了DHCP Media Sense功能,该功能的作用如下: 在一台使用 TCP/IP 的基于 W ...