/*
* File: MultivariateMonteCarloIntegrator.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Feb 12, 2010, Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the U.S. Government.
* Export of this program may require a license from the United States
* Government. See CopyrightHistory.txt for complete details.
*
*/
package gov.sandia.cognition.statistics.montecarlo;
import gov.sandia.cognition.evaluator.Evaluator;
import gov.sandia.cognition.math.matrix.Matrix;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.statistics.distribution.MultivariateGaussian;
import gov.sandia.cognition.util.AbstractCloneableSerializable;
import gov.sandia.cognition.util.DefaultWeightedValue;
import gov.sandia.cognition.util.WeightedValue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* A Monte Carlo integrator for multivariate (vector) outputs.
* @author Kevin R. Dixon
* @since 3.0
*/
public class MultivariateMonteCarloIntegrator
extends AbstractCloneableSerializable
implements MonteCarloIntegrator<Vector>
{
/**
* Default variance to add to the Gaussian, {@value}.
*/
public static final double DEFAULT_VARIANCE = 0.0;
/**
* Default instance because this class has no state.
*/
public static final MultivariateMonteCarloIntegrator INSTANCE =
new MultivariateMonteCarloIntegrator();
/**
* Creates a new instance of MultivariateMonteCarloIntegrator
*/
public MultivariateMonteCarloIntegrator()
{
}
public <SampleType> MultivariateGaussian.PDF integrate(
Collection<? extends SampleType> samples,
Evaluator<? super SampleType, ? extends Vector> expectationFunction)
{
ArrayList<Vector> outputs = new ArrayList<Vector>( samples.size() );
for( SampleType sample : samples )
{
outputs.add( expectationFunction.evaluate(sample).convertToVector() );
}
return MultivariateGaussian.MaximumLikelihoodEstimator.learn(
outputs, DEFAULT_VARIANCE );
}
public <SampleType> MultivariateGaussian.PDF integrate(
List<? extends WeightedValue<? extends SampleType>> samples,
Evaluator<? super SampleType, ? extends Vector> expectationFunction)
{
ArrayList<DefaultWeightedValue<Vector>> outputs =
new ArrayList<DefaultWeightedValue<Vector>>( samples.size() );
for( WeightedValue<? extends SampleType> sample : samples )
{
Vector output =
expectationFunction.evaluate(sample.getValue()).convertToVector();
outputs.add( new DefaultWeightedValue<Vector>(output, sample.getWeight()) );
}
return MultivariateGaussian.WeightedMaximumLikelihoodEstimator.learn(
outputs, DEFAULT_VARIANCE);
}
public MultivariateGaussian.PDF getMean(
Collection<? extends Vector> samples)
{
MultivariateGaussian.PDF pdf =
MultivariateGaussian.MaximumLikelihoodEstimator.learn(
samples,DEFAULT_VARIANCE);
Matrix C = pdf.getCovariance().scale( 1.0/samples.size() );
pdf.setCovariance(C);
return pdf;
}
public MultivariateGaussian.PDF getMean(
List<? extends WeightedValue<? extends Vector>> samples)
{
MultivariateGaussian.PDF pdf =
MultivariateGaussian.WeightedMaximumLikelihoodEstimator.learn(
samples,DEFAULT_VARIANCE);
double weightSum = 0.0;
double sumSquared = 0.0;
for( WeightedValue<? extends Vector> sample : samples )
{
final double w = sample.getWeight();
weightSum += w;
sumSquared += w*w;
}
double ws2 = weightSum*weightSum;
Matrix C = pdf.getCovariance().scale( sumSquared / ws2 );
pdf.setCovariance(C);
return pdf;
}
}