public static io.improbable.keanu.algorithms.mcmc.SimulatedAnnealing withDefaultConfigFor(KeanuProbabilisticModel model, KeanuRandom random) { return builder() .proposalDistribution(new PriorProposalDistribution(model.getLatentVertices())) .rejectionStrategy(new RollbackAndCascadeOnRejection(model.getLatentVertices())) .random(random) .build(); }
@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); }
.proposalDistribution(proposalDistribution) .variableSelector(MHStepVariableSelector.SINGLE_VARIABLE_SELECTOR) .rejectionStrategy(new RollbackAndCascadeOnRejection(model.getLatentVertices())) .build(), samplingCount);
.proposalDistribution(proposalDistribution) .variableSelector(MHStepVariableSelector.SINGLE_VARIABLE_SELECTOR) .rejectionStrategy(new RollbackAndCascadeOnRejection(model.getLatentVertices())) .build(), samplingCount);
@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); }