ITK/Examples/Broken/Statistics/ExpectationMaximizationMixtureModelEstimator 1D

From KitwarePublic
< ITK‎ | Examples
Revision as of 14:10, 22 November 2010 by Daviddoria (talk | contribs) (Created page with "Standard deviation estimates are way off. ==ExpectationMaximizationMixtureModelEstimator_1D.cxx== <source lang="cpp"> #include "itkVector.h" #include "itkListSample.h" #include ...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Standard deviation estimates are way off.

ExpectationMaximizationMixtureModelEstimator_1D.cxx

<source lang="cpp">

  1. include "itkVector.h"
  2. include "itkListSample.h"
  3. include "itkGaussianMixtureModelComponent.h"
  4. include "itkExpectationMaximizationMixtureModelEstimator.h"
  5. include "itkNormalVariateGenerator.h"

int main(int, char*[]) {

 unsigned int numberOfClasses = 2;
 typedef itk::Vector< double, 1 > MeasurementVectorType;
 typedef itk::Statistics::ListSample< MeasurementVectorType > SampleType;
 SampleType::Pointer sample = SampleType::New();
 //sample->SetMeasurementVectorSize(1); // length of measurement vectors
 typedef itk::Statistics::NormalVariateGenerator NormalGeneratorType;
 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 );
   }
 typedef itk::Array< double > ParametersType;
 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;
 typedef itk::Statistics::GaussianMixtureModelComponent< SampleType > ComponentType;
 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] );
   }
 typedef itk::Statistics::ExpectationMaximizationMixtureModelEstimator<
                          SampleType > EstimatorType;
 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;

} </source>

CMakeLists.txt

<source lang="cmake"> cmake_minimum_required(VERSION 2.6)

PROJECT(ExpectationMaximizationMixtureModelEstimator)

FIND_PACKAGE(ITK REQUIRED) INCLUDE(${ITK_USE_FILE})

ADD_EXECUTABLE(ExpectationMaximizationMixtureModelEstimator_1D ExpectationMaximizationMixtureModelEstimator_1D.cxx) TARGET_LINK_LIBRARIES(ExpectationMaximizationMixtureModelEstimator_1D ITKBasicFilters ITKCommon ITKIO ITKStatistics)

</source>