From eac0b798ffd45180d240657ef89c0e12cd8880e2 Mon Sep 17 00:00:00 2001 From: jessegrabowski Date: Thu, 15 May 2025 15:40:25 +0800 Subject: [PATCH 1/3] Compute accept probability with `logsumexp` --- pymc/step_methods/metropolis.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pymc/step_methods/metropolis.py b/pymc/step_methods/metropolis.py index 70c650653d..88f94c7a2a 100644 --- a/pymc/step_methods/metropolis.py +++ b/pymc/step_methods/metropolis.py @@ -314,10 +314,13 @@ def astep(self, q0: RaveledVars) -> tuple[RaveledVars, StatsType]: self.steps_until_tune -= 1 + self.accept_rate_iter = np.atleast_1d(self.accept_rate_iter) + log_N = np.log(self.accept_rate_iter.shape[0]) + stats = { "tune": self.tune, "scaling": np.mean(self.scaling), - "accept": np.mean(np.exp(self.accept_rate_iter)), + "accept": np.exp(scipy.special.logsumexp(self.accept_rate_iter) - log_N), "accepted": np.mean(self.accepted_iter), } From 481342a1c141c0b1bd139a05eeaaf7f967583468 Mon Sep 17 00:00:00 2001 From: jessegrabowski Date: Thu, 15 May 2025 16:09:10 +0800 Subject: [PATCH 2/3] `accept_rate_iter` should always be an array --- pymc/step_methods/metropolis.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pymc/step_methods/metropolis.py b/pymc/step_methods/metropolis.py index 88f94c7a2a..7aba12dce9 100644 --- a/pymc/step_methods/metropolis.py +++ b/pymc/step_methods/metropolis.py @@ -308,13 +308,12 @@ def astep(self, q0: RaveledVars) -> tuple[RaveledVars, StatsType]: else: accept_rate = self.delta_logp(q, q0d) q, accepted = metrop_select(accept_rate, q, q0d, rng=self.rng) - self.accept_rate_iter = accept_rate + self.accept_rate_iter[:] = accept_rate self.accepted_iter[0] = accepted self.accepted_sum += accepted self.steps_until_tune -= 1 - self.accept_rate_iter = np.atleast_1d(self.accept_rate_iter) log_N = np.log(self.accept_rate_iter.shape[0]) stats = { From 082719651a087e1e1a8b66e5ffc92be73ef1c669 Mon Sep 17 00:00:00 2001 From: Jesse Grabowski <48652735+jessegrabowski@users.noreply.github.com> Date: Wed, 21 May 2025 06:29:12 +0200 Subject: [PATCH 3/3] Update pymc/step_methods/metropolis.py Co-authored-by: Ricardo Vieira <28983449+ricardoV94@users.noreply.github.com> --- pymc/step_methods/metropolis.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymc/step_methods/metropolis.py b/pymc/step_methods/metropolis.py index 7aba12dce9..c4787fa7a0 100644 --- a/pymc/step_methods/metropolis.py +++ b/pymc/step_methods/metropolis.py @@ -308,7 +308,7 @@ def astep(self, q0: RaveledVars) -> tuple[RaveledVars, StatsType]: else: accept_rate = self.delta_logp(q, q0d) q, accepted = metrop_select(accept_rate, q, q0d, rng=self.rng) - self.accept_rate_iter[:] = accept_rate + self.accept_rate_iter[0] = accept_rate self.accepted_iter[0] = accepted self.accepted_sum += accepted