0

我正在尝试使用 STAN 估计多元正态分布的均值和协方差矩阵。我首先导入 pystan 并生成数据。我基本上尝试遵循 Python 的官方 YouTube教程

import pystan as ps
import numpy as np
data = np.random.multivariate_normal(mean=[0.7, 0], cov=[[1,1], [1,2]], size=200)

然后我指定我的模型。我的数据有形状(200,2)。因为我有一个多元分布,所以平均值必须是一个向量,协方差是一个矩阵。

model =
"""
data 
{
    int N; // Number of data points.
    vector[2] X[N]; // Values.
}
parameters
{
   vector[2] mu; // Mean
   matrix[2,2] sigma; // Covariance matrix.
}
model 
{
   X ~ multi_normal(mu, sigma); 
}                                      
"""

然后我将数据放入字典中,如 YouTube 上的 STAN 教程所示

my_data = {"N": 200, "X": data}
sm = ps.StanModel(model_code = model)

该模型编译没有问题。但是,当我尝试拟合模型时,会出现运行时错误。

fit = sm.sampling(data=my_data, iter=1000, chains=4)

导致

/usr/lib/python3.6/multiprocessing/pool.py in get(self, timeout)
    642             return self._value
    643         else:
--> 644             raise self._value
    645 
    646     def _set(self, i, obj):

RuntimeError: Initialization failed.

我不确定是什么导致了这个错误,因为我的代码只是对教程中的代码的一个轻微抽象。

4

1 回答 1

1

我自己找到了答案。在第二个代码块中,我们需要替换matrix[2,2]cov_matrix[2].

 matrix[2,2] sigma; // Covariance matrix.

然后变成

cov_matrix[2] sigma; // Covariance matrix.

显然,STAN 对正定对称矩阵(例如协方差矩阵)具有特殊的数据类型。这种简单的替换使代码运行而不会引发错误。

于 2020-11-12T09:39:54.303 回答