예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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)