Esempio n. 1
0
    def test_one_state(self):
        # create random data that sums to one row-wise
        a_fuzzy = np.random.standard_normal((100, 1))
        a_fuzzy = np.exp(a_fuzzy) / np.sum(np.exp(a_fuzzy), 1)[:, None]

        # check with both overlap handlings
        _fuzzy_to_discrete(a_fuzzy=a_fuzzy)
Esempio n. 2
0
    def test_normal_output(self):
        a_fuzzy = np.array([
            [0.3, 0.7, 0],
            [0.2, 0.5, 0.3],
            [0.1, 0.8, 0.1],
            [0.4, 0.4, 0.2],
            [0.5, 0.3, 0.2],
            [0.6, 0.3, 0.1],
            [0.3, 0.3, 0.4],
            [0.2, 0.2, 0.6],
        ])

        # note: removing the overlap should have no effect in this case since there is none.
        # there should also be no critical clusters in this case
        a_actual_1, c_1 = _fuzzy_to_discrete(a_fuzzy,
                                             n_most_likely=2,
                                             remove_overlap=True)
        a_actual_2, c_2 = _fuzzy_to_discrete(a_fuzzy,
                                             n_most_likely=2,
                                             remove_overlap=False)
        a_expected = np.array([
            [False, True, False],
            [False, False, False],
            [False, True, False],
            [False, False, False],
            [True, False, False],
            [True, False, False],
            [False, False, True],
            [False, False, True],
        ])

        np.testing.assert_array_equal(a_actual_1, a_expected)
        np.testing.assert_array_equal(a_actual_2, a_expected)
        assert len(c_1) == 0
        assert len(c_2) == 0
Esempio n. 3
0
    def _create_states(
        self,
        probs: Union[np.ndarray, Lineage],
        n_cells: int,
        check_row_sums: bool = False,
        return_not_enough_cells: bool = False,
    ) -> pd.Series:
        if n_cells <= 0:
            raise ValueError(
                f"Expected `n_cells` to be positive, found `{n_cells}`.")

        a_discrete, not_enough_cells = _fuzzy_to_discrete(
            a_fuzzy=probs,
            n_most_likely=n_cells,
            remove_overlap=False,
            raise_threshold=0.2,
            check_row_sums=check_row_sums,
        )

        states = _series_from_one_hot_matrix(
            membership=a_discrete,
            index=self.adata.obs_names,
            names=probs.names if isinstance(probs, Lineage) else None,
        )

        return (states,
                not_enough_cells) if return_not_enough_cells else states
Esempio n. 4
0
    def test_passing_lineage_object(self):
        a_fuzzy = np.array([
            [0.3, 0.7, 0],
            [0.2, 0.5, 0.3],
            [0.1, 0.8, 0.1],
            [0.4, 0.4, 0.2],
            [0.5, 0.3, 0.2],
            [0.6, 0.3, 0.1],
            [0.3, 0.3, 0.4],
            [0.2, 0.2, 0.6],
        ])
        a_fuzzy_lin = Lineage(a_fuzzy, names=["0", "1", "2"])

        b_np, c_np = _fuzzy_to_discrete(a_fuzzy=a_fuzzy, n_most_likely=2)
        b_l, c_l = _fuzzy_to_discrete(a_fuzzy=a_fuzzy_lin, n_most_likely=2)

        np.testing.assert_array_equal(b_np, b_l)
        assert len(c_np) == 0
        assert len(c_l) == 0
Esempio n. 5
0
    def test_critical_samples(self):
        a_fuzzy = np.array(
            [
                [0.3, 0.7, 0],
                [0.3, 0.6, 0.1],
                [0.0, 0.7, 0.3],
                [0.1, 0.9, 0],
                [0.4, 0.4, 0.2],
                [0.5, 0.3, 0.2],
                [0.6, 0.3, 0.1],
                [0.3, 0.3, 0.4],
                [0.2, 0.2, 0.6],
            ]
        )

        _, c_1 = _fuzzy_to_discrete(a_fuzzy, n_most_likely=3, remove_overlap=False)
        _, c_2 = _fuzzy_to_discrete(a_fuzzy, n_most_likely=3, remove_overlap=True)

        assert c_1 == np.array(2)
        np.testing.assert_array_equal(c_2, np.array([1, 2]))
Esempio n. 6
0
    def test_normal_run(self):
        # create random data that sums to one row-wise
        a_fuzzy = np.random.standard_normal((100, 3))
        a_fuzzy = np.exp(a_fuzzy) / np.sum(np.exp(a_fuzzy), 1)[:, None]

        # check with both overlap handlings
        _fuzzy_to_discrete(a_fuzzy=a_fuzzy)
        _fuzzy_to_discrete(a_fuzzy=a_fuzzy, n_most_likely=30, remove_overlap=True)
        _fuzzy_to_discrete(a_fuzzy=a_fuzzy, n_most_likely=30, remove_overlap=False)
Esempio n. 7
0
 def test_raise_threshold(self):
     a_fuzzy = np.repeat(np.array([0.9, 0.1])[None, :], 10, 0)
     with pytest.raises(ValueError):
         _fuzzy_to_discrete(a_fuzzy, n_most_likely=3, remove_overlap=True)
     with pytest.raises(ValueError):
         _fuzzy_to_discrete(a_fuzzy, n_most_likely=3, remove_overlap=False)
Esempio n. 8
0
 def test_too_many_cells(self):
     a_fuzzy = np.random.standard_normal((100, 3))
     a_fuzzy = np.exp(a_fuzzy) / np.sum(np.exp(a_fuzzy), 1)[:, None]
     with pytest.raises(ValueError):
         _fuzzy_to_discrete(a_fuzzy=a_fuzzy, n_most_likely=50)
Esempio n. 9
0
 def test_normalization(self):
     a_fuzzy = np.random.standard_normal((100, 3))
     with pytest.raises(ValueError):
         _fuzzy_to_discrete(a_fuzzy=a_fuzzy)