ITK/Examples/Broken/Statistics/ExpectationMaximizationMixtureModelEstimator 1D
From KitwarePublic
< ITK | Examples
Jump to navigationJump to search
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 ...")
Standard deviation estimates are way off.
ExpectationMaximizationMixtureModelEstimator_1D.cxx
<source lang="cpp">
- include "itkVector.h"
- include "itkListSample.h"
- include "itkGaussianMixtureModelComponent.h"
- include "itkExpectationMaximizationMixtureModelEstimator.h"
- 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>