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
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)
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
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)
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, )
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)