Skip to content

Commit 2056a1c

Browse files
kkytolakkytolaurkud
authored andcommitted
feat: Lévy-Prokhorov distance (#8719)
This PR adds the Lévy-Prokhorov distance on the space of finite measures on an emetric space, and shows that it is a pseudoemetric. Co-authored-by: kkytola <“[email protected]”> Co-authored-by: Yury G. Kudryashov <[email protected]> Co-authored-by: kkytola <[email protected]>
1 parent e7cd1c4 commit 2056a1c

File tree

2 files changed

+225
-0
lines changed

2 files changed

+225
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2793,6 +2793,7 @@ import Mathlib.MeasureTheory.Measure.Lebesgue.Complex
27932793
import Mathlib.MeasureTheory.Measure.Lebesgue.EqHaar
27942794
import Mathlib.MeasureTheory.Measure.Lebesgue.Integral
27952795
import Mathlib.MeasureTheory.Measure.Lebesgue.VolumeOfBalls
2796+
import Mathlib.MeasureTheory.Measure.LevyProkhorovMetric
27962797
import Mathlib.MeasureTheory.Measure.LogLikelihoodRatio
27972798
import Mathlib.MeasureTheory.Measure.MeasureSpace
27982799
import Mathlib.MeasureTheory.Measure.MeasureSpaceDef
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
/-
2+
Copyright (c) 2023 Kalle Kytölä. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Kalle Kytölä
5+
-/
6+
import Mathlib.MeasureTheory.Measure.ProbabilityMeasure
7+
8+
/-!
9+
# The Lévy-Prokhorov distance on spaces of finite measures and probability measures
10+
11+
## Main definitions
12+
13+
* `MeasureTheory.levyProkhorovEDist`: The Lévy-Prokhorov edistance between two measures.
14+
* `MeasureTheory.levyProkhorovDist`: The Lévy-Prokhorov distance between two finite measures.
15+
16+
## Main results
17+
18+
* `levyProkhorovDist_pseudoMetricSpace_finiteMeasure`: The Lévy-Prokhorov distance is a
19+
pseudoemetric on the space of finite measures.
20+
* `levyProkhorovDist_pseudoMetricSpace_probabilityMeasure`: The Lévy-Prokhorov distance is a
21+
pseudoemetric on the space of probability measures.
22+
23+
## Todo
24+
25+
* Show that in Borel spaces, the Lévy-Prokhorov distance is a metric; not just a pseudometric.
26+
* Prove that if `X` is metrizable and separable, then the Lévy-Prokhorov distance metrizes the
27+
topology of weak convergence.
28+
29+
## Tags
30+
31+
finite measure, probability measure, weak convergence, convergence in distribution, metrizability
32+
-/
33+
34+
open Topology Metric Filter Set ENNReal NNReal
35+
36+
namespace MeasureTheory
37+
38+
open scoped Topology ENNReal NNReal BoundedContinuousFunction
39+
40+
section Levy_Prokhorov
41+
42+
/-! ### Lévy-Prokhorov metric -/
43+
44+
variable {ι : Type*} {Ω : Type*} [MeasurableSpace Ω] [MetricSpace Ω]
45+
46+
/-- The Lévy-Prokhorov edistance between measures:
47+
`d(μ,ν) = inf {r ≥ 0 | ∀ B, μ B ≤ ν Bᵣ + r ∧ ν B ≤ μ Bᵣ + r}`. -/
48+
noncomputable def levyProkhorovEDist (μ ν : Measure Ω) : ℝ≥0∞ :=
49+
sInf {ε | ∀ B, MeasurableSet B →
50+
μ B ≤ ν (thickening ε.toReal B) + ε ∧ ν B ≤ μ (thickening ε.toReal B) + ε}
51+
52+
/- This result is not placed in earlier more generic files, since it is rather specialized;
53+
it mixes measure and metric in a very particular way. -/
54+
lemma meas_le_of_le_of_forall_le_meas_thickening_add {ε₁ ε₂ : ℝ≥0∞} (μ ν : Measure Ω)
55+
(h_le : ε₁ ≤ ε₂) {B : Set Ω} (hε₁ : μ B ≤ ν (thickening ε₁.toReal B) + ε₁) :
56+
μ B ≤ ν (thickening ε₂.toReal B) + ε₂ := by
57+
by_cases ε_top : ε₂ = ∞
58+
· simp only [ne_eq, FiniteMeasure.ennreal_coeFn_eq_coeFn_toMeasure, ε_top, top_toReal,
59+
add_top, le_top]
60+
apply hε₁.trans (add_le_add ?_ h_le)
61+
exact measure_mono (μ := ν) (thickening_mono (toReal_mono ε_top h_le) B)
62+
63+
lemma left_measure_le_of_levyProkhorovEDist_lt {μ ν : Measure Ω} {c : ℝ≥0∞}
64+
(h : levyProkhorovEDist μ ν < c) {B : Set Ω} (B_mble : MeasurableSet B) :
65+
μ B ≤ ν (thickening c.toReal B) + c := by
66+
obtain ⟨c', ⟨hc', lt_c⟩⟩ := sInf_lt_iff.mp h
67+
exact meas_le_of_le_of_forall_le_meas_thickening_add μ ν lt_c.le (hc' B B_mble).1
68+
69+
lemma right_measure_le_of_levyProkhorovEDist_lt {μ ν : Measure Ω} {c : ℝ≥0∞}
70+
(h : levyProkhorovEDist μ ν < c) {B : Set Ω} (B_mble : MeasurableSet B) :
71+
ν B ≤ μ (thickening c.toReal B) + c := by
72+
obtain ⟨c', ⟨hc', lt_c⟩⟩ := sInf_lt_iff.mp h
73+
exact meas_le_of_le_of_forall_le_meas_thickening_add ν μ lt_c.le (hc' B B_mble).2
74+
75+
lemma levyProkhorovEDist_le_of_forall_add_pos_le (μ ν : Measure Ω) (δ : ℝ≥0∞)
76+
(h : ∀ ε B, 0 < ε → ε < ∞ → MeasurableSet B →
77+
μ B ≤ ν (thickening (δ + ε).toReal B) + δ + ε ∧
78+
ν B ≤ μ (thickening (δ + ε).toReal B) + δ + ε) :
79+
levyProkhorovEDist μ ν ≤ δ := by
80+
apply ENNReal.le_of_forall_pos_le_add
81+
intro ε hε _
82+
by_cases ε_top : ε = ∞
83+
· simp only [ε_top, add_top, le_top]
84+
apply sInf_le
85+
intro B B_mble
86+
simpa only [add_assoc] using h ε B (coe_pos.mpr hε) coe_lt_top B_mble
87+
88+
lemma levyProkhorovEDist_le_of_forall (μ ν : Measure Ω) (δ : ℝ≥0∞)
89+
(h : ∀ ε B, δ < ε → ε < ∞ → MeasurableSet B →
90+
μ B ≤ ν (thickening ε.toReal B) + ε ∧ ν B ≤ μ (thickening ε.toReal B) + ε) :
91+
levyProkhorovEDist μ ν ≤ δ := by
92+
by_cases δ_top : δ = ∞
93+
· simp only [δ_top, add_top, le_top]
94+
apply levyProkhorovEDist_le_of_forall_add_pos_le
95+
intro x B x_pos x_lt_top B_mble
96+
simpa only [← add_assoc] using h (δ + x) B (ENNReal.lt_add_right δ_top x_pos.ne.symm)
97+
(by simp only [add_lt_top, Ne.lt_top δ_top, x_lt_top, and_self]) B_mble
98+
99+
lemma levyProkhorovEDist_le_max_measure_univ (μ ν : Measure Ω) :
100+
levyProkhorovEDist μ ν ≤ max (μ univ) (ν univ) := by
101+
refine sInf_le fun B _ ↦ ⟨?_, ?_⟩ <;> apply le_add_left <;> simp [measure_mono]
102+
103+
lemma levyProkhorovEDist_lt_top (μ ν : Measure Ω) [IsFiniteMeasure μ] [IsFiniteMeasure ν] :
104+
levyProkhorovEDist μ ν < ∞ :=
105+
(levyProkhorovEDist_le_max_measure_univ μ ν).trans_lt <| by simp [measure_lt_top]
106+
107+
lemma levyProkhorovEDist_self (μ : Measure Ω) :
108+
levyProkhorovEDist μ μ = 0 := by
109+
rw [← nonpos_iff_eq_zero, ← csInf_Ioo zero_lt_top]
110+
refine sInf_le_sInf fun ε ⟨hε₀, hε_top⟩ B _ ↦ and_self_iff.2 ?_
111+
refine le_add_right <| measure_mono <| self_subset_thickening ?_ _
112+
exact ENNReal.toReal_pos hε₀.ne' hε_top.ne
113+
114+
lemma levyProkhorovEDist_comm (μ ν : Measure Ω) :
115+
levyProkhorovEDist μ ν = levyProkhorovEDist ν μ := by
116+
simp only [levyProkhorovEDist, and_comm]
117+
118+
lemma levyProkhorovEDist_triangle [OpensMeasurableSpace Ω] (μ ν κ : Measure Ω) :
119+
levyProkhorovEDist μ κ ≤ levyProkhorovEDist μ ν + levyProkhorovEDist ν κ := by
120+
by_cases LPμν_finite : levyProkhorovEDist μ ν = ∞
121+
· simp [LPμν_finite]
122+
by_cases LPνκ_finite : levyProkhorovEDist ν κ = ∞
123+
· simp [LPνκ_finite]
124+
apply levyProkhorovEDist_le_of_forall_add_pos_le
125+
intro ε B ε_pos ε_lt_top B_mble
126+
have half_ε_pos : 0 < ε / 2 := ENNReal.div_pos ε_pos.ne' two_ne_top
127+
have half_ε_lt_top : ε / 2 < ∞ := ENNReal.div_lt_top ε_lt_top.ne two_ne_zero
128+
let r := levyProkhorovEDist μ ν + ε / 2
129+
let s := levyProkhorovEDist ν κ + ε / 2
130+
have lt_r : levyProkhorovEDist μ ν < r := lt_add_right LPμν_finite half_ε_pos.ne'
131+
have lt_s : levyProkhorovEDist ν κ < s := lt_add_right LPνκ_finite half_ε_pos.ne'
132+
have hs_add_r : s + r = levyProkhorovEDist μ ν + levyProkhorovEDist ν κ + ε := by
133+
simp_rw [add_assoc, add_comm (ε / 2), add_assoc, ENNReal.add_halves, ← add_assoc,
134+
add_comm (levyProkhorovEDist μ ν)]
135+
have hs_add_r' : s.toReal + r.toReal
136+
= (levyProkhorovEDist μ ν + levyProkhorovEDist ν κ + ε).toReal := by
137+
rw [← hs_add_r, ← ENNReal.toReal_add]
138+
· exact ENNReal.add_ne_top.mpr ⟨LPνκ_finite, half_ε_lt_top.ne⟩
139+
· exact ENNReal.add_ne_top.mpr ⟨LPμν_finite, half_ε_lt_top.ne⟩
140+
rw [← hs_add_r', add_assoc, ← hs_add_r, add_assoc _ _ ε, ← hs_add_r]
141+
refine ⟨?_, ?_⟩
142+
· calc μ B ≤ ν (thickening r.toReal B) + r :=
143+
left_measure_le_of_levyProkhorovEDist_lt lt_r B_mble
144+
_ ≤ κ (thickening s.toReal (thickening r.toReal B)) + s + r :=
145+
add_le_add_right
146+
(left_measure_le_of_levyProkhorovEDist_lt lt_s isOpen_thickening.measurableSet) _
147+
_ = κ (thickening s.toReal (thickening r.toReal B)) + (s + r) := add_assoc _ _ _
148+
_ ≤ κ (thickening (s.toReal + r.toReal) B) + (s + r) :=
149+
add_le_add_right (measure_mono (thickening_thickening_subset _ _ _)) _
150+
· calc κ B ≤ ν (thickening s.toReal B) + s :=
151+
right_measure_le_of_levyProkhorovEDist_lt lt_s B_mble
152+
_ ≤ μ (thickening r.toReal (thickening s.toReal B)) + r + s :=
153+
add_le_add_right
154+
(right_measure_le_of_levyProkhorovEDist_lt lt_r isOpen_thickening.measurableSet) s
155+
_ = μ (thickening r.toReal (thickening s.toReal B)) + (s + r) := by rw [add_assoc, add_comm r]
156+
_ ≤ μ (thickening (r.toReal + s.toReal) B) + (s + r) :=
157+
add_le_add_right (measure_mono (thickening_thickening_subset _ _ _)) _
158+
_ = μ (thickening (s.toReal + r.toReal) B) + (s + r) := by rw [add_comm r.toReal]
159+
160+
/-- The Lévy-Prokhorov distance between finite measures:
161+
`d(μ,ν) = inf {r ≥ 0 | ∀ B, μ B ≤ ν Bᵣ + r ∧ ν B ≤ μ Bᵣ + r}`. -/
162+
noncomputable def levyProkhorovDist (μ ν : Measure Ω) : ℝ :=
163+
(levyProkhorovEDist μ ν).toReal
164+
165+
lemma levyProkhorovDist_self (μ : Measure Ω) :
166+
levyProkhorovDist μ μ = 0 := by
167+
simp only [levyProkhorovDist, levyProkhorovEDist_self, zero_toReal]
168+
169+
lemma levyProkhorovDist_comm (μ ν : Measure Ω) :
170+
levyProkhorovDist μ ν = levyProkhorovDist ν μ := by
171+
simp only [levyProkhorovDist, levyProkhorovEDist_comm]
172+
173+
lemma levyProkhorovDist_triangle [OpensMeasurableSpace Ω] (μ ν κ : Measure Ω)
174+
[IsFiniteMeasure μ] [IsFiniteMeasure ν] [IsFiniteMeasure κ] :
175+
levyProkhorovDist μ κ ≤ levyProkhorovDist μ ν + levyProkhorovDist ν κ := by
176+
have dμκ_finite := (levyProkhorovEDist_lt_top μ κ).ne
177+
have dμν_finite := (levyProkhorovEDist_lt_top μ ν).ne
178+
have dνκ_finite := (levyProkhorovEDist_lt_top ν κ).ne
179+
convert (ENNReal.toReal_le_toReal (a := levyProkhorovEDist μ κ)
180+
(b := levyProkhorovEDist μ ν + levyProkhorovEDist ν κ)
181+
_ _).mpr <| levyProkhorovEDist_triangle μ ν κ
182+
· simp only [levyProkhorovDist, ENNReal.toReal_add dμν_finite dνκ_finite]
183+
· exact dμκ_finite
184+
· exact ENNReal.add_ne_top.mpr ⟨dμν_finite, dνκ_finite⟩
185+
186+
/-- A type synonym, to be used for `Measure α`, `FiniteMeasure α`, or `ProbabilityMeasure α`,
187+
when they are to be equipped with the Lévy-Prokhorov distance. -/
188+
def LevyProkhorov (α : Type*) := α
189+
190+
variable [OpensMeasurableSpace Ω]
191+
192+
/-- The Lévy-Prokhorov distance `levyProkhorovEDist` makes `Measure Ω` a pseudoemetric
193+
space. The instance is recorded on the type synonym `LevyProkhorov (Measure Ω) := Measure Ω`. -/
194+
noncomputable instance : PseudoEMetricSpace (LevyProkhorov (Measure Ω)) where
195+
edist := levyProkhorovEDist
196+
edist_self := levyProkhorovEDist_self
197+
edist_comm := levyProkhorovEDist_comm
198+
edist_triangle := levyProkhorovEDist_triangle
199+
200+
/-- The Lévy-Prokhorov distance `levyProkhorovDist` makes `FiniteMeasure Ω` a pseudometric
201+
space. The instance is recorded on the type synonym
202+
`LevyProkhorov (FiniteMeasure Ω) := FiniteMeasure Ω`. -/
203+
noncomputable instance levyProkhorovDist_pseudoMetricSpace_finiteMeasure :
204+
PseudoMetricSpace (LevyProkhorov (FiniteMeasure Ω)) where
205+
dist μ ν := levyProkhorovDist μ.toMeasure ν.toMeasure
206+
dist_self μ := levyProkhorovDist_self _
207+
dist_comm μ ν := levyProkhorovDist_comm _ _
208+
dist_triangle μ ν κ := levyProkhorovDist_triangle _ _ _
209+
edist_dist μ ν := by simp [← ENNReal.ofReal_coe_nnreal]
210+
211+
/-- The Lévy-Prokhorov distance `levyProkhorovDist` makes `ProbabilityMeasure Ω` a pseudoemetric
212+
space. The instance is recorded on the type synonym
213+
`LevyProkhorov (ProbabilityMeasure Ω) := ProbabilityMeasure Ω`. -/
214+
noncomputable instance levyProkhorovDist_pseudoMetricSpace_probabilityMeasure :
215+
PseudoMetricSpace (LevyProkhorov (ProbabilityMeasure Ω)) where
216+
dist μ ν := levyProkhorovDist μ.toMeasure ν.toMeasure
217+
dist_self μ := levyProkhorovDist_self _
218+
dist_comm μ ν := levyProkhorovDist_comm _ _
219+
dist_triangle μ ν κ := levyProkhorovDist_triangle _ _ _
220+
edist_dist μ ν := by simp [← ENNReal.ofReal_coe_nnreal]
221+
222+
end Levy_Prokhorov --section
223+
224+
end MeasureTheory -- namespace

0 commit comments

Comments
 (0)