Как я могу оптимизировать это «грубое зерно» матрицы вероятностей в Numpy? - PullRequest
0 голосов
/ 22 февраля 2019

ПРИМЕЧАНИЕ : у меня есть рабочий код, использующий медленные циклы for Python, и я пытаюсь сделать его более понятным.

У меня есть двумерный массив в numpy; Стохастическая матрица , или Матрица переходов, или Матрица вероятностей переходов, или Матрица Маркова.

Матрица стохастиков : строка i содержит вероятности перехода в состояниеj.Вот и все.Обратите внимание, строки всегда добавляются к 1, столбцы не нужны.

В следующем примере состояние 0 имеет 0.5 шанс перехода в каждое из состояний 0 (само по себе) и 1.

Я хотел бы объединить состояния вместе, чтобы "грубое зерно".Так, например, состояния 0 и 1 должны объединять их вероятности, чтобы их можно было рассматривать как одно состояние.

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

Я уверен, что есть более простой подход, чем я выбрал, возможно, целый ряд исследований по этой теме, не говоря уже о том, что моя тупица-фу все еще борется Любые мысли о том, как грубые состояния зерна / коллапса вквадратная матрица, как это?

...