Dela via


Skapa en spelmatchningslista med Infer.NET och probabilistisk programmering

Den här guiden lär dig om probabilistisk programmering med hjälp av Infer.NET. Probabilistisk programmering är en maskininlärningsmetod där anpassade modeller uttrycks som datorprogram. Det gör det möjligt att införliva domänkunskaper i modellerna och gör maskininlärningssystemet mer tolkningsbart. Det stöder också online-slutsatsdragning – inlärningsprocessen när nya data tas emot. Infer.NET används i olika produkter på Microsoft i Azure, Xbox och Bing.

Vad är probabilistisk programmering?

Med probabilistisk programmering kan du skapa statistiska modeller av verkliga processer.

Förutsättningar

  • Lokal utvecklingsmiljö.

    Den här instruktionsguiden förväntar sig att du har en dator som du kan använda för utveckling. Självstudien om .NET Hello World på 10 minuter har instruktioner för hur du konfigurerar din lokala utvecklingsmiljö i macOS, Windows eller Linux.

Skapa din app

Öppna en ny kommandotolk och kör följande kommandon:

dotnet new console -o myApp
cd myApp

Kommandot dotnet skapar ett new program av typen console. Parametern -o skapar en katalog med namnet myApp där appen lagras och fyller den med nödvändiga filer. Kommandot cd myApp placerar dig i den nyligen skapade appkatalogen.

Installera Infer.NET paket

Om du vill använda Infer.NET måste du installera Microsoft.ML.Probabilistic.Compiler-paketet. Kör följande kommando i kommandotolken:

dotnet add package Microsoft.ML.Probabilistic.Compiler

Utforma din modell

Exempelexemplet använder bordtennis- eller foosballmatcher som spelas på kontoret. Du har deltagarna och resultatet av varje match. Du vill härleda spelarens kunskaper från dessa data. Anta att varje spelare har en normalt distribuerad latent färdighet och deras givna matchprestanda är en bullrig version av den här färdigheten. Data begränsar vinnarens prestanda till att vara större än förlorarens prestanda. Detta är en förenklad version av den populära TrueSkill modell, som också stöder team, dragningar och andra tillägg. En avancerad version av den här modellen används för matchmaking i de bästsäljande speltitlarna Halo och Gears of War.

Du måste lista de härledda spelarfärdigheterna, tillsammans med deras varians – måttet på osäkerhet kring färdigheterna.

Exempeldata för spelresultat

Spel Vinnare Förlorare
1 Spelare 0 Spelare 1
2 Spelare 0 Spelare 3
3 Spelare 0 Spelare 4
4 Spelare 1 Spelare 2
5 Spelare 3 Spelare 1
6 Spelare 4 Spelare 2

Med en närmare titt på exempeldata ser du att spelare 3 och 4 båda har en vinst och en förlust. Nu ska vi se hur rankningen ser ut med hjälp av probabilistisk programmering. Observera också att det finns en spelare nummer noll eftersom även kontorsmatchningslistor är nollbaserade för oss utvecklare.

Skriv lite kod

Efter att ha utformat modellen är det dags att uttrycka den som ett probabilistiskt program med hjälp av Infer.NET-modellerings-API:et. Öppna Program.cs i din favorittextredigerare och ersätt allt innehåll med följande kod:

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}");
            }
        }
    }
}

Kör din app

Kör följande kommando i kommandotolken:

dotnet run

Resultat

Resultatet bör likna följande:

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)

Observera i resultatet att spelare 3 rankas något högre än spelare 4 enligt modellen. Det beror på att segern för spelare 3 över spelare 1 är mer betydande än segern för spelare 4 över spelare 2 - observera att spelare 1 slår spelare 2. Spelare 0 är totalmästare!

Fortsätt lära dig

Att utforma statistiska modeller är en färdighet på egen hand. Microsoft Research Cambridge-teamet har skrivit en gratis onlinebok, som ger en mild introduktion till artikeln. Kapitel 3 i denna bok beskriver TrueSkill-modellen mer detaljerat. När du har en modell i åtanke kan du omvandla den till kod med hjälp av omfattande dokumentation på Infer.NET webbplats.

Nästa steg

Kolla in Infer.NET GitHub-lagringsplatsen för att fortsätta lära dig och hitta fler exempel.