public static List<NetworkState> findModesBySimulatedAnnealing(BayesianNetwork network, int attempts, int samplesPerAttempt, KeanuRandom random) { List<NetworkState> maxSamples = new ArrayList<>(); network.cascadeObservations(); List<Vertex> sortedByDependency = TopologicalSort.sort(network.getLatentVertices()); for (int i = 0; i < attempts; i++) { BayesianNetwork.setFromSampleAndCascade(sortedByDependency, random); KeanuProbabilisticModel model = new KeanuProbabilisticModel(network); NetworkState maxAPosteriori = Keanu.Sampling.SimulatedAnnealing.withDefaultConfigFor(model, random).getMaxAPosteriori(model, samplesPerAttempt); maxSamples.add(maxAPosteriori); } return maxSamples; } }
public static io.improbable.keanu.algorithms.mcmc.SimulatedAnnealing withDefaultConfigFor(KeanuProbabilisticModel model) { return withDefaultConfigFor(model, KeanuRandom.getDefaultRandom()); }
@Test public void findsMaxAposterioriWithAnnealing() { BayesianNetwork network = new BayesianNetwork(A.getConnectedGraph()); network.probeForNonZeroProbability(100, random); KeanuProbabilisticModel model = new KeanuProbabilisticModel(network); NetworkState maxAPosterioriSamples = Keanu.Sampling.SimulatedAnnealing.withDefaultConfigFor(model, random).getMaxAPosteriori(model, 10000); NetworkState maxValuesFromVariational = findMAPWithOptimizer(); assertEquals(maxValuesFromVariational.get(A).scalar(), maxAPosterioriSamples.get(A).scalar(), 0.05); assertEquals(maxValuesFromVariational.get(B).scalar(), maxAPosterioriSamples.get(B).scalar(), 0.05); }