EM算法及OpenCV源码分析
来源:互联网 发布:淘宝客服工资一般多少 编辑:程序博客网 时间:2024/06/04 17:48
关于EM原理,见:
http://blog.csdn.net/app_12062011/article/details/50350428
EM算法的启动和终止
算法执行的开始步骤有三种指定方式。如果使用了CvEM::START_AUTO_STEP,则会调用k-means算法估计最初的参数,K-means会随机地初始化类中心,KMEANS_PP_CENTERS,这会导致EM算法得到不同的结果,如果数据量越大,则这种差异性会变小。
如果指定CvEM::START_E_STEP或CvEM::START_M_STEP参数,则不会出现同样的输入数据,得到不同结果的现象。如果指定CvEM::START_M_STEP参数,则以M步开始,
M步固定优化,必须给出概率
如果指定CvEM::START_E_STEP,则以E步开始,CvEMParams::means必须给出,CvEMParams::weights和CvEMParams::covs参数可给出可不给出,weights代表初始的各个成分的概率。
算法执行的终止条件。EM算法是迭代算法,自然终止条件可以是迭代次数达到了,或者两次迭代之间的差异小于epsilon就结束。
关于参数的解析,请参照机器学习中文参考手册。
CvEM::train函数中执行以下过程:
- init_params。
- emObj = EM //建立一个EM对象。
根据_params.start_step值执行不同过程,train,trainE和trainM。
这三个train过程都会返回logLikelihoods(Mat结构),_labels,probs(给定样本x属于各个类别的后验概率)。在训练之前,train函数里面会调用setTrainData准备训练数据,再调用do_train正式训练。setTrainData会做参数安全检查,如果是START_AUTO_STEP,则会打开K-means并把数据都转换成CV_32FC1。训练数据都保存到类成员trainSamples里。执行do_train过程
1.clusterTrainSamples里调用kmeans方法聚类训练集成nclusters个类,并得到各个样本的类别。Kmeans执行前要保证数据是CV_32FC1类型,执行完后要转换成CV_64FC1类型。
2.根据labels将所有数据放到nclusters个矩阵中,分别计算每个矩阵的协方差矩阵和每个类别权值(该类样本数除以样本总数)。对每个协方差矩阵做奇异值分解(SVD),得到最大的奇异值的倒数。
3.反复循环执行E步,M步,直到满足如下条件:
trainLogLikelihoodDelta 表示两次相邻迭代过程中对数似然概率的增量。
E-step 源码:
注意上面的公式,转换到log后,相乘除的变为相加减
M-step:
- EM算法及OpenCV源码分析
- opencv EM算法 源码解读
- SVM算法及OpenCV源码分析
- OPENCV之EM算法篇
- PLSA及EM算法
- GMM及EM算法
- Harris原理及opencv源码分析
- EM算法及相关概念
- EM算法介绍及总结
- EM算法及python实现
- OPENCV EM算法详解和JAVA实现
- 排序算法源码及效率分析汇总
- SURF算法及源码分析(下)
- SIFT算法原理与OpenCV源码分析1:SIFT简介
- SIFT算法原理与OpenCV源码分析4:方向赋值
- SURF 特征点算法源码分析(opencv)
- SIFT特征点算法源码分析(opencv)
- KF算法学习(三):opencv中的KF源码分析
- css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况[转载]
- phonegap介绍以及phonegap安装介绍
- Oracle 客户端连接远程数据库配置注意事项
- SpringMVC之Controller常用注解功能全解析
- 《加密与解密》学习笔记(二) - 加密算法和PE文件
- EM算法及OpenCV源码分析
- java 程序计数器
- 三十分钟掌握STL
- Python读写excel文件
- Nodejs sublime text 3安装与配置
- java8 ArrayList源码阅读
- Hello World!
- C# 16进制与字符串、字节数组之间的转换
- hdu 2077 汉诺塔IV