ITK学习笔记(八) ITK高斯混合模型 GMM EM

  • 1、高斯混合模型
  • 2、变分贝叶斯高斯混合
  • 3、ITK中的GMM、EM

1、高斯混合模型

sklearn.mixture是一个能够学习高斯混合模型、抽样高斯模型和从数据中估计模型的包。同样,也提供了帮助决定正确组件数量的方法。

一个高斯混合模型是一个概率模型,它假设所有的数据点是从有限未知参数的高斯分布的混合生成的。可以将混合模型当作泛化的k均值聚类,以融合关于数据协方差和潜在高斯中心的信息。

高斯混合
GaussianMixture对象实现了expection-maximization算法来拟合高斯混合模型。它也能够得到多元模型的置信椭圆,计算贝叶斯信息准则来确定数据中聚集类别的数量。GaussianMixture.fit方法从训练数据中学习一个高斯混合模型,GaussianMixture.predict能够分配给每个样本最大可能属于的高斯分布。

GaussianMixture提供了不同的选项来限制不同类别估计的方差,包括,spherical、diagonal、tied或full方差。

2、变分贝叶斯高斯混合

BayesianGaussianMixture对象实现了一系列考虑不同推断算法的高斯混合模型。

估计算法:变分推断
变分推断(Variational Inference)是最大期望的扩展,它最大化模型证据的下界,而不是数据似然。其背后的原理与最大期望方法相同。但是变分推断方法通过集成先验分布的信息添加正则项。这可以避免在最大期望中经常发生的奇异性,但会引入偏差到模型中。

BayesianGaussianMixture类提供了两类权重的先验:使用Dirichlet分布的有限混合模型和使用Dirichlet过程的无限混合模型。

参考:高斯混合模型

3、ITK中的GMM、EM

使用 ITK中的GMM、EM进行分布式采样

#include "itkVector.h"
#include "itkListSample.h"
#include "itkGaussianMixtureModelComponent.h"
#include "itkExpectationMaximizationMixtureModelEstimator.h"
#include "itkNormalVariateGenerator.h"int
main(int, char *[])
{unsigned int numberOfClasses = 2;using MeasurementVectorType = itk::Vector<double, 1>;using SampleType = itk::Statistics::ListSample<MeasurementVectorType>;SampleType::Pointer sample = SampleType::New();using NormalGeneratorType = itk::Statistics::NormalVariateGenerator;NormalGeneratorType::Pointer normalGenerator = NormalGeneratorType::New();normalGenerator->Initialize(101);MeasurementVectorType mv;double                mean = 100;double                standardDeviation = 30;for (unsigned int i = 0; i < 10; ++i){mv[0] = (normalGenerator->GetVariate() * standardDeviation) + mean;std::cout << "m[" << i << "] = " << mv[0] << std::endl;sample->PushBack(mv);}normalGenerator->Initialize(3024);mean = 200;standardDeviation = 30;for (unsigned int i = 0; i < 10; ++i){mv[0] = (normalGenerator->GetVariate() * standardDeviation) + mean;std::cout << "m[" << i << "] = " << mv[0] << std::endl;sample->PushBack(mv);}using ParametersType = itk::Array<double>;ParametersType params1(2);std::vector<ParametersType> initialParameters(numberOfClasses);params1[0] = 110.0;params1[1] = 50.0;initialParameters[0] = params1;ParametersType params2(2);params2[0] = 210.0;params2[1] = 50.0;initialParameters[1] = params2;using ComponentType = itk::Statistics::GaussianMixtureModelComponent<SampleType>;std::vector<ComponentType::Pointer> components;for (unsigned int i = 0; i < numberOfClasses; i++){components.push_back(ComponentType::New());components[i]->SetSample(sample);components[i]->SetParameters(initialParameters[i]);}using EstimatorType = itk::Statistics::ExpectationMaximizationMixtureModelEstimator<SampleType>;EstimatorType::Pointer estimator = EstimatorType::New();estimator->SetSample(sample);estimator->SetMaximumIteration(500);itk::Array<double> initialProportions(numberOfClasses);initialProportions[0] = 0.5;initialProportions[1] = 0.5;estimator->SetInitialProportions(initialProportions);for (unsigned int i = 0; i < numberOfClasses; i++){estimator->AddComponent((ComponentType::Superclass *)components[i].GetPointer());}estimator->Update();for (unsigned int i = 0; i < numberOfClasses; i++){std::cout << "Cluster[" << i << "]" << std::endl;std::cout << "    Parameters:" << std::endl;std::cout << "         " << components[i]->GetFullParameters() << std::endl;std::cout << "    Proportion: ";std::cout << "         " << estimator->GetProportions()[i] << std::endl;}return EXIT_SUCCESS;
}

运行输出结果:
前面20行分别是生成的2类,各10个样本,1类样本均值100,方差30;2类样本均值200,方差30.
21~24行是分类结果的1类参数;
25~28行是分类结果的2类参数;
占比之和为1;
参数应该是均值和方差,均值比较接近生成时的值 100和200,方差与原来的30差别巨大,还不知道怎么理解。

m[0] = 156.311
m[1] = 205.464
m[2] = 80.8426
m[3] = 136.952
m[4] = 86.6091
m[5] = 80.3185
m[6] = 107.911
m[7] = 63.1748
m[8] = 107.082
m[9] = 112.343
m[0] = 189.946
m[1] = 174.951
m[2] = 243.387
m[3] = 169.488
m[4] = 261.163
m[5] = 215.278
m[6] = 212.506
m[7] = 150.613
m[8] = 186.132
m[9] = 213.155
Cluster[0]Parameters:[91.04822175454494, 385.98395103056583]Proportion:          0.325826
Cluster[1]Parameters:[189.88473393439773, 1626.5175226586712]Proportion:          0.674174

后来在代码中添加了打印信息:

estimator->Print(std::cout);

打印输出:

ExpectationMaximizationMixtureModelEstimator (0000015D6BE586B0)RTTI typeinfo:   class itk::Statistics::ExpectationMaximizationMixtureModelEstimator<class itk::Statistics::ListSample<class itk::Vector<double,1> > >Reference Count: 1Modified Time: 74Debug: OffObject Name:Observers:noneMaximum Iteration: 100Sample: 0000015D6BE2B790Number Of Components: 2Component Membership Function[0]: 0000015D6BE53FC0Component Membership Function[1]: 0000015D6BE58540Termination Code: itk::Statistics::ExpectationMaximizationMixtureModelEstimatorEnums::TERMINATION_CODE::NOT_CONVERGEDInitial Proportions: [0.5, 0.5]Proportions: [0.3258255562923341, 0.6741744437076659]Calculated Expectation: -15.0301

从打印结果来看,EM算法更新了74次参数,设置的最大迭代次数是100,因此迭代次数是够用的,最终收敛期望是 -15.03, 退出代码说明 TERMINATION_CODE::NOT_CONVERGED 未收敛。
这是官方示例程序,所以不知道说啥。
正常理解应该是收敛到0附近。

参考:Distribute Sampling Using GMM EM

ITK学习笔记(八) ITK高斯混合模型 GMM EM相关推荐

  1. 【机器学习自学笔记6】高斯混合模型(GMM)

    我们知道生活中的很多现象,比如身高体重的分布,都满足高斯分布 (正态分布).而高斯混合模型,则是通过多个高斯分布的叠加,实现对数据集的拟合. 高斯分布 如果学过概率论,我们知道高斯分布的公式如下: X ...

  2. 【机器学习笔记11】高斯混合模型(GMM)【上篇】原理与推导

    文章目录 推荐阅读 前言 高斯混合模型简介 GMM与K-mean 高斯混合模型的概率密度函数 几何角度 混合模型角度 可能会弄混的地方 隐变量的分布与隐变量的后验概率分布 极大似然估计 EM算法求近似 ...

  3. ITK学习笔记(一)ITK的使用

    ITK学习笔记(一)ITK的使用 第一个ITK程序 1.CMakeLists.txt 2. 测试数据 3.代码 4.结果 ITK官方文档 第一个ITK程序 1.CMakeLists.txt # Thi ...

  4. ITK学习笔记(九) simpleITK重采样数据到固定尺寸

    ITK学习笔记(九) simpleITK重采样数据到固定尺寸 1.resampleSize 2.CT图像预处理之重采样 3.SKIMAGE.TRANSFORM-两种缩放皆可 4.Python Simp ...

  5. ITK学习笔记(二)最大圆度连通域提取

    ITK学习笔记(二)最大连通域提取 1.代码 1.1 code 1.2.生成的mask图片 1.3.打印信息 关于编译部分可以参考我的:VTK学习笔记(十)基于VTK和ITK程序 最大圆度概念: 圆度 ...

  6. ITK学习笔记(四)基于C++和ITK获取3D医学图像的最大连通区域

    ITK学习笔记(四)基于C++和ITK获取3D医学图像的最大连通区域 1.代码 2.效果 3.主要函数介绍 1.代码 #include "itkConnectedComponentImage ...

  7. ITK学习笔记(七) ITK旋转方向位置不变

    ITK学习笔记(七) ITK旋转方向位置不变 sitk使用的使LPS坐标系,与slicer中使用的RAS坐标系不同. 在sitk中的方向(1,1,1)(1,1,1)(1,1,1),在slicer中的方 ...

  8. ITK学习笔记(五) ITK计算质心

    ITK学习笔记(五) ITK计算质心 通过LabelGeometryImageFilter可以求Label Image各个区域的质心和BoundingBox.然而,如果图像的spacing不是1,它并 ...

  9. ITK学习笔记(十一) SimpleITK相关使用

    ITK学习笔记(十一) SimpleITK相关使用 参考:[SimpleITK]医疗影像分割结果评价指标计算 参考:Python SimpleITK.GetArrayViewFromImage方法代码 ...

最新文章

  1. mysql 非交互查询 存入execl
  2. python删除中文停用词_python词云 wordcloud+jieba生成中文词云图
  3. 通俗易懂讲解JavaScript深拷贝和浅拷贝
  4. 《统计学》学习笔记之数据的收集
  5. 在linux中which命令,Linux 中 which 命令怎么用?
  6. Office2010翻译无处不在
  7. 每个程序员都必须搞懂的抽象类和接口的含义以及区别
  8. Spring装配集合属性
  9. 挑战程序设计竞赛-小笔记
  10. [RTMP协议]常用直播流地址
  11. mysql 批量插入 性能_MySQL批量插入数据性能比较
  12. 横河涡街流量计安装参数说明及要求
  13. Civil 3d中的mms文件
  14. Unity入门——UI界面
  15. windows7下系统保护中出现错误“文件名、目录名或卷标语法不正确。(0x8007007B)“ 以及保护设置列表中出现“Windows7_os(c:)(找不到)”选项时的解决方法...
  16. MySql now函数
  17. 你还在观望吗?Creator3D小鲜肉《小鸭快跑》新鲜出炉!
  18. 在微信小程序中 使用uView rules 表单校验 validator 不起作用(无效)
  19. 珍惜人生路上的点点滴滴
  20. 外行人对软件测试的常见误解

热门文章

  1. 淮北最好吃的,不能错过的店
  2. html设置divid,HTML 代码 : divid=notMepid=notMe/p/div div id=myDivid=myDiv/div jQuery...
  3. 唯品会测试工程师实习生招聘2014春
  4. 大疆无人机5G图传 无人机视频回传指挥中心 WB7000MD-3K
  5. makefile编译时候出现 commands commence before first target
  6. 视频解码之软解与硬解
  7. KBEngine问题总结
  8. turtlebot matlab,Turtlebot与Matlab入门教程-控制小海龟
  9. iOS 禁用侧滑返回手势要点整理
  10. 京东青龙面板机器人搭建(零基础教程)