2016-09-30 23 views
0

scipyを使用して直交型の多変量ガウス分布を定義する際に問題があります。私は平均ベクトルと共分散行列を入力としてガウス関数を返す関数を書いています。Scipyを使用して直交型の多変量ガウス関数を定義する

def make_mvn_pdf(mu, sigma): 
    def f(x): 
     return sp.stats.multivariate_normal.pdf(x, mu, sigma) 
    return f 

私はガウス分布を定義し、私は意味がありませんエラーが出るガウスへのインデックスにしようとするmake_mvn_pdfを使用しています。私は確率を取り戻すために密度の観測に渡ししよう

# define covariance matrix 
Sigma = np.asarray([[1, .15], [.15, 1]]) 
# define propagator 
B = np.diag([2, 2]) 
# define data 
Obs = np.array([[-0.06895746],[ 0.18778 ]]) 

# define a Gaussian PDF: 
g_int_func = make_mvn_pdf(mean = np.dot(B,Obs[t,:]), cov = Sigma) 

:私は、平均ベクトルと共分散行列を定義し、make_mvn_pdfにそれらを渡すことによって開始

testarray=np.random.random((2,2)) 
g_int_func(testarray) 

これは以下を返します。私が理解していないエラー。

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-50-083a1915f674> in <module>() 
    1 g_int_func = make_mvn_pdf(np.dot(B,Obs[t,:]),Gamma) 
----> 2 g_int_func(testarray) 

/Users/...in f(x) 
17 def make_mvn_pdf(mu, sigma): 
18  def f(x): 
---> 19   return sp.stats.multivariate_normal.pdf(x, mu, sigma) 
20  return f 
21 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in pdf(self, x, mean, cov, allow_singular) 
427 
428   """ 
--> 429   dim, mean, cov = _process_parameters(None, mean, cov) 
430   x = _process_quantiles(x, dim) 
431   psd = _PSD(cov, allow_singular=allow_singular) 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in _process_parameters(dim, mean, cov) 
54 
55  if mean.ndim != 1 or mean.shape[0] != dim: 
---> 56   raise ValueError("Array 'mean' must be a vector of length %d." % dim) 
57  if cov.ndim == 0: 
58   cov = cov * np.eye(dim) 

ValueError: Array 'mean' must be a vector of length 2. 

ValueErrorは、配列meanが長さ2のベクトルでなければならないと述べていますが、これが該当します。実際には、平均と共分散行列の次元と渡されるデータの長さはすべて2です。

+0

ないことが重要しかし、ガンマ上記シグマとOBSでなければならないこと[1 ,:]あなたが[MCVE]にコードを並べ替えるでしOBS – user2687863

+0

を読んでください(http://stackoverflow.com/help/mcve) ?現在、 't'は定義されておらず、' Obs'は完全に定義されていません。編集することなく単純にコピーして実行できる完璧な自己完結型のサンプルがあれば、私たちがあなたを助けるのはずっと簡単です。 –

+0

ありがとうございました。非常にイライラしていた... – user2687863

答えて

2

平均値はnp.dot(B, Obs)です(コメント内で示唆した変更を考慮して)。B形状(2,2)を有し、Obsは形状(2,1)を有する。そのdotコールの結果はshape(2,1)です。問題は、2つの次元配列であり、multivariate_normal.pdfmuの1つの次元配列、つまりシェイプ(2、)の配列になると予測しています。多くの人にとって、形状(n、1)がの配列は(列)のベクトルであるため、エラーメッセージには「ベクトル」という単語が使用されています。

  • 、あなたがObsは、形状(2を持っていることを確認できます。問題を解決するには、少なくとも2つの簡単な方法があります

    )「配列は、長さ2の1次元配列でなければなりません 『を意味します』」 )の代わりに(2,1)、例えばObs = np.array([-0.06895746, 0.18778])np.dot(B, Obs)の形状は(2、)です。
  • mean引数をravelメソッド「mean=np.dot(B,Obs).ravel()」を使用して「展開」します。
関連する問題