如何在Numpy中优化概率矩阵的“粗粒度”?

时间:2019-02-21 23:42:18

标签: python numpy markov-chains markov

注意:我有使用慢速Python for循环的工作代码,并且正在尝试使其变得更加麻木。

我在numpy中有一个2D数组; Stochastic Matrix,过渡矩阵,过渡概率矩阵或马尔可夫矩阵。

随机矩阵:第i行包含转换为状态j的概率。仅此而已。请注意,行始终加为1,列不需要加。

在下面的示例中,状态00.5机会转换到状态0(自身)和1中的每个状态。

我想使国家崩溃,以“粗粮”。因此,例如,状态01应该将其概率组合在一起,这样就可以将它们视为一个状态。

tpm = np.array([
    [0.3, 0.7, 0],
    [0.3, 0.7, 0],
    [0,   0,   1],
])
g = np.array([0,0,1])

>>> coarse_grain(tpm, g)
[[1. 0.]
[0. 1.]]

我已经提出了,但是很慢:

def coarse_grain_old(tpm, tpm_group): # slow
    group_ixs = [np.argwhere(tpm_group == i).flatten() for i in np.unique(tpm_group)]
    n = len(group_ixs)
    ntpm = np.zeros((n,n))
    group_ixs = [np.argwhere(tpm_group == i).flatten() for i in np.unique(tpm_group)]
    n = len(group_ixs)
    for nix, ixs in enumerate(group_ixs):
        for njx, jxs in enumerate(group_ixs):
            nijx = np.ix_(ixs, jxs)
            ntpm[nix, njx] = np.mean(np.sum(tpm[nijx], axis=1))
    return ntpm

我敢肯定,有比我更容易采取的方法,也许是围绕该主题进行的大量研究,更不用说我的numpy-fu仍在挣扎了关于如何在正方形矩阵中粗化晶粒/塌陷状态的任何想法这个吗?

0 个答案:

没有答案