예제 #1
0
    def test_sparse_and_regular_make_same_objective(self):
        np.random.seed(123)
        P, Y, L = generate_simple_label_matrix(
            self.known_dimensions.num_examples,
            self.known_dimensions.num_functions,
            self.known_dimensions.num_classes,
        )
        sparse_event_occurence: List[EventCooccurence] = []
        label_model = LabelModel(cardinality=self.known_dimensions.num_classes)
        label_model._set_constants(L)
        L_shift = L + 1
        label_model_lind = label_model._create_L_ind(L_shift)
        co_oc_matrix = label_model_lind.T @ label_model_lind
        for a_id, cols in enumerate(co_oc_matrix):
            for b_id, freq in enumerate(cols):
                sparse_event_occurence.append(
                    EventCooccurence(a_id, b_id, frequency=freq))

        sparse_model = SparseEventPairLabelModel()
        sparse_model._set_constants(known_dimensions=self.known_dimensions)

        sparse_model_objective = sparse_model._prepare_objective_from_sparse_event_cooccurence(
            known_dimensions=self.known_dimensions,
            sparse_event_occurence=sparse_event_occurence,
        )
        self.assertEqual(label_model.n, sparse_model.n)
        self.assertEqual(label_model.m, sparse_model.m)
        self.assertEqual(label_model.cardinality, sparse_model.cardinality)
        label_model._generate_O(L_shift, )
        label_model_O = label_model.O.detach().numpy()
        np.testing.assert_almost_equal(label_model_O, sparse_model_objective)
예제 #2
0
    def test_sparse_and_regular_make_same_l_ind_and_o(self):
        np.random.seed(123)
        P, Y, L = generate_simple_label_matrix(
            self.known_dimensions.num_examples,
            self.known_dimensions.num_functions,
            self.known_dimensions.num_classes,
        )
        example_event_lists: List[ExampleEventListOccurence] = []
        label_model = LabelModel(cardinality=self.known_dimensions.num_classes)
        label_model._set_constants(L)
        L_shift = L + 1
        label_model_lind = label_model._create_L_ind(L_shift)

        for example_num, example in enumerate(L):
            event_list = []
            for func_id, cls_id in enumerate(example):
                if (cls_id) > -1:
                    event_id = func_id * self.known_dimensions.num_classes + cls_id
                    event_list.append(event_id)
            example_event_lists.append((ExampleEventListOccurence(event_list)))

        sparse_model = SparseExampleEventListLabelModel()
        sparse_model._set_constants(known_dimensions=self.known_dimensions)
        sparse_model_lind = sparse_model.get_l_ind(
            known_dimensions=self.known_dimensions,
            example_events_list=example_event_lists,
            return_array=True,
        )
        sparse_model_objective = sparse_model._prepare_objective_from_sparse_example_eventlist(
            known_dimensions=self.known_dimensions,
            example_events_list=example_event_lists,
        )
        np.testing.assert_equal(label_model_lind, sparse_model_lind)
        np.testing.assert_equal(label_model_lind, sparse_model_lind)
        self.assertEqual(label_model.n, sparse_model.n)
        self.assertEqual(label_model.m, sparse_model.m)
        self.assertEqual(label_model.cardinality, sparse_model.cardinality)
        label_model._generate_O(L_shift, )
        label_model_O = label_model.O.detach().numpy()
        np.testing.assert_almost_equal(label_model_O, sparse_model_objective)
예제 #3
0
    def test_sparse_and_regular_make_same_probs(self) -> None:
        """Test the LabelModel's estimate of P and Y on a simple synthetic dataset."""
        np.random.seed(123)
        P, Y, L = generate_simple_label_matrix(
            self.known_dimensions.num_examples,
            self.known_dimensions.num_functions,
            self.known_dimensions.num_classes,
        )
        sparse_event_occurence: List[EventCooccurence] = []
        label_model = LabelModel(cardinality=self.known_dimensions.num_classes)
        label_model._set_constants(L)
        L_shift = L + 1
        label_model_lind = label_model._create_L_ind(L_shift)
        co_oc_matrix = label_model_lind.T @ label_model_lind
        for a_id, cols in enumerate(co_oc_matrix):
            for b_id, freq in enumerate(cols):
                sparse_event_occurence.append(
                    EventCooccurence(a_id, b_id, frequency=freq))

        sparse_model = SparseEventPairLabelModel()

        sparse_model.fit_from_sparse_event_cooccurrence(
            sparse_event_occurence=sparse_event_occurence,
            known_dimensions=self.known_dimensions,
            n_epochs=200,
            lr=0.01,
            seed=123,
        )
        label_model = LabelModel(cardinality=self.known_dimensions.num_classes)
        label_model.fit(L, n_epochs=200, lr=0.01, seed=123)
        P_lm = label_model.get_conditional_probs()
        P_slm = sparse_model.get_conditional_probs()
        np.testing.assert_array_almost_equal(
            P_slm,
            P_lm,
        )