I want to try out an extension of the StudentSkills tutorial but I am having trouble coding up what I want. I want to add a multivariate normal distribution (of dimension equal to number of skills) for each student (so something like theta[student][skill])
and make the hasSkillVar[student][skill] be a logistic function of theta[student][skill].
In the StudentSkills tutorial we have (leaving out irrelevant snippets)
VariableArray<double> slipVar, guessVar, pSkillVar;
VariableArray<VariableArray<bool>, bool[][]> hasSkillVar;
Range student = new Range(num_students);
Range question = new Range(num_items);
Range skill = new Range(num_skills);
pSkillVar = Variable.Array<double>(skill).Named("pSkill");
pSkillVar[skill] = Variable.Beta(1, 1).ForEach(skill);
hasSkillVar[student][skill] = Variable.Bernoulli(pSkillVar[skill]).ForEach(student);
I want to do something like this but its not right:
VariableArray<Vector> abilityVar;
abilityVar = Variable.Array<Vector>(student).Named("ability");
abilityVar[student] = Variable.VectorGaussianFromMeanAndPrecision(
Vector.Zero(num_skills), PositiveDefiniteMatrix.Identity(num_skills)).ForEach(student);
using (Variable.ForEach(student))
{
using (Variable.ForEach(skill))
{
hasSkillVar[student][skill] = Variable.Bernoulli(Variable.Logistic(Variable.GetItem(abilityVar[student], skill)));
}
}
skill is a range not an int.