Реализовать динамическую байесовскую сеть в Unity3d с помощью библиотеки байесовского сервера c # - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь создать динамическую байесовскую сеть для изучения параметров с использованием байесовского сервера на C # в моей игре Unity. Реализация основана на этой статье .

Краткое объяснение модели, показанной на рисунке ниже: Когда игрок начинает играть на уровне, я назначаю ему начальную вероятность 0,5, что он уже знает материал, который он изучает, который представлен как узел Prior в показанной сети со связанной переменной, называемой priorKnowledge. Этот предыдущий узел связан с узлом Знания, который является скрытым узлом, представляющим скрытую переменную LearnRate, и его необходимо изучить в процессе игры. Этот узел, в свою очередь, связан с узлом Вопроса, который имеет два состояния, правильные или неправильные, в зависимости от того, правильно или неправильно игрок отвечает на вопрос. В зависимости от состояния предыдущего узла и узла вопроса, скорость обучения вычисляется и используется как приоритет для следующего уровня, как только очищенные уровни будут очищены. enter image description here

У меня есть следующий фрагмент кода, который представляет сеть в C # с использованием библиотеки сервера Байеса.

BayesServer.Network beliefnet;
Variable priorKnowledge;
Node priorKnowledgeNode;
Variable learnRate;
Node knowledgeNode;
Node questionNode;
ParameterLearning learning;
ParameterLearningOptions learningOptions;

// numberOfDistractors and levelId will be used later for added complexity in modeling
void InitializeNetworkForLevel(int numberOfDistractors, int levelId)
{
    beliefnet = new BayesServer.Network();

    // add an intial knowledge node
    priorKnowledge = new Variable("PriorKnowledge", VariableValueType.Continuous, VariableKind.Probability);
    // initialize the priorKnowledge value to 0.5 if level = 1, else set it to learn rate (may be here, or in the queryNetwork method)
    priorKnowledgeNode = new Node("Prior", priorKnowledge);
    beliefnet.Nodes.Add(priorKnowledgeNode);

    // add a knowledge node which is a latent variable (parameter to be learned from observed values
    learnRate = new Variable("LearnRate", VariableValueType.Continuous, VariableKind.Probability);
    knowledgeNode = new Node("Knowledge", learnRate);
    beliefnet.Nodes.Add(knowledgeNode);

    // add a link from prior node to knowledge node
    beliefnet.Links.Add(new Link(priorKnowledgeNode, knowledgeNode));

    // add a question node, which denotes the oberved variable whether the question is answered correctly or not
    // this node has two states, namely correct or incorrect
    State correct = new State("Correct");
    State inCorrect = new State("Inorrect");
    questionNode = new Node("Question", correct, inCorrect);
    beliefnet.Nodes.Add(questionNode);

    // add a link from knowledge node to question node
    beliefnet.Links.Add(new Link(knowledgeNode, questionNode));

    // We will use the RelevanceTree algorithm here, as it is optimized for parameter learning
    learning = new ParameterLearning(beliefnet, new RelevanceTreeInferenceFactory());
    learningOptions = new ParameterLearningOptions();
}

Кроме того, следующий метод QueryNetwork(). Однако мне неясно, о чем много вещей, которые упоминаются в комментариях. Во-первых, мне нужно создать EvidenceReaderCommand объект для изучения параметров, для которого нужно 3 параметра: readerCommand для чтения не временных данных, variableList для невременных переменных и ReaderOptions. variableList нужен список переменных, которые я не уверен, что должно быть в этом случае. readerCommand нужна таблица со строками и столбцами, что, опять же, я не уверен, что должно быть в этом случае. Может ли кто-нибудь помочь мне получить более четкое представление об этих двух и о том, как правильно построить их для этой сети?

void QueryNetwork()
{
    DataColumn column;
    DataRow row;

    // don't know which nodes go into this table :(
    // is this supposed to be the conditional probability table? where will the probabilities come from?
    // most probably I'd need to add more columns, but not sure right now
    DataTable table = new DataTable("ParentTable");
    column = new DataColumn();
    column.DataType = System.Type.GetType("System.Double");
    column.ColumnName = "LearnRate";
    column.ReadOnly = true;
    column.Unique = true;
    // i am not sure but table needs to have some rows of data as well, which will be their conditional probabilities
    table.Columns.Add(column);

    IDataReaderCommand readerCommand = new DataTableDataReaderCommand(table);

    // don't know which variables should be a part of this variableList
    IList<VariableReference> variableList = new List<VariableReference>();
    variableList.Add(new VariableReference(learnRate, ColumnValueType.Value, "LearnRate"));

    EvidenceReaderCommand evidenceReaderCommand = new EvidenceReaderCommand(readerCommand, variableList, new ReaderOptions(null));
    ParameterLearningOutput result = learning.Learn(evidenceReaderCommand, learningOptions);
    Debug.Log(result.LogLikelihood.Value);
}

1 Ответ

0 голосов
/ 02 ноября 2018

Следующий код демонстрирует, как создать простую динамическую байесовскую сеть, аналогичную той, что показана на вашем изображении.

var network = new Network();

var knowledge = new Variable("Knowledge", new string[] { "False", "True" });
var nodeKnowledge = new Node(knowledge)
{
    TemporalType = TemporalType.Temporal // this is a time series node, hence re-used for each time slice
};
network.Nodes.Add(nodeKnowledge);

var question = new Variable("Question", new string[] { "Incorrect", "Correct" });
var nodeQuestion = new Node(question)
{
    TemporalType = TemporalType.Temporal  // this is a time series node, hence re-used for each time slice
};
network.Nodes.Add(nodeQuestion);

network.Links.Add(new Link(nodeKnowledge, nodeKnowledge, 1));   // time series link (order/lag 1)
network.Links.Add(new Link(nodeKnowledge, nodeQuestion, 0));

Это создаст DBN, как показано на рисунке ниже. (на самом деле это простая модель Скрытого Маркова, но ее можно расширить для создания более сложных моделей)

Simple DBN

Если бы этот DBN был развернут (не требуется для вывода), он выглядел бы так (в компактном виде):

Simple DBN unrolled

Чтобы узнать параметры сети, см. Следующую ссылку, которую можно изменить, чтобы узнать эту сеть.

Пример кода обучения параметров в C #

Чтобы узнать, как расположить ваши данные, перейдите по следующей ссылке:

Расположение данных и временных данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...