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
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)