Я пытаюсь создать динамическую байесовскую сеть для изучения параметров с использованием байесовского сервера на C # в моей игре Unity. Реализация основана на этой статье .
Краткое объяснение модели, показанной на рисунке ниже: Когда игрок начинает играть на уровне, я назначаю ему начальную вероятность 0,5, что он уже знает материал, который он изучает, который представлен как узел Prior в показанной сети со связанной переменной, называемой priorKnowledge
. Этот предыдущий узел связан с узлом Знания, который является скрытым узлом, представляющим скрытую переменную LearnRate
, и его необходимо изучить в процессе игры. Этот узел, в свою очередь, связан с узлом Вопроса, который имеет два состояния, правильные или неправильные, в зависимости от того, правильно или неправильно игрок отвечает на вопрос. В зависимости от состояния предыдущего узла и узла вопроса, скорость обучения вычисляется и используется как приоритет для следующего уровня, как только очищенные уровни будут очищены.
У меня есть следующий фрагмент кода, который представляет сеть в 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);
}