def sample_abilities_diffusion(args): """Sample the ability vector for this user, from the posterior over user ability conditioned on the observed exercise performance. use Metropolis-Hastings with Gaussian proposal distribution. This is just a wrapper around the corresponding function in mirt_util. """ # make sure each student gets a different random sequence id = multiprocessing.current_process()._identity if len(id) > 0: np.random.seed([id[0], time.time() * 1e9]) else: np.random.seed([time.time() * 1e9]) couplings, state, options, user_index = args abilities = state['abilities'] correct = state['correct'] exercises_ind = state['exercises_ind'] num_steps = options.sampling_num_steps abilities, Eabilities, _, _ = mirt_util.sample_abilities_diffusion( couplings, exercises_ind, correct, abilities, num_steps) return abilities, Eabilities, user_index
def sample_abilities_diffusion(args): """Sample the ability vector for this user, from the posterior over user ability conditioned on the observed exercise performance. use Metropolis-Hastings with Gaussian proposal distribution. This is just a wrapper around the corresponding function in mirt_util. """ # TODO(jascha) make this a better sampler (eg, use the HMC sampler from # TMIRT) # make sure each student gets a different random sequence id = multiprocessing.current_process()._identity if len(id) > 0: np.random.seed([id[0], time.time() * 1e9]) else: np.random.seed([time.time() * 1e9]) theta, state, options, user_index = args abilities = state['abilities'] correct = state['correct'] log_time_taken = state['log_time_taken'] exercises_ind = state['exercises_ind'] num_steps = options.sampling_num_steps abilities, Eabilities, _, _ = mirt_util.sample_abilities_diffusion( theta, exercises_ind, correct, log_time_taken, abilities, num_steps) return abilities, Eabilities, user_index
def emit_features(user_states, couplings, options, split_desc): """Emit a CSV data file of correctness, prediction, and abilities.""" f = open("%s_split=%s.csv" % (options.output, split_desc), 'w+') for user_state in user_states: # initialize abilities = np.zeros((options.num_abilities, 1)) correct = user_state['correct'] exercises_ind = user_state['exercises_ind'] # NOTE: I currently do not output features for the first problem for i in xrange(1, correct.size): # TODO(jace) this should probably be the marginal estimation _, _, abilities, _ = mirt_util.sample_abilities_diffusion( couplings, exercises_ind[:i], correct[:i], abilities_init=abilities, num_steps=200) prediction = mirt_util.conditional_probability_correct( abilities, couplings, exercises_ind[i:(i + 1)]) print >>f, "%d," % correct[i], print >>f, "%.4f," % prediction[-1], print >>f, ",".join(["%.4f" % a for a in abilities]) f.close()
def emit_features(user_states, theta, options, split_desc): """Emit a CSV data file of correctness, prediction, and abilities.""" f = open("%s_split=%s.csv" % (options.output, split_desc), 'w+') for user_state in user_states: # initialize abilities = np.zeros((options.num_abilities, 1)) correct = user_state['correct'] log_time_taken = user_state['log_time_taken'] exercises_ind = user_state['exercises_ind'] # NOTE: I currently do not output features for the first problem for i in xrange(1, correct.size): # TODO(jace) this should probably be the marginal estimation _, _, abilities, _ = mirt_util.sample_abilities_diffusion( theta, exercises_ind[:i], correct[:i], log_time_taken[:i], abilities_init=abilities, num_steps=200) prediction = mirt_util.conditional_probability_correct( abilities, theta, exercises_ind[i:(i + 1)]) print >>f, "%d," % correct[i], print >>f, "%.4f," % prediction[-1], print >>f, ",".join(["%.4f" % a for a in abilities]) f.close()