Векторизация случайного блуждания по графику для исключения цикла - PullRequest
0 голосов
/ 09 января 2020

Я изо всех сил пытаюсь понять, как векторизовать случайное блуждание в 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))

Как можно векторизовать прогулку, поскольку все последующие шаги зависят от выбора текущих шагов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...