def setUp(cls): # initialize the data n = 10000 cls.alpha = 1.5 cls.beta = -2.0 np.random.seed(20170807) theta_vec = np.random.normal(loc=0.0, scale=1.0, size=n) y1 = [] y0 = [] for i in range(n): # generate the two parameter likelihood prob = tools.irt_fnc(theta_vec[i], cls.beta, cls.alpha) # generate the response sequence if prob >= np.random.uniform(): y1.append(1.0) y0.append(0.0) else: y1.append(0.0) y0.append(1.0) # the response format follows the solver API response_data = [y1, y0] cls.init_theta_vec = theta_vec cls.solver = optimizer.irt_2PL_Optimizer() cls.solver.load_res_data(response_data) cls.solver.set_c(0) cls.solver.set_bounds([(-4.0, 4.0), (0.05, 2)])
def setUpClass(cls): # initialize the data n = 1000 cls.theta = 1.5 np.random.seed(20170807) alpha_vec = np.random.random(n) + 1 # 1-2 beta_vec = np.random.normal(loc=0.0, scale=2.0, size=n) c_vec = np.zeros(n) y1 = [] y0 = [] for i in range(n): # generate the two parameter likelihood prob = tools.irt_fnc(cls.theta, beta_vec[i], alpha_vec[i]) # generate the response sequence if prob >= np.random.uniform(): y1.append(1.0) y0.append(0.0) else: y1.append(0.0) y0.append(1.0) # the response format follows the solver API response_data = [y1, y0] # initialize optimizer cls.solver = optimizer.irt_factor_optimizer() cls.solver.load_res_data(response_data) cls.solver.set_item_parameter(alpha_vec, beta_vec, c_vec) cls.solver.set_bounds([(-4, 4)])
def setUpClass(cls): # simulate np.random.seed(20170807) thetas = np.random.rand(N,1)*theta_range - theta_range/2 cls.data = [] for i in range(N): for t in range(T): prob = irt_fnc(thetas[i,0], beta[t], alpha[t], c[t]) cls.data.append((i, item_ids[t] ,np.random.binomial(1,prob)))
def test_irt_fnc(self): # make sure the shuffled sequence does not lose any elements prob = tools.irt_fnc(0.0, 0.0, 1.0) self.assertEqual(prob, 0.5) # alpha should play no role prob = tools.irt_fnc(0.0, 0.0, 2.0) self.assertEqual(prob, 0.5) # higher theta should have higher prob prob = tools.irt_fnc(1.0, 0.0, 1.0) self.assertEqual(prob, 1.0 / (1.0 + math.exp(-1.0))) # cancel out by higher beta prob = tools.irt_fnc(1.0, -1.0, 1.0) self.assertEqual(prob, 0.5) # test for c as limit situation prob = tools.irt_fnc(-99, 0.0, 1.0, 0.25) self.assertTrue(abs(prob - 0.25) < 1e-5) prob = tools.irt_fnc(99, 0.0, 1.0, 0.25) self.assertTrue(abs(prob - 1.0) < 1e-5)