def create_model():
    all_vars = []

    # b = 20
    # target_mean = 0.1
    b = 5
    target_mean = 0.2
    a = b*target_mean

    # sigma_qd = Normal('sigma_qd', 0.05,1/(0.15**2))
    # sigma_qd = Exponential('sigma_qd', 10)
    sigma_qd = Gamma('sigma_qd', a, b)
    # pot = TruncPotential('sigma_qd_potential', 0, 0.2, sigma_qd)
    # all_vars.append(pot)
    # sigma_qd.value = 0.05
    all_vars.append(sigma_qd)

    # plot_dist(sigma_qd, 0, 0.2)

    # mu_sc = Normal('mu_sc', 0.5, 1/(0.25**2))
    mu_sc = TruncNormal('mu_sc', 0, 1, 0.5, 1/(0.2**2))
    mu_sc.value=0.5
    # pot = TruncPotential('mu_sc_potential', 0, 1, mu_sc)
    # all_vars.append(pot)

    # sigma_sc = Normal('sigma_sc', 0.2, 1/(0.25**2))
    # sigma_sc = Exponential('sigma_sc', 10)
    sigma_sc = Gamma('sigma_sc', a, b)
    # plot_dist(sigma_sc)
    sigma_sc.value = 0.1
    # pot = TruncPotential('sigma_sc_potential', 0, 0.3, sigma_sc)
    # all_vars.append(pot)

    # sigma_bias = Normal('sigma_bias', 0.05, 1/(0.25**2))
    # sigma_bias = Exponential('sigma_bias', 10)
    sigma_bias = Gamma('sigma_bias', a, b)
    # pot = TruncPotential('sigma_bias_potential', 0, 0.2, sigma_bias)
    # all_vars.append(pot)
    sigma_bias.value = 0.1


    b_c = 5
    target_mean_c = 0.2
    a_c = b_c*target_mean
    # sigma_student_handin_capabilities = Normal('sigma_student_handin_capabilities', 0.05, 1/(0.15**2))
    # sigma_student_handin_capabilities = Exponential('sigma_student_handin_capabilities', 10)
    sigma_student_handin_capabilities = Gamma('sigma_student_handin_capabilities', a, b)
    sigma_student_handin_capabilities.value = 0.05
    # pot = TruncPotential('sigma_student_handin_capabilities_potential', 0, 0.3, sigma_student_handin_capabilities)
    # all_vars.append(pot)


    # sigma_student_question_capabilities = Normal('sigma_student_question_capabilities', 0.05,1/(0.15**2))
    # sigma_student_question_capabilities = Exponential('sigma_student_question_capabilities', 10)
    sigma_student_question_capabilities = Gamma('sigma_student_question_capabilities', a, b)
    # plot_dist(sigma_student_question_capabilities)
    sigma_student_question_capabilities.value = 0.05
    # pot = TruncPotential('sigma_student_question_capabilities_potential', 0, 0.15, sigma_student_question_capabilities)
    # all_vars.append(pot)

    # plot_dist(sigma_student_question_capabilities, 0, 0.2)


    all_vars.append(mu_sc)
    all_vars.append(sigma_sc)
    all_vars.append(sigma_bias)
    all_vars.append(sigma_student_handin_capabilities)
    all_vars.append(sigma_student_question_capabilities)

    for i in xrange(num_assignments):
        questions = []
        for j in xrange(num_questions_pr_handin):
            tau = pymc.Lambda('tau_%i_%i'% (i,j), lambda a=sigma_qd: 1/ (sigma_qd.value*sigma_qd.value))
            difficulty = Normal('difficulty_q_%i_%i'% (i,j), 0, tau)
            q = Question(difficulty)
            questions.append(q)
            all_vars.append(difficulty)
        assignment = Assignment(questions)
        assignments.append(assignment)




    for i in xrange(num_students):
        tau = pymc.Lambda('tau1_%i'%i, lambda a=sigma_sc: 1/(sigma_sc.value*sigma_sc.value))
        # student_capabilities = Normal('student_capabilities_s_%i'%i, mu_sc, tau)
        student_capabilities = TruncNormal('student_capabilities_s_%i'%i, 0, 1, mu_sc, tau)
        all_vars.append(student_capabilities)

        # pot = TruncPotential('student_capabilities_potential_s_%i'%i, 0, 1, student_capabilities)
        # all_vars.append(pot)

        # grading_bias = Normal('grading_bias_s_%i'%i, 0, 1/sigma_bias)
        tau = pymc.Lambda('tau2_%i'%i, lambda a=sigma_bias: 1/ (sigma_bias.value*sigma_bias.value))
        grading_bias = Normal('grading_bias_s_%i'%i, 0, tau)
        all_vars.append(grading_bias)

        s = Student(student_capabilities, grading_bias)
        students.append(s)
        for j, assignment in enumerate(assignments):
            # student_handin_capabilities = Normal('student_handin_capabilities_sh_%i_%i' % (i,j), 0, 1/sigma_student_handin_capabilities)
            tau = pymc.Lambda('tau2_%i_i%i'%(i, j), lambda a=sigma_student_handin_capabilities: 1/ (sigma_student_handin_capabilities.value*sigma_student_handin_capabilities.value))
            student_handin_capabilities = Normal('student_handin_capabilities_sh_%i_%i' % (i,j), 0, tau)
            all_vars.append(student_handin_capabilities)
            question_capabilities = []
            for k, q in enumerate(assignment.questions):
                tau = pymc.Lambda('tau2_%i_i%i_%i'%(i, j,k), lambda a=sigma_student_question_capabilities: 1/ (sigma_student_question_capabilities.value*sigma_student_question_capabilities.value))
                student_question_capabilities = Normal('student_question_capabilities_shq_%i_%i_%i' % (i,j,k ), 0, tau)
                all_vars.append(student_question_capabilities)
                question_capabilities.append(student_question_capabilities)
            handins.append(Handin(s, assignment, student_handin_capabilities, question_capabilities))


    # assign grader
    all_grades = []
    for handin in handins:
        potential_graders = range(0, len(students))
        potential_graders.remove(students.index(handin.student))
        idx = np.random.randint(0, len(potential_graders), num_graders_pr_handin)
        graders = [students[i] for i in idx]
        grades = handin.grade(graders)
        all_grades.append(grades)

    grade_list = sum(sum(all_grades, []),[])


    b = 50
    target_mean = 0.05
    a = b*target_mean
    sigma_exo_grade = Gamma('sigma_exo_grade', a, b)
    # sigma_exo_grade = Exponential('mu_exo_grade', 20)
    # sigma_exo_grade = Normal('mu_exo_grade', 0.05, 1/(0.1**2))
    # pot = TruncPotential('sigma_exo_grade', 0, 0.2, sigma_exo_grade)
    # all_vars.append(pot)
    tau = pymc.Lambda('tau3', lambda a=sigma_exo_grade: 1/ (sigma_exo_grade.value*sigma_exo_grade.value))
    all_vars.append(sigma_exo_grade)

    print "Creating grade list"

    # grade_list_real = [g.value for g in grade_list]
    # print 1
    # grade_list_real = [min(max((g), 0), 1) for g in grade_list_real]
    # print 2
    # grade_list = [Normal('grade_%i'%i, g, tau, value=g_real, observed=True)  for i, (g_real, g) in enumerate(zip(grade_list_real, grade_list))]
    # print 3
    # grade_list_potentials = [TruncPotential('grade_potential_%i'%i, 0, 1, g) for i,g in enumerate(grade_list)]
    # print 4

    # take one MCMC step in order to make it more probable that all variables are in the allowed range
    # var_dict = {str(v):v for v in all_vars}
    # sampler = pymc.MCMC(var_dict)
    # sampler.sample(iter=1)

    grade_list_real = [g.value for g in grade_list]
    # plt.hist(grade_list_real)
    # plt.show()

    print "Number of illegal grades: %i (out of %i)" % (len([g for g in grade_list_real if g > 1 or g < 0]), len(grade_list))
    grade_list_real = [min(max((g), 0), 1) for g in grade_list_real]
    grade_list = [Normal('grade_%i'%i, g, tau, value=g_real, observed=True)  for i, (g_real, g) in enumerate(zip(grade_list_real, grade_list))]
    # grade_list = [Normal('grade_%i'%i, g, 1/(0.02^2), value=g_real, observed=True)  for i, (g_real, g) in enumerate(zip(grade_list_real, grade_list))]
    grade_list_potentials = [TruncPotential('grade_potential_%i'%i, 0, 1, g) for i,g in enumerate(grade_list)]

    print "Grade list created"

    all_vars += grade_list
    all_vars += grade_list_potentials

    all_vars = list(set(all_vars))
    print len(all_vars)
    # print [str(v) for v in all_vars]
    return locals(), grade_list_real, all_vars
Example #2
0
from pymc import deterministic, Normal, Uniform, Model
from pymc.distributions import truncated_normal_like
import pymc
import numpy as np
from grade_model2 import *
import pydot_ng as pydot
from pymc.ScipyDistributions import stochastic_from_scipy_dist, stochastic_from_dist
from scipy.stats import truncnorm
import matplotlib.pyplot as plt

from distributions import TruncNormal

test = TruncNormal('test', 0, 1, 0.5, 0.2, 0.5)
x = np.linspace(-1,2, 100)
plt.hist([test.random() for i in xrange(1000)])
# plt.hist([test.random(0,1,0.5, 0.2) for i in xrange(1000)])


num_students = 120
num_assignments = 4
num_questions_pr_handin = 20
num_graders_pr_handin = 7

students = []
assignments = []
handins = []


def create_model():
    all_vars = []
    sigma_qd = Uniform('sigma_qd', 0,0.15)