ПРИМЕЧАНИЕ : у меня есть рабочий код, использующий медленные циклы 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
Я уверен, что есть более простой подход, чем я выбрал, возможно, целый ряд исследований по этой теме, не говоря уже о том, что моя тупица-фу все еще борется Любые мысли о том, как грубые состояния зерна / коллапса вквадратная матрица, как это?