public static io.improbable.keanu.algorithms.mcmc.MetropolisHastings.MetropolisHastingsBuilder builder() { return io.improbable.keanu.algorithms.mcmc.MetropolisHastings.builder(); } }
@Test public void samplesContinuousPriorSingleVariableSelected() { MCMCTestCase testCase = new SumGaussianTestCase(); BayesianNetwork bayesNet = testCase.getModel(); KeanuProbabilisticModel model = new KeanuProbabilisticModel(bayesNet); NetworkSamples posteriorSamples = MetropolisHastings.builder() .proposalDistribution(new PriorProposalDistribution(model.getLatentVertices())) .rejectionStrategy(new RollBackToCachedValuesOnRejection(model.getLatentVertices())) .variableSelector(MHStepVariableSelector.SINGLE_VARIABLE_SELECTOR) .build() .getPosteriorSamples( model, model.getLatentVertices(), 5000 ); testCase.assertExpected(posteriorSamples); }
@Test public void samplesContinuousPriorAllVariablesSelected() { MCMCTestCase testCase = new SumGaussianTestCase(); BayesianNetwork bayesNet = testCase.getModel(); KeanuProbabilisticModel model = new KeanuProbabilisticModel(bayesNet); NetworkSamples posteriorSamples = MetropolisHastings.builder() .proposalDistribution(new PriorProposalDistribution(model.getLatentVertices())) .rejectionStrategy(new RollBackToCachedValuesOnRejection(model.getLatentVertices())) .variableSelector(MHStepVariableSelector.FULL_VARIABLE_SELECTOR) .build() .getPosteriorSamples( model, model.getLatentVertices(), 5000 ); testCase.assertExpected(posteriorSamples); }
@Test public void youCanUseAGaussianProposal() { DoubleVertex A = new GaussianVertex(20.0, 1.0); DoubleVertex B = new GaussianVertex(20.0, 1.0); A.setValue(20.0); B.setValue(20.0); DoubleVertex Cobserved = new GaussianVertex(A.plus(B), 1.0); Cobserved.observe(46.0); BayesianNetwork bayesNet = new BayesianNetwork(Arrays.asList(A, B, Cobserved)); bayesNet.probeForNonZeroProbability(100); ProposalDistribution proposalDistribution = new GaussianProposalDistribution(DoubleTensor.scalar(1.)); MetropolisHastings metropolisHastings = MetropolisHastings.builder() .proposalDistribution(proposalDistribution) .rejectionStrategy(new RollbackAndCascadeOnRejection(bayesNet.getLatentVertices())) .build(); NetworkSamples posteriorSamples = metropolisHastings.getPosteriorSamples( new KeanuProbabilisticModel(bayesNet), Arrays.asList(A, B), 1000 ); double averagePosteriorA = posteriorSamples.getDoubleTensorSamples(A).getAverages().scalar(); double averagePosteriorB = posteriorSamples.getDoubleTensorSamples(B).getAverages().scalar(); double actual = averagePosteriorA + averagePosteriorB; assertEquals(44.0, actual, 0.1); }
@Category(Slow.class) @Test public void samplesComplexDiscreteWithFullVariableSelect() { MCMCTestCase testCase = new MultiVariateDiscreteTestCase(); BayesianNetwork bayesNet = testCase.getModel(); KeanuProbabilisticModel model = new KeanuProbabilisticModel(bayesNet); NetworkSamples posteriorSamples = MetropolisHastings.builder() .proposalDistribution(new PriorProposalDistribution(model.getLatentVertices())) .rejectionStrategy(new RollBackToCachedValuesOnRejection(model.getLatentVertices())) .variableSelector(MHStepVariableSelector.FULL_VARIABLE_SELECTOR) .build() .getPosteriorSamples( model, model.getLatentVertices(), 1000 ); testCase.assertExpected(posteriorSamples); }
BayesianNetwork network = new BayesianNetwork(start.getConnectedGraph()); MetropolisHastings.builder() .proposalDistribution(new PriorProposalDistribution(network.getLatentVertices())) .rejectionStrategy(new RollBackToCachedValuesOnRejection(network.getLatentVertices()))
SamplingModelFitting sampling = new SamplingModelFitting(model -> MetropolisHastings.builder() .proposalDistribution(proposalDistribution) .variableSelector(MHStepVariableSelector.SINGLE_VARIABLE_SELECTOR)
SamplingModelFitting sampling = new SamplingModelFitting(model -> MetropolisHastings.builder() .proposalDistribution(proposalDistribution) .variableSelector(MHStepVariableSelector.SINGLE_VARIABLE_SELECTOR)
@Category(Slow.class) @Test public void youCanChooseSamplingInsteadOfGradientOptimization() { final int smallRawDataSize = 20; final int samplingCount = 5000; LinearRegressionTestUtils.TestData data = LinearRegressionTestUtils.generateSingleFeatureData(smallRawDataSize); ProposalDistribution proposalDistribution = new GaussianProposalDistribution(DoubleTensor.scalar(0.25)); SamplingModelFitting sampling = new SamplingModelFitting(model -> MetropolisHastings.builder() .proposalDistribution(proposalDistribution) .variableSelector(MHStepVariableSelector.SINGLE_VARIABLE_SELECTOR) .rejectionStrategy(new RollbackAndCascadeOnRejection(model.getLatentVertices())) .build(), samplingCount); RegressionModel linearRegressionModel = RegressionModel.withTrainingData(data.xTrain, data.yTrain) .withRegularization(RegressionRegularization.LASSO) .withPriorOnIntercept(0, data.intercept) .withPriorOnWeights( DoubleTensor.create(0., data.weights.getShape()), data.weights ) .withSampling(sampling) .build(); NetworkSamples networkSamples = sampling.getNetworkSamples().drop(samplingCount / 10).downSample(2); assertSampledWeightsAndInterceptMatchTestData( networkSamples.getDoubleTensorSamples(linearRegressionModel.getWeightVertex().getId()), networkSamples.getDoubleTensorSamples(linearRegressionModel.getInterceptVertex().getId()), data); }