Infer.NET——为热爱概率的人准备的库

目录

介绍

背景

概率介绍

在VS 2017社区版中安装Infer.NET库

一个Infer.NET程序

使用代码

结论


介绍

Infer.NET是一个开源库,可用于创建概率编程系统。我们可以使用Infer.NET来解决许多不同类型的机器学习问题,例如分类,推荐等。在本文中,我将介绍如何在Visual Studio 2017社区版中使用 infer.NET库。Infer.NET同时支持C#和F#,我将在本文中使用C#。

背景

概率介绍

假设我们有一个包含六个球的盒子——一个红球和五个蓝球。我们被允许随机拿起球2次:

当我们拿起一个球时,有两种可能的结果:红球或蓝球。挑选红球的概率是p = 1/6 = 0.17,并且挑选蓝球的概率是q = 1 - p = 5/6 = 0.83。如果我们两次拿球,可能会出现四种可能的结果,如下表所示:

为了表示每次拾取,我们可以使用布尔变量,其中true表示拾取红球false表示拾取蓝球。布尔值上的分布有一些概率为真,称为伯努利分布。因此,我们可以通过从伯努利分布创建布尔随机变量来模拟每次拾取。

请注意,首次拾取和第二次拾取是独立的。因此,在拾取上挑选红球的概率和在第二次拾取上挑选红球的概率是(1/6 * 1/6= 0.17 * 0.17 = 0.0289(你可以在这里找到关于伯努利分布的细节)。

很好,现在我们将使用infer.NET来计算我们的概率。但首先,我们需要在Visual Studio 2017社区版中安装infer.NET

VS 2017社区版中安装Infer.NET

为简单起见,我们将创建一个控制台应用程序C#(.NET Framework)并命名它为InferDotNetDemo。我们还需要选择.NET Framework4.7版本(或更高版本),因为我们可能会在早期版本中遇到一些错误。

Solution Explorer窗口中,我们还将Program.cs重命名为InferDotNetDemo.cs

我们可以通过右键单击InferDotNetDemo项目并选择Manage NuGet Packages 来安装Infer.NET 

NuGet窗口中,我们选择Browse选项卡并在Search字段中输入'Infer.net'。最后,我们选择Microsoft.ML.Probabilistic.Compiler并单击Install按钮:

单击预览更改中的确定

然后在许可证接受中单击我接受

几秒钟后,Visual Studio将在输出窗口中响应一条消息:

一个Infer.NET程序

Infer.NET程序包括三个关键步骤:

  • 步骤1:概率模型的定义

所有Infer.NET程序都需要定义概率模型。在我们的演示中们可以通过定义随机变量来定义模型,这些随机变量代表伯努利分布的第一次拾取和第二次拾取。

  • 2步:创建推理引擎

所有推论都是通过使用InferenceEngine类来推理引擎来实现的。

  • 3步:执行推理查询

给定推理引擎,您可以使用Infer()查询变量的边际分布。

使用代码

到目前为止,我们可以为我们的程序编写一些C#代码行。首先,我们将通过定义伯努利分布中的随机变量来定义概率模型,其中1/6 = 0.17为真:

Variable<bool> firstPicking = Variable.Bernoulli(0.17);
Variable<bool> secondPicking = Variable.Bernoulli(0.17);

制作随机变量的另一种方法是使用包含其他随机变量的表达式来导出它,如下所示:

Variable<bool> bothReds = firstPicking & secondPicking;

这里,只有两个firstPickingsecondPicking都是true时,bothReds才是true,因此它代表了两个选择都是红球的情况。

其次,我们创建了一个变量bothReds,我们将通过创建一个使用默认推理算法(Expectation Propagation)的推理引擎来找出它的分布:

InferenceEngine ie = new InferenceEngine();

我们可以使用此引擎的Infer()方法来查询bothReds变量的边际分布:

Console.WriteLine("Probability both pickings are a red ball: " + ie.Infer(bothReds));

InferDotNetDemo.cs文件中的所有代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ML.Probabilistic.Models;
using Microsoft.ML.Probabilistic.Algorithms;
using Microsoft.ML.Probabilistic.Distributions;

namespace ConsoleApp1
{
    class InferDemoProgram
    {
        static void Main(string[] args)
        {
            //**************Step 1: Define a probabilistic model*************************
            //creating a random variable for first picking
            Variable<bool> firstPicking = Variable.Bernoulli(0.17);
            //creating a random variable for second picking
            Variable<bool> secondPicking = Variable.Bernoulli(0.17);
            //creating a random variable based on other random variables
            Variable<bool> bothReds = firstPicking & secondPicking;
            //**************Step 2: Creating an inference engine*************************
            InferenceEngine ie = new InferenceEngine();
            //**************Step 3: Execution of an inference query*************************
            //Using Expectation Propagation - the default algorithm
            if (!(ie.Algorithm is VariationalMessagePassing))
             {
                Console.WriteLine("Probability both pickings are a red ball: " + ie.Infer(bothReds));
             }
            else
                Console.WriteLine("Not run with Variational Message Passing!");
            Console.ReadKey();
        }
    }
}

运行我们的应用程序并获得如下所示的结果:

结论

在本文中,我只介绍了基本的Infer.NET库。如果您想了解有关此库的更多信息,可以参考下面的一些最佳来源:

 

原文地址:https://www.codeproject.com/Articles/1278872/Infer-NET-A-Library-for-People-Who-Love-Probabilit

猜你喜欢

转载自blog.csdn.net/mzl87/article/details/88383346