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 consolebir 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.