本文介绍了如何使用 Infer.NET 进行概率性编程。 概率性编程是一种将自定义模型表示为计算机程序的机器学习方法。 借助它可以在模型中包含专业知识,使机器学习系统更易理解。 它还支持在线推断,即在新数据到达时进行学习的过程。 Azure、Xbox 及必应中的多种 Microsoft 产品均使用了 Infer.NET。

什么是概率性编程?

基于概率性编程,创建对真实世界过程的统计模型。

系统必备

  • 本地.NET开发环境设置

创建应用程序

  1. 打开一个新的命令提示符,并运行下面的命令:
dotnet new console -o myApp
cd myApp

dotnet 命令将创建 console 类型的 new 应用程序。 -o 参数将创建名称为 myApp 的目录,会在其中存储应用并填充所需的文件。 cd myApp 命令会将你转到新创建的应用目录。

安装 Infer.NET 包

需安装 Microsoft.ML.Probabilistic.Compiler 包才能使用 Infer.NET。 在命令提示符中运行下面的命令:

dotnet add package Microsoft.ML.Probabilistic.Compiler

设计模型

示例使用在室内中进行的乒乓球或桌上足球比赛。 我们具有参赛者的信息和每场比赛的结果。 我们想要通过此数据推断玩家的实力。 假设每位玩家的潜在实力呈正态分布,且他们在给定比赛中的表现是此实力受干扰后的状态。数据被设定的约束条件是赢家的表现大于输家的表现。 这是热门的 TrueSkill 模型的简化版,此模型也支持团队、平局及其他扩展项。 热销的 Halo 和 Gears of War 游戏中的比赛安排使用了此模型的高级版

我们需要列出所推断玩家的实力以及他们的差异(衡量实力的不确定性)。

游戏结果示例数据

游戏 胜者 败者
1 玩家 0 玩家 1
2 玩家 0 玩家 3
3 玩家 0 玩家 4
4 玩家 1 玩家 2
5 玩家 3 玩家 1
6 玩家 4 玩家 2

仔细观察样本数据,你会发现玩家3和4都有1次胜利和1次失败。 让我们看看使用概率编程的排名是什么样的。另请注意基于我们开发的编码习惯,玩家编号是从零开始的,即使是室内游戏匹配列表也是从零开始的。

编写代码

设计模型后,就可以使用 Infer.NET 建模 API 将其表示为概率性程序。 在常用的文本编辑器中,打开 Program.cs,并将其所有内容替换为以下代码:

namespace myApp

{
    using System;
    using System.Linq;
    using Microsoft.ML.Probabilistic;
    using Microsoft.ML.Probabilistic.Distributions;
    using Microsoft.ML.Probabilistic.Models; class Program
{ static void Main(string[] args)
{
    // The winner and loser in each of 6 samples games
    var winnerData = new[] { , , , , , };
    var loserData = new[] { , , , , , };     // Define the statistical model as a probabilistic program
    var game = new Range(winnerData.Length);
    var player = new Range(winnerData.Concat(loserData).Max() + );
    var playerSkills = Variable.Array<double>(player);
    playerSkills[player] = Variable.GaussianFromMeanAndVariance(, ).ForEach(player);     var winners = Variable.Array<int>(game);
    var losers = Variable.Array<int>(game);     using (Variable.ForEach(game))
    {
        // The player performance is a noisy version of their skill
        var winnerPerformance = Variable.GaussianFromMeanAndVariance(playerSkills[winners[game]], 1.0);
        var loserPerformance = Variable.GaussianFromMeanAndVariance(playerSkills[losers[game]], 1.0);         // The winner performed better in this game
        Variable.ConstrainTrue(winnerPerformance > loserPerformance);
    }     // Attach the data to the model
    winners.ObservedValue = winnerData;
    losers.ObservedValue = loserData;     // Run inference
    var inferenceEngine = new InferenceEngine();
    var inferredSkills = inferenceEngine.Infer<Gaussian[]>(playerSkills);     // The inferred skills are uncertain, which is captured in their variance
    var orderedPlayerSkills = inferredSkills
       .Select((s, i) => new { Player = i, Skill = s })
       .OrderByDescending(ps => ps.Skill.GetMean());     foreach (var playerSkill in orderedPlayerSkills)
    {
        Console.WriteLine($"Player {playerSkill.Player} skill: {playerSkill.Skill}");
    }
}
}
}

运行你的应用

在命令提示符中运行下面的命令:

dotnet run

结果

结果应如下所示:

Compiling model...done.
Iterating:
.........|.........|.........|.........|.........|
Player skill: Gaussian(9.517, 3.926)
Player skill: Gaussian(6.834, 3.892)
Player skill: Gaussian(6.054, 4.731)
Player skill: Gaussian(4.955, 3.503)
Player skill: Gaussian(2.639, 4.288)

在结果中,请注意,根据我们的模型,玩家3的排名略高于玩家4。 这是因为玩家3战胜了玩家1的意义大于玩家4战胜玩家2的意义 - 注意玩家1击败过玩家2,玩家0是总冠军!

使用 Infer.NET 进行概率编程的更多相关文章

  1. 概率编程:《贝叶斯方法概率编程与贝叶斯推断》中文PDF+英文PDF+代码

    贝叶斯推理的方法非常自然和极其强大.然而,大多数图书讨论贝叶斯推理,依赖于非常复杂的数学分析和人工的例子,使没有强大数学背景的人无法接触.<贝叶斯方法概率编程与贝叶斯推断>从编程.计算的角 ...

  2. 贝叶斯推断 && 概率编程初探

    1. 写在之前的话 0x1:贝叶斯推断的思想 我们从一个例子开始我们本文的讨论.小明是一个编程老手,但是依然坚信bug仍有可能在代码中存在.于是,在实现了一段特别难的算法之后,他开始决定先来一个简单的 ...

  3. NET平台机器学习组件-Infer.NET

    NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化 阅读目录 关于本文档的说明 1.基本介绍 2.标准数据格式的映射 3.本地数据格式映射 4.评估数据格式映射 ...

  4. DotNet 资源大全中文版

    https://blog.csdn.net/fhzh520/article/details/52637545 目录 算法与数据结构(Algorithms and Data structures) 应用 ...

  5. What is probabilistic programming? | 中文翻译

    What is probabilistic programming? | 中文翻译 Probabilistic languages can free developers from the compl ...

  6. gen语言

    概率编程语言(PPL)领域正经历着机器学习技术快速发展带来的奇迹般的复兴.在短短的几年里,PPL 已经从一个模糊的统计研究领域发展出十几个活跃的开源方案.最近,麻省理工学院(MIT)的研究人员推出了一 ...

  7. NLP点滴——文本相似度

    [TOC] 前言 在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性.而有了文本之间相似性的度 ...

  8. 15个C++项目列表

    实验楼上有很多C++的实战项目,从简单到进阶,学习每个项目都可以掌握相应的知识点. 如果你还是C++新手的话,那么这个C++的项目列表你可以拿去练手实战开发,毕竟学编程动手实践是少不了的! 如果你不知 ...

  9. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

随机推荐

  1. Windows上Kafka运行环境安装

    1. 安装JDK 1.1 安装文件:http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载JDK1.2 安装完成后需 ...

  2. 第五周助教工作总结——NWNU李泓毅

    第五周助教总结 注:因第四次实验安排两个标准时间完成,因此本周未提交完整作业. 本周心得: 第四次实验进行过半,八组同学都在实验课上进行了一次中期总结,并形成书面总结在微信群中讨论. 根据各组同学的中 ...

  3. 使用rar把程序打包成一个exe

    根目录--全部文件--右键添加到压缩文件 常规--创建自解压压缩文件 高级--自解压选项 解压路径--Finger(自己写)--在"Program Files"中创建 设置--解压 ...

  4. C语言 指针基础篇 数组,函数与指针的运用 2 14

    下面看看如何在函数中运用指针吧 下面是往函数传入指针的简单操作,不是传入数组的.判断一个a是否大于b是的话给,是的话对其进行操作,不是的话就直接返回. #include <stdio.h> ...

  5. 隐藏Spring Elements

    Spring Elements 显示出来很烦,如何隐藏

  6. 5随机到7随机的C++实现

    一.5随机到7随机 //给定条件 int Rand1To5(){ + ; } //实现代码,使用插空法和筛的过程 int Rand1To7(){ ; do{ tmp = (Rand1To5() - ) ...

  7. MapGIS DataStore

    http://www.mapgis.com/index.php/index-show-tid-206.html 异构数据同时加载 DCServer感觉已经集成到 IGServer中了. >> ...

  8. 计算机网络四:网卡与MAC地址

    网卡与MAC地址 ㈠网卡 1.网卡定义 网卡是工作在OSI的数据链路层的网络组件,是局域网中连接计算机和传输介质(网线或WIFI信号)的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉 ...

  9. Python TVTK 标量数据可视化与矢量数据可视化,空间轮廓线可视化

    Python数据可视化分为 标量可视化,矢量可视化,轮廓线可视化 标量又称无向量,只有大小没有方向,运算遵循代数运算法则比如质量,密度,温度,体积,时间 矢量又称向量,它是由大小,方向共同确定的量,运 ...

  10. Linux-3.0.8中基于S5PV210的IRQ模块代码追踪和分析

    init/main.c: asmlinkage void start_kernel(void) { ...... early_irq_init(); init_IRQ(); ...... } earl ...