IndisputableMonolith.Statistics.BayesianFilteringFromVFE
IndisputableMonolith/Statistics/BayesianFilteringFromVFE.lean · 73 lines · 10 declarations
show as:
view math explainer →
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