Я изо всех сил пытаюсь понять, как векторизовать случайное блуждание в 1-D, где следующий шаг определяется вероятностью текущего шага.
Я использую эту модель:
class MarkovChain(object):
def __init__(self, transition_matrix, states):
"""
Initialize the MarkovChain instance.
Parameters
----------
transition_matrix: 2-D array
A 2-D array representing the probabilities of change of
state in the Markov Chain.
states: 1-D array
An array representing the states of the Markov Chain. It
needs to be in the same order as transition_matrix.
"""
#self.transition_matrix = np.atleast_2d(transition_matrix)
self.transition_matrix = transition_matrix
self.states = states
self.index_dict = {self.states[index]: index for index in
range(len(self.states))}
self.state_dict = {index: self.states[index] for index in
range(len(self.states))}
def next_state(self, current_state):
"""
Returns the state of the random variable at the next time
instance.
Parameters
----------
current_state: str
The current state of the system.
"""
#if else condition is to return the correct type for the transition matrix:
# a scipy sparse matrix, or a numpy array
if isinstance(transition_matrix, scipy.sparse.csr.csr_matrix):
probs = self.transition_matrix[self.index_dict[current_state], :].A.reshape(-1)
else:
probs = self.transition_matrix[self.index_dict[current_state], :].A1
probs /= probs.sum()
return np.random.choice(
self.states,
p= probs
)
def generate_states(self, current_state, no=10):
"""
Generates the next states of the system.
Parameters
----------
current_state: str
The state of the current random variable.
no: int
The number of future states to generate.
"""
future_states = [current_state]
for i in range(no):
next_state = self.next_state(current_state)
future_states.append(next_state)
current_state = next_state
return future_states
Я хотел бы ускорить последнюю функцию или, в конечном итоге, провести рефакторинг кода, чтобы получить непосредственно сгенерированный случайный набор из n
шагов.
Обратите внимание, что следующее состояние не выбирается случайным образом равномерно, но он выбран с вероятностью p
(не уверен, технически ли это коррелированная случайная прогулка).
Моя цель - получить путь состояний прогулки, возможно, избегая использовать a для l oop.
ПРИМЕЧАНИЕ: я могу связать модель с этим ответом Получить список узлов из случайного обхода в сетиX и позаимствовать из него, будучи T матрицей перехода :
the first step (walk) can be evaluated as p^(1) = T p^(0).
Iteratively, the k-th random walk step can be evaluated as p^(k) = T p^(k-1).
Тем не менее, в приведенном выше ответе используйте a для l oop:
visited = list()
for k in range(walkLength):
# evaluate the next state vector
p = numpy.dot(T,p)
# choose the node with higher probability as the visited node
visited.append(numpy.argmax(p))
Как можно векторизовать прогулку, поскольку все последующие шаги зависят от выбора текущих шагов?