Example #1
0
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
Example #2
0
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
Example #3
0
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()
Example #4
0
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()