def sample_path(P, init=0, sample_size=1000): """ Generates one sample path from a finite Markov chain with (n x n) Markov matrix P on state space S = {0,...,n-1}. Parameters: * P is a nonnegative 2D NumPy array with rows that sum to 1 * init is either an integer in S or a nonnegative array of length n with elements that sum to 1 * sample_size is an integer If init is an integer, the integer is treated as the determinstic initial condition. If init is a distribution on S, then X_0 is drawn from this distribution. Returns: A NumPy array containing the sample path """ # === set up array to store output === # X = np.empty(sample_size, dtype=int) if isinstance(init, int): X[0] = init else: X[0] = discreteRV(init).draw() # === turn each row into a distribution === # # In particular, let P_dist[i] be the distribution corresponding to the # i-th row P[i,:] n = len(P) P_dist = [discreteRV(P[i, :]) for i in range(n)] # === generate the sample path === # for t in range(sample_size - 1): X[t + 1] = P_dist[X[t]].draw() return X
def sample_path(P, init=0, sample_size=1000): """ Generates one sample path from a finite Markov chain with (n x n) Markov matrix P on state space S = {0,...,n-1}. Parameters: * P is a nonnegative 2D NumPy array with rows that sum to 1 * init is either an integer in S or a nonnegative array of length n with elements that sum to 1 * sample_size is an integer If init is an integer, the integer is treated as the determinstic initial condition. If init is a distribution on S, then X_0 is drawn from this distribution. Returns: A NumPy array containing the sample path """ # === set up array to store output === # X = np.empty(sample_size, dtype=int) if isinstance(init, int): X[0] = init else: X[0] = discreteRV(init).draw() # === turn each row into a distribution === # # In particular, let P_dist[i] be the distribution corresponding to the # i-th row P[i,:] n = len(P) P_dist = [discreteRV(P[i,:]) for i in range(n)] # === generate the sample path === # for t in range(sample_size - 1): X[t+1] = P_dist[X[t]].draw() return X
import matplotlib.pyplot as plt import numpy as np from discrete_rv import discreteRV from career import * from compute_fp import compute_fixed_point wp = workerProblem() v_init = np.ones((wp.N, wp.N))*100 v = compute_fixed_point(bellman, wp, v_init) optimal_policy = get_greedy(wp, v) F = discreteRV(wp.F_probs) G = discreteRV(wp.G_probs) def gen_first_passage_time(): t = 0 i = j = 0 theta_index = [] epsilon_index = [] while 1: if optimal_policy[i, j] == 1: # Stay put return t elif optimal_policy[i, j] == 2: # New job j = int(G.draw()) else: # New life i, j = int(F.draw()), int(G.draw()) t += 1 M = 25000 # Number of samples samples = np.empty(M) for i in range(M): samples[i] = gen_first_passage_time()
Simulate job / career paths and compute the waiting time to permanent job / career. In reading the code, recall that optimal_policy[i, j] = policy at (theta_i, epsilon_j) = either 1, 2 or 3; meaning 'stay put', 'new job' and 'new life'. """ import matplotlib.pyplot as plt import numpy as np from discrete_rv import discreteRV from career import * from compute_fp import compute_fixed_point wp = workerProblem() v_init = np.ones((wp.N, wp.N)) * 100 v = compute_fixed_point(bellman, wp, v_init) optimal_policy = get_greedy(wp, v) F = discreteRV(wp.F_probs) G = discreteRV(wp.G_probs) def gen_path(T=20): i = j = 0 theta_index = [] epsilon_index = [] for t in range(T): if optimal_policy[i, j] == 1: # Stay put pass elif optimal_policy[i, j] == 2: # New job j = int(G.draw()) else: # New life i, j = int(F.draw()), int(G.draw()) theta_index.append(i)