Exemplo n.º 1
0
    def __init__(self,
                 number_of_states,
                 state_labels=None,
                 verbose=False,
                 random_transitions=False,
                 *args,
                 **kwargs):
        self.current_state = None
        if state_labels is None:
            state_labels = ["State_%d" % i for i in range(number_of_states)]
        assert len(set(state_labels)) == number_of_states
        self.nStates = number_of_states
        self.transitionMatrix = np.empty((self.nStates, self.nStates))
        self.initialProbabilities = np.empty(shape=self.nStates)
        if not random_transitions:
            self.transitionMatrix.fill(1. / self.nStates)
            self.initialProbabilities.fill(1. / self.nStates)
        else:
            self.transitionMatrix = random_simplex(self.nStates, two_d=True)
            self.initialProbabilities = random_simplex(self.nStates)

        self.emissionDistributions = np.array(
            [None for _ in range(self.nStates)], dtype=object)
        self.stateLabels = state_labels
        self.verbose = verbose
Exemplo n.º 2
0
    def test_training(self):
        self.nStates = 3
        self.nDimensions = 1

        from numpy.random import choice
        observation_size = 10

        hmm = self.new_hmm(random_transitions=True)  # , random_emissions=True)
        # hmm.setup_strict_left_to_right()
        true_init_p = random_simplex(self.nStates)
        true_states = [choice(range(self.nStates), p=true_init_p)]
        true_trans_p = np.array([[.60, .30, .10], [.10, .80, .10],
                                 [.30, .10, .60]
                                 ])  # random_simplex(self.nStates, two_d=True)
        for i in range(1, observation_size):
            true_states.append(
                choice(range(self.nStates), p=true_trans_p[true_states[-1]]))
        true_emission_p = np.array([
            GaussianDistribution(dimensions=self.nDimensions, random=True)
            for _ in range(self.nStates)
        ])
        observations = [true_emission_p[state].emit() for state in true_states]

        text = \
            """
            True init probs:
            {}
            Ours:
            {}: {}
            True emission probs:
            {}
            Ours:
            {}
            True trans probs:
            {}
            Ours:
            {}: {}
            Observations ({}):
            {}
                        """
        print text.format(
            true_init_p, np.exp(hmm.initialProbabilities),
            np.sum(np.abs(true_init_p - np.exp(hmm.initialProbabilities))),
            true_emission_p, hmm.emissionDistributions, true_trans_p,
            np.exp(hmm.transitionMatrix),
            np.sum(np.abs(true_trans_p - np.exp(hmm.transitionMatrix))),
            observation_size, observations)

        hmm.train(observations, iterations=10, auto_stop=True)
        print text.format(
            true_init_p, np.exp(hmm.initialProbabilities),
            np.sum(np.abs(true_init_p - np.exp(hmm.initialProbabilities))),
            true_emission_p, hmm.emissionDistributions, true_trans_p,
            np.exp(hmm.transitionMatrix),
            np.sum(np.abs(true_trans_p - np.exp(hmm.transitionMatrix))),
            observation_size, observations)
Exemplo n.º 3
0
    def __init__(self, number_of_states, state_labels=None, verbose=False, random_transitions=False,
                 *args, **kwargs):
        self.current_state = None
        if state_labels is None:
            state_labels = ["State_%d" % i for i in range(number_of_states)]
        assert len(set(state_labels)) == number_of_states
        self.nStates = number_of_states
        self.transitionMatrix = np.empty((self.nStates, self.nStates))
        self.initialProbabilities = np.empty(shape=self.nStates)
        if not random_transitions:
            self.transitionMatrix.fill(1. / self.nStates)
            self.initialProbabilities.fill(1. / self.nStates)
        else:
            self.transitionMatrix = random_simplex(self.nStates, two_d=True)
            self.initialProbabilities = random_simplex(self.nStates)

        self.emissionDistributions = np.array([None for _ in range(self.nStates)], dtype=object)
        self.stateLabels = state_labels
        self.verbose = verbose
Exemplo n.º 4
0
    def test_training(self):
        self.nStates = 3
        self.nSymbols = 2
        from numpy.random import choice
        observation_size = 1000

        hmm = self.new_hmm(random_transitions=True, random_emissions=True)
        # hmm.setup_strict_left_to_right()
        true_init_p = random_simplex(self.nStates)
        true_states = [choice(range(self.nStates), p=true_init_p)]
        true_trans_p = np.array([[.50, .15, .35], [.10, .80, .10],
                                 [.20, .10, .70]
                                 ])  # random_simplex(self.nStates, two_d=True)
        for i in range(1, observation_size):
            true_states.append(
                choice(range(self.nStates), p=true_trans_p[true_states[-1]]))
        true_emission_p = np.array([[.70, .30], [.40, .60], [
            .10, .90
        ]])  # [random_simplex(self.nSymbols) for _ in range(self.nStates)]
        observations = [
            choice(range(self.nSymbols), p=true_emission_p[state])
            for state in true_states
        ]

        text = \
            """
            True init probs:
            {}
            Ours:
            {}
            True emission probs:
            {}
            Ours:
            {}
            True trans probs:
            {}
            Ours:
            {}
            Observations ({}):
            {}
                        """
        print text.format(
            true_init_p, hmm.initialProbabilities, true_emission_p,
            np.array([p.probabilities for p in hmm.emissionDistributions]),
            true_trans_p, hmm.transitionMatrix, observation_size, observations)

        hmm.train(observations, auto_stop=True, iterations=30)
        print text.format(
            true_init_p, hmm.initialProbabilities, true_emission_p,
            np.array([p.probabilities for p in hmm.emissionDistributions]),
            true_trans_p, hmm.transitionMatrix, observation_size, observations)
Exemplo n.º 5
0
    def test_training(self):
        self.nStates = 3
        self.nDimensions = 1

        from numpy.random import choice

        observation_size = 10

        hmm = self.new_hmm(random_transitions=True)  # , random_emissions=True)
        # hmm.setup_strict_left_to_right()
        true_init_p = random_simplex(self.nStates)
        true_states = [choice(range(self.nStates), p=true_init_p)]
        true_trans_p = np.array(
            [[0.60, 0.30, 0.10], [0.10, 0.80, 0.10], [0.30, 0.10, 0.60]]
        )  # random_simplex(self.nStates, two_d=True)
        for i in range(1, observation_size):
            true_states.append(choice(range(self.nStates), p=true_trans_p[true_states[-1]]))
        true_emission_p = np.array(
            [GaussianDistribution(dimensions=self.nDimensions, random=True) for _ in range(self.nStates)]
        )
        observations = [true_emission_p[state].emit() for state in true_states]

        text = """
            True init probs:
            {}
            Ours:
            {}: {}
            True emission probs:
            {}
            Ours:
            {}
            True trans probs:
            {}
            Ours:
            {}: {}
            Observations ({}):
            {}
                        """
        print text.format(
            true_init_p,
            np.exp(hmm.initialProbabilities),
            np.sum(np.abs(true_init_p - np.exp(hmm.initialProbabilities))),
            true_emission_p,
            hmm.emissionDistributions,
            true_trans_p,
            np.exp(hmm.transitionMatrix),
            np.sum(np.abs(true_trans_p - np.exp(hmm.transitionMatrix))),
            observation_size,
            observations,
        )

        hmm.train(observations, iterations=10, auto_stop=True)
        print text.format(
            true_init_p,
            np.exp(hmm.initialProbabilities),
            np.sum(np.abs(true_init_p - np.exp(hmm.initialProbabilities))),
            true_emission_p,
            hmm.emissionDistributions,
            true_trans_p,
            np.exp(hmm.transitionMatrix),
            np.sum(np.abs(true_trans_p - np.exp(hmm.transitionMatrix))),
            observation_size,
            observations,
        )
Exemplo n.º 6
0
 def __init__(self, n, randomize=False):
     self.n = n
     # initialize to 1/n
     self.probabilities = np.array([1. / n] * n)
     if randomize:
         self.probabilities = random_simplex(n)
Exemplo n.º 7
0
 def __init__(self, n, randomize=False):
     self.n = n
     # initialize to 1/n
     self.probabilities = np.array([1. / n] * n)
     if randomize:
         self.probabilities = random_simplex(n)