Skip to content

Commit 5a1e0d6

Browse files
authored
likelihoodof (#78)
1 parent e3053df commit 5a1e0d6

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

src/combinators/likelihood.jl

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ struct Likelihood{K,X} <: AbstractLikelihood
121121
Likelihood(μ, x) = Likelihood(kernel(μ), x)
122122
end
123123

124+
(lik::AbstractLikelihood)(p) = exp(ULogarithmic, logdensityof(lik.k(p), lik.x))
125+
124126
DensityInterface.DensityKind(::AbstractLikelihood) = IsDensity()
125127

126128
function Pretty.quoteof(ℓ::Likelihood)
@@ -146,24 +148,24 @@ end
146148

147149
# basemeasure(ℓ::Likelihood) = @error "Likelihood requires local base measure"
148150

149-
export likelihood
151+
export likelihoodof
150152

151153
"""
152-
likelihood(k::AbstractTransitionKernel, x; constraints...)
153-
likelihood(k::AbstractTransitionKernel, x, constraints::NamedTuple)
154+
likelihoodof(k::AbstractTransitionKernel, x; constraints...)
155+
likelihoodof(k::AbstractTransitionKernel, x, constraints::NamedTuple)
154156
155157
A likelihood is *not* a measure. Rather, a likelihood acts on a measure, through
156158
the "pointwise product" `⊙`, yielding another measure.
157159
"""
158-
function likelihood end
160+
function likelihoodof end
159161

160-
likelihood(k, x, ::NamedTuple{()}) = Likelihood(k, x)
162+
likelihoodof(k, x, ::NamedTuple{()}) = Likelihood(k, x)
161163

162-
likelihood(k, x; kwargs...) = likelihood(k, x, NamedTuple(kwargs))
164+
likelihoodof(k, x; kwargs...) = likelihoodof(k, x, NamedTuple(kwargs))
163165

164-
likelihood(k, x, pars::NamedTuple) = likelihood(kernel(k, pars), x)
166+
likelihoodof(k, x, pars::NamedTuple) = likelihoodof(kernel(k, pars), x)
165167

166-
likelihood(k::AbstractTransitionKernel, x) = Likelihood(k, x)
168+
likelihoodof(k::AbstractTransitionKernel, x) = Likelihood(k, x)
167169

168170
export log_likelihood_ratio
169171

@@ -182,4 +184,22 @@ more efficient than
182184
"""
183185
log_likelihood_ratio(ℓ::Likelihood, p, q) = logdensity_rel(ℓ.k(p), ℓ.k(q), ℓ.x)
184186

185-
# likelihood(k, x; kwargs...) = likelihood(k, x, NamedTuple(kwargs))
187+
# likelihoodof(k, x; kwargs...) = likelihoodof(k, x, NamedTuple(kwargs))
188+
189+
export likelihood_ratio
190+
191+
"""
192+
likelihood_ratio(ℓ::Likelihood, p, q)
193+
194+
Compute the log of the likelihood ratio, in order to compare two choices for
195+
parameters. This is equal to
196+
197+
density_rel(ℓ.k(p), ℓ.k(q), ℓ.x)
198+
199+
but is computed using LogarithmicNumbers.jl to avoid underflow and overflow.
200+
Since `density_rel` can leave common base measure unevaluated, this can be
201+
more efficient than
202+
203+
logdensityof(ℓ.k(p), ℓ.x) - logdensityof(ℓ.k(q), ℓ.x)
204+
"""
205+
likelihood_ratio(ℓ::Likelihood, p, q) = exp(ULogarithmic, logdensity_rel(ℓ.k(p), ℓ.k(q), ℓ.x))

0 commit comments

Comments
 (0)