Infer.NET ve olasılıksal programlama ile oyun eşleştirme listesi uygulaması oluşturma
Bu nasıl yapılır kılavuzu size Infer.NET kullanarak olasılık programlama hakkında bilgi sağlar. Olasılıksal programlama, özel modellerin bilgisayar programları olarak ifade edildiği bir makine öğrenmesi yaklaşımıdır. Modellere etki alanı bilgisinin dahil edilmesini sağlar ve makine öğrenmesi sistemini daha yorumlanabilir hale getirir. Ayrıca, yeni veriler geldikçe öğrenme süreci olan çevrimiçi çıkarımları da destekler. Infer.NET, Microsoft'un Azure, Xbox ve Bing'deki çeşitli ürünlerinde kullanılır.
Olasılıksal programlama nedir?
Olasılıksal programlama, gerçek dünya süreçlerinin istatistiksel modellerini oluşturmanıza olanak tanır.
Önkoşullar
Yerel geliştirme ortamı.
Bu nasıl yapılır kılavuzu, geliştirme için kullanabileceğiniz bir makineye sahip olduğunuzu bekler. 10 dakika içinde Merhaba Dünya .NET öğreticisinde macOS, Windows veya Linux'ta yerel geliştirme ortamınızı ayarlama yönergeleri bulunur.
Uygulamanızı oluşturma
Yeni bir komut istemi açın ve aşağıdaki komutları çalıştırın:
dotnet new console -o myApp
cd myApp
dotnet
komutu türünde console
bir new
uygulama oluşturur. parametresi, -o
uygulamanızın depolandığı adlı bir dizin myApp
oluşturur ve gerekli dosyalarla doldurur. cd myApp
komutu sizi yeni oluşturulan uygulama dizinine yerleştirir.
Infer.NET paketini yükleme
Infer.NET kullanmak için paketi yüklemeniz Microsoft.ML.Probabilistic.Compiler
gerekir. Komut isteminizde aşağıdaki komutu çalıştırın:
dotnet add package Microsoft.ML.Probabilistic.Compiler
Modelinizi tasarlama
Örnek örnekte, ofiste oynanan masa tenisi veya langırt eşleşmeleri kullanılmaktadır. Her maçın katılımcıları ve sonucuna sahipsiniz. Bu verilerden oyuncunun becerilerini çıkarsamak istiyorsunuz. Her oyuncunun normalde dağıtılmış gizli bir becerisi olduğunu ve verilen maç performansının bu becerinin gürültülü bir sürümü olduğunu varsayın. Veriler, kazananın performansını kaybedenin performansından daha yüksek olacak şekilde kısıtlar. Bu, ekipleri, çizimleri ve diğer uzantıları da destekleyen popüler TrueSkill modelinin basitleştirilmiş bir sürümüdür. Bu modelin gelişmiş bir sürümü, Halo ve Gears of War en çok satan oyun başlıklarında eşleştirmek için kullanılır.
Çıkarsanan oyuncu becerilerini ve varyanslarını ( becerilerle ilgili belirsizlik ölçüsü) listelemeniz gerekir.
Oyun sonucu örnek verileri
Oyun | Kazanan | Kaybeden |
---|---|---|
1 | Oyuncu 0 | Oyuncu 1 |
2 | Oyuncu 0 | Oyuncu 3 |
3 | Oyuncu 0 | Oyuncu 4 |
4 | Oyuncu 1 | Oyuncu 2 |
5 | Oyuncu 3 | Oyuncu 1 |
6 | Oyuncu 4 | Oyuncu 2 |
Örnek verilere daha yakından baktığınızda 3 ve 4 oyuncularının hem bir galibiyet hem de bir mağlubiyet olduğunu fark edeceksiniz. Olasılıksal programlamayı kullanarak sıralamaların nasıl göründüğüne bakalım. Ayrıca, biz geliştiricilere göre ofis eşleştirme listelerinin bile sıfır olması nedeniyle bir oyuncu sıfır olduğuna dikkat edin.
Kod yazma
Modeli tasarladıktan sonra, Infer.NET modelleme API'sini kullanarak olasılığa dayalı bir program olarak ifade etme zamanı geldi. Sık kullandığınız metin düzenleyicide açın Program.cs
ve içeriğinin tümünü aşağıdaki kodla değiştirin:
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[] { 0, 0, 0, 1, 3, 4 };
var loserData = new[] { 1, 3, 4, 2, 1, 2 };
// Define the statistical model as a probabilistic program
var game = new Range(winnerData.Length);
var player = new Range(winnerData.Concat(loserData).Max() + 1);
var playerSkills = Variable.Array<double>(player);
playerSkills[player] = Variable.GaussianFromMeanAndVariance(6, 9).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}");
}
}
}
}
Uygulamanızı çalıştırma
Komut isteminizde aşağıdaki komutu çalıştırın:
dotnet run
Sonuçlar
Sonuçlarınız aşağıdakine benzer olmalıdır:
Compiling model...done.
Iterating:
.........|.........|.........|.........|.........| 50
Player 0 skill: Gaussian(9.517, 3.926)
Player 3 skill: Gaussian(6.834, 3.892)
Player 4 skill: Gaussian(6.054, 4.731)
Player 1 skill: Gaussian(4.955, 3.503)
Player 2 skill: Gaussian(2.639, 4.288)
Sonuçlarda 3. oyuncunun modelimize göre 4. oyuncudan biraz daha yüksek olduğuna dikkat edin. Çünkü oyuncu 3'ün oyuncu 1'e karşı zaferi, 4 oyuncunun 2. oyuncuya karşı kazandığı zaferden daha önemlidir – 1 oyuncunun 2'yi yendiğini unutmayın. 0. oyuncu genel şampiyon!
Öğrenmeye devam edin
İstatistiksel modeller tasarlamak kendi başına bir beceridir. Microsoft Research Cambridge ekibi, makaleye nazik bir giriş yapan ücretsiz bir çevrimiçi kitap yazdı. Bu kitabın 3. bölümü, TrueSkill modelini daha ayrıntılı olarak kapsar. Aklınızda bir model olduğunda, Infer.NET web sitesindeki kapsamlı belgeleri kullanarak modeli koda dönüştürebilirsiniz.
Sonraki adımlar
Öğrenmeye devam etmek ve daha fazla örnek bulmak için Infer.NET GitHub deposuna göz atın.