ITK  5.4.0
Insight Toolkit
SphinxExamples/src/Numerics/Statistics/2DGaussianMixtureModelExpectMax/Code.cxx
/*=========================================================================
*
* Copyright NumFOCUS
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/
#include "itkVector.h"
#include "itkListSample.h"
int
main()
{
unsigned int numberOfClasses = 2;
using MeasurementVectorType = itk::Vector<double, 2>;
auto sample = SampleType::New();
using NormalGeneratorType = itk::Statistics::NormalVariateGenerator;
auto normalGenerator = NormalGeneratorType::New();
// Create the first set of 2D Gaussian samples
normalGenerator->Initialize(101);
MeasurementVectorType mv;
double mean = 100;
double standardDeviation = 30;
for (unsigned int i = 0; i < 100; ++i)
{
mv[0] = (normalGenerator->GetVariate() * standardDeviation) + mean;
mv[1] = (normalGenerator->GetVariate() * standardDeviation) + mean;
sample->PushBack(mv);
}
// Create the second set of 2D Gaussian samples
normalGenerator->Initialize(3024);
mean = 200;
standardDeviation = 30;
for (unsigned int i = 0; i < 100; ++i)
{
mv[0] = (normalGenerator->GetVariate() * standardDeviation) + mean;
mv[1] = (normalGenerator->GetVariate() * standardDeviation) + mean;
sample->PushBack(mv);
}
using ParametersType = itk::Array<double>;
ParametersType params(6);
// Create the first set of initial parameters
std::vector<ParametersType> initialParameters(numberOfClasses);
params[0] = 110.0; // mean of dimension 1
params[1] = 115.0; // mean of dimension 2
params[2] = 800.0; // covariance(0,0)
params[3] = 0; // covariance(0,1)
params[4] = 0; // covariance(1,0)
params[5] = 805.0; // covariance(1,1)
initialParameters[0] = params;
// Create the second set of initial parameters
params[0] = 210.0; // mean of dimension 1
params[1] = 215.0; // mean of dimension 2
params[2] = 850.0; // covariance(0,0)
params[3] = 0; // covariance(0,1)
params[4] = 0; // covariance(1,0)
params[5] = 855.0; // covariance(1,1)
initialParameters[1] = params;
// Create the components
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]);
}
auto estimator = EstimatorType::New();
estimator->SetSample(sample);
estimator->SetMaximumIteration(200);
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();
// Output the results
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;
}
itk::Vector
A templated class holding a n-Dimensional vector.
Definition: itkVector.h:62
itk::Statistics::ListSample
This class is the native implementation of the a Sample with an STL container.
Definition: itkListSample.h:51
itkExpectationMaximizationMixtureModelEstimator.h
itk::Statistics::ExpectationMaximizationMixtureModelEstimator
This class generates the parameter estimates for a mixture model using expectation maximization strat...
Definition: itkExpectationMaximizationMixtureModelEstimator.h:86
itk::Statistics::NormalVariateGenerator
Normal random variate generator.
Definition: itkNormalVariateGenerator.h:98
itkListSample.h
itkGaussianMixtureModelComponent.h
itk::Statistics::GaussianMixtureModelComponent
is a component (derived from MixtureModelComponentBase) for Gaussian class. This class is used in Exp...
Definition: itkGaussianMixtureModelComponent.h:51
itkNormalVariateGenerator.h
itkVector.h
itk::Array< double >
New
static Pointer New()
Superclass
BinaryGeneratorImageFilter< TInputImage1, TInputImage2, TOutputImage > Superclass
Definition: itkAddImageFilter.h:90