Ioana A. Cosma and Ludger Evers, Markov Chains and Monte Carlo Methods
http://users.aims.ac.za/~ioana/notes.pdf
CC-by-nc-sa 2.5
http://creativecommons.org/licenses/by-nc-sa/2.5/za/legalcode
Q and A
task1
def m_trans(K, m):
# A, Bがnp.array型のときA * BやA**nはアダマール積として扱われるので,
# np.matrix型に変換する.
K = np.matrix(K)
return K**m
m_trans(np.array([[0.9, 0.1], [0.3, 0.7]]), 3)
->
matrix([[ 0.804, 0.196],
[ 0.588, 0.412]])
task2
def dist_t(K, t, lambda_0):
return np.transpose(lambda_0).dot(m_trans(K, t))
# phone lineの例で,stationary distributionを試すと
dist_t(np.array([[0.9, 0.1], [0.3, 0.7]]), 100, np.array([0.75, 0.25]))
->
matrix([[ 0.75, 0.25]])
task3
def stationary(K):
K = np.matrix(K)
dim = len(K)
b = np.zeros(dim+1)
b[dim] = 1
up = np.transpose(K - np.matrix(np.identity(dim)))
mu = np.linalg.lstsq(np.array(np.concatenate((up, [np.ones(dim)]))), b)
print(mu[0])
stationary(K)
->
[ 0.75 0.25]
task4
t = np.linspace(0, 25)
a = np.random.uniform()
init = np.array([a, 1-a])
def pow_generator(K): # Kのべき乗を生成するジェネレータ
K = np.matrix(K)
tmp = np.identity(len(K))
while True:
tmp = K.dot(tmp)
yield tmp
gen = pow_generator(K)
process = [np.array(init.dot(next(gen)))[0] for t in range(25)]
plt.plot(process, marker=".")
plt.ylim([0, 1])
plt.show()
->
task5
def sample_path(K, init, tau):
states = list(range(len(init))) # ここではstateは0から番号を付ける
x0 = np.random.choice(states, p=init)
path = [x0]
tmp = x0
for i in range(tau):
suc = np.random.choice(states, p=K[tmp])
tmp = suc
path.append(suc)
return path
plt.plot(sample_path(K, [0.5, 0.5], 100))
plt.show()
->
task6
path = sample_path(K, [0.5,0.5],20000)
avg = []
for i in range(1, 100):
avg.append(np.average(path[: 200 * i]))
plt.plot(avg)
plt.show()
->
0 件のコメント:
コメントを投稿