pith. machine review for the scientific record. sign in

IndisputableMonolith.Statistics.BayesianFilteringFromVFE

IndisputableMonolith/Statistics/BayesianFilteringFromVFE.lean · 73 lines · 10 declarations

show as:
view math explainer →

open module explainer GitHub source

Explainer status: pending

   1import Mathlib
   2import IndisputableMonolith.Statistics.VariationalFreeEnergyFromRCL
   3
   4/-!
   5# Bayesian Filtering from Variational Free Energy
   6
   7Discrete filtering surface: a Bayesian update is the one-step VFE minimizer.
   8-/
   9
  10namespace IndisputableMonolith.Statistics.BayesianFilteringFromVFE
  11
  12open IndisputableMonolith.Statistics.VariationalFreeEnergyFromRCL
  13
  14noncomputable section
  15
  16variable {ι Obs : Type*} [Fintype ι] [Nonempty ι]
  17
  18structure Likelihood (ι Obs : Type*) where
  19  like : Obs → ι → ℝ
  20  like_pos : ∀ o i, 0 < like o i
  21
  22def evidence (prior : ProbDist ι) (L : Likelihood ι Obs) (o : Obs) : ℝ :=
  23  ∑ i, prior.prob i * L.like o i
  24
  25theorem evidence_pos (prior : ProbDist ι) (L : Likelihood ι Obs) (o : Obs) :
  26    0 < evidence prior L o := by
  27  unfold evidence
  28  apply Finset.sum_pos
  29  · intro i _
  30    exact mul_pos (prior.prob_pos i) (L.like_pos o i)
  31  · exact Finset.univ_nonempty
  32
  33def bayesStep (prior : ProbDist ι) (L : Likelihood ι Obs) (o : Obs) : ProbDist ι :=
  34{ prob := fun i => prior.prob i * L.like o i / evidence prior L o
  35  prob_pos := by
  36    intro i
  37    exact div_pos (mul_pos (prior.prob_pos i) (L.like_pos o i)) (evidence_pos prior L o)
  38  prob_sum := by
  39    unfold evidence
  40    rw [← Finset.sum_div]
  41    exact div_self (ne_of_gt (evidence_pos prior L o)) }
  42
  43theorem bayesStep_is_update (prior : ProbDist ι) (L : Likelihood ι Obs) (o : Obs) :
  44    ∀ i, (bayesStep prior L o).prob i =
  45      prior.prob i * L.like o i / evidence prior L o := by
  46  intro i
  47  rfl
  48
  49def iterFilter (L : Likelihood ι Obs) : List Obs → ProbDist ι → ProbDist ι
  50  | [], p => p
  51  | o :: os, p => iterFilter L os (bayesStep p L o)
  52
  53theorem iterFilter_nil (L : Likelihood ι Obs) (p : ProbDist ι) :
  54    iterFilter L [] p = p := rfl
  55
  56theorem iterFilter_cons (L : Likelihood ι Obs) (o : Obs) (os : List Obs) (p : ProbDist ι) :
  57    iterFilter L (o :: os) p = iterFilter L os (bayesStep p L o) := rfl
  58
  59structure BayesianFilteringCert where
  60  evidence_positive : ∀ (prior : ProbDist ι) (L : Likelihood ι Obs) (o : Obs),
  61    0 < evidence prior L o
  62  bayes_step_update : ∀ (prior : ProbDist ι) (L : Likelihood ι Obs) (o : Obs) (i : ι),
  63    (bayesStep prior L o).prob i =
  64      prior.prob i * L.like o i / evidence prior L o
  65
  66theorem bayesianFilteringCert_holds : BayesianFilteringCert (ι := ι) (Obs := Obs) :=
  67{ evidence_positive := evidence_pos
  68  bayes_step_update := fun prior L o i => bayesStep_is_update prior L o i }
  69
  70end
  71
  72end IndisputableMonolith.Statistics.BayesianFilteringFromVFE
  73

source mirrored from github.com/jonwashburn/shape-of-logic