/*
* File: UnivariateMonteCarloIntegrator.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.statistics.distribution.UnivariateGaussian;
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 univariate (scalar) outputs.
* @author Kevin R. Dixon
* @since 3.0
*/
public class UnivariateMonteCarloIntegrator
extends AbstractCloneableSerializable
implements MonteCarloIntegrator<Double>
{
/**
* 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 UnivariateMonteCarloIntegrator INSTANCE =
new UnivariateMonteCarloIntegrator();
/**
* Creates a new instance of UnivariateMonteCarloIntegrator
*/
public UnivariateMonteCarloIntegrator()
{
}
public <SampleType> UnivariateGaussian.PDF integrate(
Collection<? extends SampleType> samples,
Evaluator<? super SampleType, ? extends Double> expectationFunction)
{
ArrayList<Double> outputs = new ArrayList<Double>( samples.size() );
for( SampleType sample : samples )
{
outputs.add( expectationFunction.evaluate(sample).doubleValue() );
}
return this.getMean(outputs);
}
public <SampleType> UnivariateGaussian.PDF integrate(
List<? extends WeightedValue<? extends SampleType>> samples,
Evaluator<? super SampleType, ? extends Double> expectationFunction)
{
ArrayList<DefaultWeightedValue<Double>> outputs =
new ArrayList<DefaultWeightedValue<Double>>( samples.size() );
for( WeightedValue<? extends SampleType> sample : samples )
{
Double output = expectationFunction.evaluate(sample.getValue());
outputs.add( new DefaultWeightedValue<Double>(output, sample.getWeight()) );
}
return this.getMean(outputs);
}
public UnivariateGaussian.PDF getMean(
Collection<? extends Double> samples)
{
UnivariateGaussian.PDF pdf =
UnivariateGaussian.MaximumLikelihoodEstimator.learn(
samples,DEFAULT_VARIANCE);
pdf.setVariance( pdf.getVariance() / samples.size() );
return pdf;
}
public UnivariateGaussian.PDF getMean(
List<? extends WeightedValue<? extends Double>> samples)
{
UnivariateGaussian.PDF pdf =
UnivariateGaussian.WeightedMaximumLikelihoodEstimator.learn(
samples,DEFAULT_VARIANCE);
double weightSum = 0.0;
double sumSquared = 0.0;
for( WeightedValue<? extends Double> sample : samples )
{
final double w = sample.getWeight();
weightSum += w;
sumSquared += w*w;
}
double ws2 = weightSum*weightSum;
pdf.setVariance( pdf.getVariance() * sumSquared / ws2 );
return pdf;
}
}