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

ITK学习笔记(八) 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: 1
  Modified Time: 74
  Debug: Off
  Object Name:
  Observers:
    none
  Maximum Iteration: 100
  Sample: 0000015D6BE2B790
  Number Of Components: 2
  Component Membership Function[0]: 0000015D6BE53FC0
  Component Membership Function[1]: 0000015D6BE58540
  Termination Code: itk::Statistics::ExpectationMaximizationMixtureModelEstimatorEnums::TERMINATION_CODE::NOT_CONVERGED
  Initial 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值