def test_categorical_smoothed_layer_eval(): alpha = 0.1 # creating input layer input_layer = CategoricalSmoothedLayer(vars=vars, node_dicts=dicts, alpha=alpha) # evaluate it input_layer.eval(obs) # getting values layer_evals = input_layer.node_values() print('layer eval nodes') print(layer_evals) # crafting by hand logvals = [] for node_dict in dicts: var_id = node_dict['var'] freqs = node_dict['freqs'] if 'freqs' in node_dict else None logvals.append(compute_smoothed_ll(obs[var_id], freqs, vars[var_id], alpha)) print('log vals') print(logvals) assert logvals == layer_evals # now changing alphas print('\nCHANGING ALPHAS\n') alphas = [0., 0.1, 1., 10.] for alpha_new in alphas: print('alpha', alpha_new) input_layer.smooth_probs(alpha_new) # evaluating again input_layer.eval(obs) # getting values layer_evals = input_layer.node_values() print('layer evals') print(layer_evals) logvals = [] for node_dict in dicts: var_id = node_dict['var'] freqs = node_dict['freqs'] if 'freqs' in node_dict else None logvals.append(compute_smoothed_ll(obs[var_id], freqs, vars[var_id], alpha_new)) print('logvals') print(logvals) assert_array_almost_equal(logvals, layer_evals)
def test_categorical_smoothed_node_create_and_eval(): for alpha in alphas: for i, var in enumerate(vars): var_freq = freqs[i] smo = CategoricalSmoothedNode(i, var, alpha, var_freq) smo.eval(obs) print('smo values') print(smo.log_val) ll = compute_smoothed_ll(obs[i], var_freq, var, alpha) print('log values') print(ll) assert_almost_equal(ll, smo.log_val, 15)
def test_categorical_smoothed_node_resmooth(): for i, var in enumerate(vars): alpha = alphas[0] var_freq = freqs[i] smo = CategoricalSmoothedNode(i, var, alpha, var_freq) smo.eval(obs[i]) print('smo values') print(smo.log_val) # checking the right value ll = compute_smoothed_ll(obs[i], var_freq, var, alpha) print('log values') print(ll) assert_almost_equal(ll, smo.log_val, 15) # now setting another alpha print('Changing smooth level') for alpha_new in alphas: smo.smooth_probs(alpha_new) smo.eval(obs[i]) print('smo values') print(smo.log_val) ll = compute_smoothed_ll(obs[i], var_freq, var, alpha_new) print('log values') print(ll) assert_almost_equal(ll, smo.log_val, 15)
def test_categorical_input_layer(): print('categorical input layer') # I could loop through alpha as well alpha = 0.1 for var_id1 in range(len(vars)): for var_id2 in range(len(vars)): for var_val1 in range(vars[var_id1]): print('varid1, varid2, varval1', var_id1, var_id2, var_val1) # var_id1 = 0 # var_val1 = 0 node1 = CategoricalIndicatorNode(var_id1, var_val1) # var_id2 = 0 var_vals2 = vars[var_id2] node2 = CategoricalSmoothedNode( var_id2, var_vals2, alpha, freqs[var_id2]) # creating the generic input layer input_layer = CategoricalInputLayer([node1, node2]) # evaluating according to an observation input_layer.eval(obs) layer_evals = input_layer.node_values() print('layer eval nodes') print(layer_evals) # computing evaluation by hand val1 = 1 if var_val1 == obs[var_id1] or obs[ var_id1] == MARG_IND else 0 logval1 = log(val1) if val1 == 1 else LOG_ZERO logval2 = compute_smoothed_ll( obs[var_id2], freqs[var_id2], vars[var_id2], alpha) logvals = [logval1, logval2] print('log vals') print(logvals) for logval, eval in zip(logvals, layer_evals): if logval == LOG_ZERO: # for zero log check this way for correctness assert IS_LOG_ZERO(eval) is True else: assert_almost_equal(logval, eval, PRECISION)