Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten przewodnik z instrukcjami zawiera informacje o programowaniu probabilistycznym przy użyciu Infer.NET. Programowanie probabilistyczne to podejście do uczenia maszynowego, w którym modele niestandardowe są wyrażane jako programy komputerowe. Umożliwia włączenie wiedzy o domenie w modelach i sprawia, że system uczenia maszynowego jest bardziej czytelny. Obsługuje również wnioskowanie online — proces uczenia się w miarę nadejścia nowych danych. Infer.NET jest używany w różnych produktach firmy Microsoft na platformie Azure, xbox i Bing.
Co to jest programowanie probabilistyczne?
Programowanie probabilistyczne umożliwia tworzenie modeli statystycznych procesów rzeczywistych.
Wymagania wstępne
Lokalne środowisko programistyczne.
Ten przewodnik z instrukcjami oczekuje, że masz maszynę, której możesz użyć do programowania. Samouczek platformy .NET Hello World w ciągu 10 minut zawiera instrukcje dotyczące konfigurowania lokalnego środowiska deweloperskiego w systemach macOS, Windows lub Linux.
Tworzenie aplikacji
Otwórz nowy wiersz polecenia i uruchom następujące polecenia:
dotnet new console -o myApp
cd myApp
Polecenie dotnet tworzy aplikację new typu console. Parametr -o tworzy katalog o nazwie myApp , w którym aplikacja jest przechowywana i wypełnia ją wymaganymi plikami. Polecenie cd myApp umieszcza Cię w nowo utworzonym katalogu aplikacji.
Instalowanie pakietu Infer.NET
Aby użyć Infer.NET, należy zainstalować Microsoft.ML.Probabilistic.Compiler pakiet. W wierszu polecenia uruchom następujące polecenie:
dotnet add package Microsoft.ML.Probabilistic.Compiler
Lub w .NET 10+:
dotnet package add Microsoft.ML.Probabilistic.Compiler
Projektowanie modelu
W przykładzie użyto meczów tenisa stołowego lub piłkarzyków rozgrywanych w biurze. Masz uczestników i wynik każdego meczu. Chcesz wywnioskować umiejętności zawodnika z tych danych. Załóżmy, że każdy gracz ma zwykle rozproszone ukryte umiejętności, a ich dana wydajność meczu jest hałaśliwą wersją tej umiejętności. Dane ograniczają wydajność zwycięzcy do bycia większą niż wydajność przegranego. Jest to uproszczona wersja popularnego modelu TrueSkill, który obsługuje także zespoły, remisy oraz inne rozszerzenia. Zaawansowana wersja tego modelu jest używana do dopasowywania w najlepiej sprzedających się tytułach gier Halo i Gears of War.
Musisz wyświetlić listę wywnioskowanych umiejętności graczy oraz ich wariancję, czyli miarę niepewności w oszacowaniu umiejętności.
Przykładowe dane wyników gry
| Gra | Zwycięzca | Przegrany |
|---|---|---|
| 1 | Gracz 0 | Gracz 1 |
| 2 | Gracz 0 | Gracz 3 |
| 3 | Gracz 0 | Gracz 4 |
| 4 | Gracz 1 | Gracz 2 |
| 5 | Gracz 3 | Gracz 1 |
| 6 | Gracz 4 | Gracz 2 |
Przyjrzyjmy się bliżej przykładowym danym, zauważysz, że gracze 3 i 4 mają jedną wygraną i jedną porażkę. Zobaczmy, jak wyglądają rankingi przy użyciu programowania probabilistycznego. Zwróć również uwagę, że istnieje gracz o numerze zero, ponieważ nawet listy dopasowań w biurze są indeksowane od zera dla nas, deweloperów.
Pisanie kodu
Po zaprojektowaniu modelu nadszedł czas, aby wyrazić go jako program probabilistyczny przy użyciu interfejsu API modelowania Infer.NET. Otwórz Program.cs plik w ulubionym edytorze tekstów i zastąp całą jego zawartość następującym kodem:
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}");
}
}
}
}
Uruchamianie aplikacji
W wierszu polecenia uruchom następujące polecenie:
dotnet run
Wyniki
Wyniki powinny być podobne do następujących:
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)
W wynikach zwróć uwagę, że gracz 3 plasuje się nieco wyżej niż gracz 4 zgodnie z modelem. To dlatego, że zwycięstwo gracza 3 nad graczem 1 jest bardziej znaczące niż zwycięstwo gracza 4 nad graczem 2 - należy pamiętać, że gracz 1 pokona gracza 2. Gracz 0 jest mistrzem!
Kontynuuj naukę
Projektowanie modeli statystycznych jest umiejętnością własną. Zespół Microsoft Research Cambridge napisał bezpłatną książkę online, która daje delikatne wprowadzenie do artykułu. W rozdziale 3 tej książki bardziej szczegółowo omówiono model TrueSkill. Mając na uwadze model, możesz przekształcić go w kod, korzystając z obszernej dokumentacji w witrynie internetowej Infer.NET.
Następne kroki
Zapoznaj się z repozytorium Infer.NET GitHub, aby kontynuować naukę i znaleźć więcej przykładów.