AnyType dist_norm1::run(AnyType& args) { return distNorm1( args[0].getAs<MappedColumnVector>(), args[1].getAs<MappedColumnVector>() ); }
int main(int argc, char** argv) { NormalDistribution<1> distNorm1(5, 5); std::vector<double> samplesNorm1; distNorm1.getSamples(samplesNorm1, 1000); EstimatorML<NormalDistribution<1> > estNorm1; estNorm1.addPoints(samplesNorm1.begin(), samplesNorm1.end()); std::cout << "Estimation1: " << std::endl << estNorm1 << std::endl; NormalDistribution<2> distNorm2(Eigen::Matrix<double, 2, 1>(5, 5), (Eigen::Matrix<double, 2, 2>() << 5.0, 0.5, 0.5, 5.0).finished()); std::vector<Eigen::Matrix<double, 2, 1> > samplesNorm2; distNorm2.getSamples(samplesNorm2, 1000); EstimatorML<NormalDistribution<2> > estNorm2; estNorm2.addPoints(samplesNorm2.begin(), samplesNorm2.end()); std::cout << "Estimation2: " << std::endl << estNorm2 << std::endl; CategoricalDistribution<4> distCat4( (Eigen::Matrix<double, 4, 1>() << 0.1, 0.2, 0.2, 0.5).finished()); std::vector<Eigen::Matrix<int, 4, 1> > samplesCat4; distCat4.getSamples(samplesCat4, 1000); EstimatorML<CategoricalDistribution<4> > estCat4; estCat4.addPoints(samplesCat4.begin(), samplesCat4.end()); std::cout << "Estimation3: " << std::endl << estCat4 << std::endl; MultinomialDistribution<4> distMult4(20, (Eigen::Matrix<double, 4, 1>() << 0.1, 0.2, 0.2, 0.5).finished()); std::vector<Eigen::Matrix<int, 4, 1> > samplesMult4; distMult4.getSamples(samplesMult4, 1000); EstimatorML<MultinomialDistribution<4> > estMult4; estMult4.addPoints(samplesMult4.begin(), samplesMult4.end()); std::cout << "Estimation4: " << std::endl << estMult4 << std::endl; ExponentialDistribution distExp(5); std::vector<double> samplesExp; distExp.getSamples(samplesExp, 1000); EstimatorML<ExponentialDistribution> estExp; estExp.addPoints(samplesExp.begin(), samplesExp.end()); std::cout << "Estimation5: " << std::endl << estExp << std::endl; GeometricDistribution distGeom(0.7); std::vector<int> samplesGeom; distGeom.getSamples(samplesGeom, 1000); EstimatorML<GeometricDistribution> estGeom; estGeom.addPoints(samplesGeom.begin(), samplesGeom.end()); std::cout << "Estimation6: " << std::endl << estGeom << std::endl; PoissonDistribution distPois(5.0); std::vector<int> samplesPois; distPois.getSamples(samplesPois, 1000); EstimatorML<PoissonDistribution> estPois; estPois.addPoints(samplesPois.begin(), samplesPois.end()); std::cout << "Estimation7: " << std::endl << estPois << std::endl; LinearRegression<2> distLine(LinearBasisFunction<double, 2>( Eigen::Matrix<double, 2, 1>(2.0, 2.0)), 2.0); std::vector<Eigen::Matrix<double, 2, 1> > samplesLine; for (double x = -10; x < 10; x += 0.01) { distLine.setBasis((Eigen::Matrix<double, 1, 1>() << x).finished()); samplesLine.push_back(distLine.getSample()); } EstimatorML<LinearRegression<2> > estLine; estLine.addPoints(samplesLine.begin(), samplesLine.end()); std::cout << "Estimation8: " << std::endl << estLine << std::endl; std::vector<NormalDistribution<1> > distributionsNorm1; distributionsNorm1.push_back(NormalDistribution<1>(0, 1.5)); distributionsNorm1.push_back(NormalDistribution<1>(5, 1.7)); distributionsNorm1.push_back(NormalDistribution<1>(10, 1.2)); distributionsNorm1.push_back(NormalDistribution<1>(-5, 1.3)); distributionsNorm1.push_back(NormalDistribution<1>(-10, 1.5)); MixtureSampleDistribution<NormalDistribution<1>, 5> distMixtNorm1( distributionsNorm1, CategoricalDistribution<5>( (Eigen::Matrix<double, 5, 1>() << 0.1, 0.2, 0.2, 0.4, 0.1).finished())); std::vector<double> samplesMixtNorm1; distMixtNorm1.getSamples(samplesMixtNorm1, 1000); std::vector<NormalDistribution<1> > distributionsNorm1Init; distributionsNorm1Init.push_back(NormalDistribution<1>(1, 2.4)); distributionsNorm1Init.push_back(NormalDistribution<1>(6, 3.1)); distributionsNorm1Init.push_back(NormalDistribution<1>(12, 4.7)); distributionsNorm1Init.push_back(NormalDistribution<1>(-5.5, 2.1)); distributionsNorm1Init.push_back(NormalDistribution<1>(-9.5, 1.4)); MixtureSampleDistribution<NormalDistribution<1>, 5> distMixtNorm1Init( distributionsNorm1Init, CategoricalDistribution<5>()); EstimatorML<MixtureDistribution<NormalDistribution<1>, 5> > estMixtNorm1(distMixtNorm1Init); size_t numIter = estMixtNorm1.addPointsEM(samplesMixtNorm1.begin(), samplesMixtNorm1.end()); std::cout << "Estimation9: " << std::endl << estMixtNorm1 << std::endl; std::cout << "Converged in: " << numIter << " iterations" << std::endl; estMixtNorm1 = EstimatorML<MixtureDistribution<NormalDistribution<1>, 5> > (distMixtNorm1Init); numIter = estMixtNorm1.addPointsCEM(samplesMixtNorm1.begin(), samplesMixtNorm1.end()); std::cout << "Estimation10: " << std::endl << estMixtNorm1 << std::endl; std::cout << "Converged in: " << numIter << " iterations" << std::endl; estMixtNorm1 = EstimatorML<MixtureDistribution<NormalDistribution<1>, 5> > (distMixtNorm1Init); numIter = estMixtNorm1.addPointsSEM(samplesMixtNorm1.begin(), samplesMixtNorm1.end()); std::cout << "Estimation11: " << std::endl << estMixtNorm1 << std::endl; std::cout << "Converged in: " << numIter << " iterations" << std::endl; std::vector<NormalDistribution<3> > distributionsNorm3; distributionsNorm3.push_back(NormalDistribution<3>( Eigen::Matrix<double, 3, 1>(0, 0, 0), Eigen::Matrix<double, 3, 3>::Identity())); distributionsNorm3.push_back(NormalDistribution<3>( Eigen::Matrix<double, 3, 1>(5, 5, 5), Eigen::Matrix<double, 3, 3>::Identity())); distributionsNorm3.push_back(NormalDistribution<3>( Eigen::Matrix<double, 3, 1>(10, 10, 10), Eigen::Matrix<double, 3, 3>::Identity())); distributionsNorm3.push_back(NormalDistribution<3>( Eigen::Matrix<double, 3, 1>(-5, -5, -5), Eigen::Matrix<double, 3, 3>::Identity())); distributionsNorm3.push_back(NormalDistribution<3>( Eigen::Matrix<double, 3, 1>(-10, -10, -10), Eigen::Matrix<double, 3, 3>::Identity())); MixtureSampleDistribution<NormalDistribution<3>, 5> distMixtNorm3( distributionsNorm3, CategoricalDistribution<5>()); std::vector<Eigen::Matrix<double, 3, 1> > samplesMixtNorm3; distMixtNorm3.getSamples(samplesMixtNorm3, 1000); std::vector<NormalDistribution<3> > distributionsNorm3Init; distributionsNorm3Init.push_back(NormalDistribution<3>( Eigen::Matrix<double, 3, 1>(0.1, 0.2, 0.3))); distributionsNorm3Init.push_back(NormalDistribution<3>( Eigen::Matrix<double, 3, 1>(5.5, 6, 5.1))); distributionsNorm3Init.push_back(NormalDistribution<3>( Eigen::Matrix<double, 3, 1>(10.5, 11, 12))); distributionsNorm3Init.push_back(NormalDistribution<3>( Eigen::Matrix<double, 3, 1>(-5, -5.4, -4.2))); distributionsNorm3Init.push_back(NormalDistribution<3>( Eigen::Matrix<double, 3, 1>(-10.5, -10.2, -11))); MixtureSampleDistribution<NormalDistribution<3>, 5> distMixtNorm3Init( distributionsNorm3Init, CategoricalDistribution<5>()); EstimatorML<MixtureDistribution<NormalDistribution<3>, 5> > estMixtNorm3( distMixtNorm3Init); numIter = estMixtNorm3.addPointsEM(samplesMixtNorm3.begin(), samplesMixtNorm3.end()); std::cout << "Estimation12: " << std::endl << estMixtNorm3 << std::endl; std::cout << "Converged in: " << numIter << " iterations" << std::endl; std::vector<LinearRegression<2> > distLines; distLines.push_back(LinearRegression<2>(LinearBasisFunction<double, 2>( Eigen::Matrix<double, 2, 1>(1.0, 1.0)), 1.5)); distLines.push_back(LinearRegression<2>(LinearBasisFunction<double, 2>( Eigen::Matrix<double, 2, 1>(2.0, 2.0)), 1.2)); distLines.push_back(LinearRegression<2>(LinearBasisFunction<double, 2>( Eigen::Matrix<double, 2, 1>(-1.0, -1.0)), 2.1)); distLines.push_back(LinearRegression<2>(LinearBasisFunction<double, 2>( Eigen::Matrix<double, 2, 1>(-2.0, -2.0)), 2.5)); MixtureSampleDistribution<LinearRegression<2>, 4> distMixtLines(distLines, CategoricalDistribution<4>()); std::vector<Eigen::Matrix<double, 2, 1> > samplesMixtLines; for (size_t i = 0; i < 100; ++i) for (double x = -10; x < 10; x += 0.1) { for (size_t j = 0; j < distLines.size(); ++j) distLines[j].setBasis((Eigen::Matrix<double, 1, 1>() << x).finished()); distMixtLines.setCompDistributions(distLines); samplesMixtLines.push_back(distMixtLines.getSample()); } EstimatorML<MixtureDistribution<LinearRegression<2>, 4> > estMixtLines( distMixtLines); numIter = estMixtLines.addPointsEM(samplesMixtLines.begin(), samplesMixtLines.end()); std::cout << "Estimation13: " << std::endl << estMixtLines << std::endl; std::cout << "Converged in: " << numIter << " iterations" << std::endl; return 0; }