使用 Infer.NET 进行概率编程
本文介绍了如何使用 Infer.NET 进行概率性编程。 概率性编程是一种将自定义模型表示为计算机程序的机器学习方法。 借助它可以在模型中包含专业知识,使机器学习系统更易理解。 它还支持在线推断,即在新数据到达时进行学习的过程。 Azure、Xbox 及必应中的多种 Microsoft 产品均使用了 Infer.NET。
什么是概率性编程?
基于概率性编程,创建对真实世界过程的统计模型。
系统必备
本地.NET开发环境设置
创建应用程序
- 打开一个新的命令提示符,并运行下面的命令:
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 进行概率编程的更多相关文章
- 概率编程:《贝叶斯方法概率编程与贝叶斯推断》中文PDF+英文PDF+代码
贝叶斯推理的方法非常自然和极其强大.然而,大多数图书讨论贝叶斯推理,依赖于非常复杂的数学分析和人工的例子,使没有强大数学背景的人无法接触.<贝叶斯方法概率编程与贝叶斯推断>从编程.计算的角 ...
- 贝叶斯推断 && 概率编程初探
1. 写在之前的话 0x1:贝叶斯推断的思想 我们从一个例子开始我们本文的讨论.小明是一个编程老手,但是依然坚信bug仍有可能在代码中存在.于是,在实现了一段特别难的算法之后,他开始决定先来一个简单的 ...
- NET平台机器学习组件-Infer.NET
NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化 阅读目录 关于本文档的说明 1.基本介绍 2.标准数据格式的映射 3.本地数据格式映射 4.评估数据格式映射 ...
- DotNet 资源大全中文版
https://blog.csdn.net/fhzh520/article/details/52637545 目录 算法与数据结构(Algorithms and Data structures) 应用 ...
- What is probabilistic programming? | 中文翻译
What is probabilistic programming? | 中文翻译 Probabilistic languages can free developers from the compl ...
- gen语言
概率编程语言(PPL)领域正经历着机器学习技术快速发展带来的奇迹般的复兴.在短短的几年里,PPL 已经从一个模糊的统计研究领域发展出十几个活跃的开源方案.最近,麻省理工学院(MIT)的研究人员推出了一 ...
- NLP点滴——文本相似度
[TOC] 前言 在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性.而有了文本之间相似性的度 ...
- 15个C++项目列表
实验楼上有很多C++的实战项目,从简单到进阶,学习每个项目都可以掌握相应的知识点. 如果你还是C++新手的话,那么这个C++的项目列表你可以拿去练手实战开发,毕竟学编程动手实践是少不了的! 如果你不知 ...
- 【机器学习Machine Learning】资料大全
昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...
随机推荐
- SCUCTF2018web部分wp
[签到] Web部分的签到题,打开连接后F12审查元素 可以看到有被隐藏起来的JSFuck密码,解码运行后可得flag [计算器] 打开后界面如上图,要求简单来说就是回答20道数学题目,每道题最多3s ...
- gitlab的安装和基本使用
一.gitlab的安装 1)安装依赖包 sudo yum install git vim gcc glibc-statc telnet -y sudo yum install -y curl poli ...
- PIL: 建立一个GIF图
PIL: 建立一个GIF图 一.下载PIL库: PIL库的下载是:pip install pillow(pillow就是PIL函数了) 二.采用以下代码(有注释): import PIL.Imag ...
- 计算机爱好者协会技术贴markdown第二期
上一期我们学了多级标题,加粗,加斜以及蛮好看的小方块,这一期来继续学习吧 Txt版本: *上一期说这样可以加斜* _其实这样也可以加斜_ **上一期说这样可以加粗** __其实这样也可以加粗__ ** ...
- Pycharm下面出现No R interpreter defined
安装Pycharm进行Python开发时,经常右下角提示No R interpreter defined,处理方式: 1.安装R,然后将R的路径添加到Pycharm中: 2.如果不需要进行R语言开发, ...
- 关于浏览器cookie的小知识
浏览器对于总的cookie数量是没有限制的,但是对于每个域名的cookie数量是有限制的. 一,不同的浏览器,对于一个域名的cookie数量限制上限是不同的: 1,IE6以下版本,最多20个.IE7以 ...
- Vue控制路由滚动行为
跳转路由时,要求跳转到指定路由的某个地方,可以使用scrollBehavior方法控制. 用法: scrollBehavior(to,from,savedPosition){ } scrollBe ...
- virtualenv搭建
1.准备工作 终端 网络状况良好 2.安装虚拟环境 如何安装虚拟环境: 2.1了解你的电脑中有哪些版本的python whereis python 查看当前系统中有多少跟python有关的命令 ...
- PostGIS集群
postgresql集群:https://bbs.csdn.net/topics/390896906?page=1 https://blog.csdn.net/s465689853/article/ ...
- scrollIntoView() 调用元素就可以出现在视窗中
/* 如果滚动页面也是DOM没有解决的一个问题.为了解决这个问题,浏览器实现了一下方法, 以方便开发人员如何更好的控制页面的滚动.在各种专有方法中,HTML5选择了scrollIntoView() 作 ...