using Microsoft.ML.Probabilistic.Models;
using Microsoft.ML.Probabilistic.Math;
using Microsoft.ML.Probabilistic.Distributions;
using Microsoft.ML.Probabilistic.Distributions.Kernels;
public static void Main()
InferenceEngine engine = new InferenceEngine();
Console.WriteLine("This example only runs with Expectation Propagation");
Vector[] inputs = new Vector[]{
Vector.FromArray(new double[2]{0, 0}),
Vector.FromArray(new double[2]{0, 1}),
Vector.FromArray(new double[2]{1, 0}),
Vector.FromArray(new double[2]{0, 0.5}),
Vector.FromArray(new double[2]{1.5, 0}),
Vector.FromArray(new double[2]{0.5, 1.0})};
bool[] outputs = {true, true, false, true, false, false};
Variable<bool> evidence = Variable.Bernoulli(0.5).Named("evidence");
IfBlock block = Variable.If(evidence);
Variable<SparseGP> prior = Variable.New<SparseGP>().Named("prior");
Variable<IFunction> f = Variable<IFunction>.Random(prior).Named("f");
VariableArray<Vector> x = Variable.Observed(inputs).Named("x");
Range j = x.Range.Named("j");
VariableArray<bool> y = Variable.Observed(outputs, j).Named("y");
Variable<double> score = Variable.FunctionEvaluate(f, x[j]).Named("score");
y[j] = (Variable.GaussianFromMeanAndVariance(score, 0.1) > 0);
Vector[] basis = new Vector[]{
Vector.FromArray(new double[2]{0.2, 0.2}),
Vector.FromArray(new double[2]{0.2, 0.8}),
Vector.FromArray(new double[2]{0.8, 0.2}),
Vector.FromArray(new double[2]{0.8, 0.8})};
for (int trial = 0; trial < 3; trial++)
kf = new SquaredExponential(-0.0);
kf = new SquaredExponential(-0.5);
kf = new NNKernel(new double[]{0.0, 0.0}, -1.0);
GaussianProcess gp = new GaussianProcess(new ConstantFunction(0), kf);
prior.ObservedValue = new SparseGP(new SparseGPFixed(gp, basis));
double NNscore = engine.Infer<Bernoulli>(evidence).LogOdds;
Console.WriteLine("{0} evidence = {1}", kf, NNscore.ToString("g4"));
SparseGP sgp = engine.Infer<SparseGP>(f);
Console.WriteLine("Predictions on training set:");
for (int i = 0; i < outputs.Length; i++)
Gaussian post = sgp.Marginal(inputs[i]);
double postMean = post.GetMean();
string comment = (outputs[i] == (postMean > 0.0)) ? "correct" : "incorrect";
Console.WriteLine("f({0}) = {1} ({2})", inputs[i], post, comment);