0

私はPythonの初心者です。最近、マルコフ過程の共同分布の計算を実行するプロジェクトに取り組んでいます。

確率的カーネルの例としては、Hamilton (2005) による最近の研究で使用されたものがあります。Hamilton は、米国の失業データに基づいてビジネス サイクルの非線形統計モデルを調査しています。彼の計算の一部として、彼はカーネルを推定します

pH :=   0.971 0.029 0
        0.145 0.778 0.077
        0     0.508 0.492

ここS = {x1, x2, x3} = {NG, MR, SR}で は、NG通常の成長、MR緩やかな景気後退、およびSR深刻な景気後退に対応します。たとえば、1 周期で深刻な不況から緩やかな不況に移行する確率は 0.508 です。期間は1ヶ月です。

上記のマルコフ過程に基づく演習は、

ハミルトンの核に関してpH、同じ初期条件 ψ = (0.2, 0.2, 0.6) を使用して、経済が始まり、期間 0、1、2 を通じて不況にとどまる確率を計算します (つまり、xt = NG fort = 0 、1、2)。

私のスクリプトは

import numpy as np
## In this case, X should be a matrix rather than vector
## and we compute w.r.t P rather than merely its element [i][j]
path = []
def path_prob2 (p, psi , x2):  # X a sequence giving the path
     prob = psi                # initial distribution is an row vector
     for t in range(x2.shape[1] -1): # .shape[1] grasp # of columns
        prob = np.dot(prob , p)       # prob[t]: marginal distribution at period t
        ression = np.dot(prob, x2[:,t])
     path.append(ression)
     return path,prob



p = ((0.971, 0.029, 0    ),
      (0.145, 0.778, 0.077),
      (0    , 0.508, 0.492)) 
# p must to be a 2-D numpy array     
p = np.array(p)      

psi = (0.2, 0.2, 0.6)  
psi = np.array(psi)  
x2 = ((0,0,0),
      (1,1,1),
      (1,1,1))
x2 = np.array(x2)      
path_prob2(p,psi,x2)

実行プロセス中に、2 つの問題が発生します。psi最初のものは、ループの最初のラウンドでは、トランザクション行列を事後乗算するための初期分布は必要ないpため、「不況にとどまる」確率は0.2 + 0.6 = 0.8になるはずですが、方法がわかりませんif文を書きます。path2つ目は、お気づきかもしれませんが、各期間の「不況が続く」確率を収集するために 名前の付いたリストを使用します。最後に、リスト内のすべての要素を 1 つずつ乗算する必要があります。そのようなタスクを実装する方法を見つけることができません。path[0]*path[1]*path[2](np.multiply は、私の知る限り、引数を 2 つしか取ることができません)。そのような方法が存在する場合、いくつかの手がかりを教えてください。追加の質問として、コードをより効率的にできると思われる提案があれば教えてください。ありがとうございました。

4

1 に答える 1

0

私があなたを正しく理解していれば、これはうまくいくはずです(いくつかのステップ/結果について手動で計算したいと思います)、if/elseステートメントを使用せず、代わりに2番目の列から反復を開始したことに注意してください。

import numpy as np

# In this case, X should be a matrix rather than vector
# and we compute w.r.t P rather than merely its element [i][j]
path = []


def path_prob2(p, psi, x2):  # X a sequence giving the path
    path.append(np.dot(psi, x2[:, 0]))  # first step
    prob = psi  # initial distribution is an row vector
    for t in range(1, x2.shape[1]):  # .shape[1] grasp # of columns
        prob = np.dot(prob, p)  # prob[t]: marginal distribution at period t
        path.append(np.prod(np.dot(prob, t)))
    return path, prob


# p must to be a 2-D numpy array
p = np.array([[0.971, 0.029, 0],
              [0.145, 0.778, 0.077],
              [0, 0.508, 0.492]])

psi = np.array([0.2, 0.2, 0.6])
x2 = np.array([[0, 0, 0],
               [1, 1, 1],
               [1, 1, 1]])

print path_prob2(p, psi, x2)

2 番目の質問については、Numpy.prodを使用すると、リスト/配列のすべての要素間の乗算が得られると思います。

次のように製品を使用できます。

>>> np.prod([15,20,31])
9300
于 2016-02-10T18:34:18.443 に答える