Skip to content

Commit 72359c0

Browse files
committed
use Semiring + unitInterval
1 parent 4d34db3 commit 72359c0

File tree

2 files changed

+92
-59
lines changed

2 files changed

+92
-59
lines changed

Mathlib/MeasureTheory/Measure/Dirac.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,15 @@ lemma sum_smul_dirac_singleton [MeasurableSingletonClass α] {f : α → ℝ≥0
141141
sum (fun b : α ↦ f b • dirac b) {a} = f a := by
142142
simp +contextual [tsum_eq_single a]
143143

144+
/-- The sum of scaled Dirac measures applied to a singleton is the coefficient of that singleton. -/
145+
lemma sum_smul_dirac_singleton' [MeasurableSingletonClass α] {f : δ → ℝ≥0∞}
146+
{x : δ → α} (hx : Injective x) {d : δ} :
147+
sum (fun d ↦ f d • dirac (x d)) {x d} = f d := by
148+
simp only [MeasurableSet.singleton, sum_apply, smul_apply, dirac_apply', smul_eq_mul]
149+
rw [tsum_eq_single d]
150+
· simp
151+
· simp; grind
152+
144153
/-- A measure on a countable type is a sum of Dirac measures.
145154
If `α` has measurable singletons, `sum_smul_dirac` gives a simpler sum. -/
146155
lemma exists_sum_smul_dirac [Countable α] (μ : Measure α) :

Mathlib/Probability/Distributions/Geometric.lean

Lines changed: 83 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,37 @@ public import Mathlib.Probability.ProbabilityMassFunction.Basic
1010

1111
import Mathlib.MeasureTheory.Integral.Bochner.SumMeasure
1212

13-
/-! # Geometric distributions over ℕ
13+
/-! # Geometric distributions
1414
15-
Define the geometric measure over the natural numbers. For `0 < p ≤ 1`, `geometricMeasure p` is the
16-
measure which to `{n}` associates `(1 - p) ^ n * n`.
15+
We define the geometric measure over an arbitrary semiring. For `0 < p ≤ 1`, `geometricMeasure ℕ p`
16+
is the measure over natural numbers which to `{n}` associates `(1 - p) ^ n * n`. To be allowed
17+
to apply this definition for other domains such as `ℝ`, `ℕ∞` or `ℝ≥0∞`, we define
18+
`geometricMeasure R p` for any semiring `R` as the measure over `R` which
19+
gives mass `(1 - p) ^ n * n` to `Nat.cast n`.
20+
21+
As the parameter `p` needs to lie between `0` and `1`, we define `geometricMeasure R p` with
22+
`p : unitInterval`.
23+
24+
Imagine a certain experience which has success probability `p`. If you repeat this experience
25+
infintely many times and independently, the number of failures before the first success
26+
follows a geometric distribution with parameter `p`.
27+
28+
While the geometric measure with parameter `p := 0` is not really meaningful over `ℕ` or `ℝ`,
29+
it makes sense to define it as `Measure.dirac ⊤` over `ℕ∞` or `ℝ≥0∞`, since if the experience
30+
always failq we need infinitely many failures before succeeding.
31+
Therefore we require `SupSet R` in the definition
32+
so as to define `geometric R p := Measure.dirac (sSup univ)`
33+
34+
TODO: define a `SupSet` instance for `ℕ∞`.
1735
1836
## Main definition
1937
20-
* `geometricMeasure p`: a geometric measure on `ℕ`, parametrized by its success probability `p`.
38+
* `geometricMeasure R p`: a geometric measure on a semiring `R`,
39+
parametrized by its success probability `p`.
2140
22-
## Implementation note
41+
## Tags
2342
24-
In order to automatically infer `IsProbabilityMeasure (geometricMeasure p)`, we define
25-
`geometricMeasure p` for a general `p : ℝ` and set it to `Measure.dirac 0` if `p ≤ 0` or `1 < p`.
26-
Use `geometricMeasure_eq` to rewrite the measure as a sum of Dirac masses.
43+
geometric distribution
2744
-/
2845

2946
@[expose] public section
@@ -34,88 +51,95 @@ open MeasureTheory Real Set Filter Topology
3451

3552
namespace ProbabilityTheory
3653

37-
variable {p : }
54+
variable {R : Type*} [Semiring R] [SupSet R] {mR : MeasurableSpace R} {p : unitInterval}
3855

3956
/-- The geometric measure with success probability `p` as a measure over `ℕ`. -/
40-
noncomputable def geometricMeasure (p : ℝ) : Measure ℕ := if 0 < p ∧ p ≤ 1
57+
noncomputable def geometricMeasure (R : Type*) [Semiring R] [SupSet R] [MeasurableSpace R]
58+
(p : unitInterval) : Measure R := if p ≠ 0
4159
then
42-
Measure.sum (fun n ↦ ENNReal.ofReal ((1 - p) ^ n * p) • .dirac n)
60+
Measure.sum (fun (n : ℕ) ↦ ENNReal.ofReal ((1 - p) ^ n * p) • .dirac n)
4361
else
44-
.dirac 0
62+
.dirac (sSup univ)
4563

46-
lemma geometricMeasure_eq (h1 : 0 < p) (h2 : p ≤ 1) :
47-
geometricMeasure p = Measure.sum (fun n ↦ ENNReal.ofReal ((1 - p) ^ n * p) • .dirac n) :=
48-
if_pos ⟨h1, h2⟩
64+
lemma geometricMeasure_eq (hp : p ≠ 0) :
65+
geometricMeasure R p =
66+
Measure.sum (fun (n : ℕ) ↦ ENNReal.ofReal ((1 - p) ^ n * p) • .dirac (n : R)) :=
67+
if_pos hp
4968

5069
/-- The `positivty` tactic does not work for this goal. Use this lemma to rewrite
51-
`(ENNReal.ofReal ((1 - p) ^ n * p)).toReal = (1 - p) ^ n * p)`. -/
52-
lemma geometricMeasure_nonneg (h1 : 0 < p) (h2 : p ≤ 1) (n : ℕ) :
53-
0 ≤ (1 - p) ^ n * p := by positivity [pow_nonneg (a := 1 - p) (by linarith) n]
54-
55-
lemma geometricMeasure_pos (h1 : 0 < p) (h2 : p < 1) (n : ℕ) :
56-
0 < (1 - p) ^ n * p := by positivity [pow_pos (a := 1 - p) (by linarith) n]
57-
58-
lemma geometricMeasure_real_singleton (h1 : 0 < p) (h2 : p ≤ 1) (n : ℕ) :
59-
(geometricMeasure p).real {n} = (1 - p) ^ n * p := by
60-
rw [geometricMeasure, if_pos ⟨h1, h2⟩, measureReal_def, Measure.sum_smul_dirac_singleton,
61-
ENNReal.toReal_ofReal (geometricMeasure_nonneg h1 h2 n)]
62-
63-
lemma geometricMeasure_real_singleton_pos (n : ℕ) (h1 : 0 < p) (h2 : p < 1) :
64-
0 < (geometricMeasure p).real {n} := by
65-
rw [geometricMeasure_real_singleton h1 h2.le]
70+
`(ENNReal.ofReal ((1 - p) ^ n * p)).toReal = (1 - p) ^ n * p`. -/
71+
lemma geometricMeasure_nonneg (p : unitInterval) (n : ℕ) :
72+
0 ≤ (1 - p : ℝ) ^ n * p := mul_nonneg (pow_nonneg (by grind) n) p.2.1
73+
74+
lemma geometricMeasure_pos (h1 : p ≠ 0) (h2 : p ≠ 1) (n : ℕ) :
75+
0 < (1 - p : ℝ) ^ n * p := mul_pos (pow_pos (by grind) n) (by grind)
76+
77+
lemma geometricMeasure_real_singleton [MeasurableSingletonClass R] [CharZero R]
78+
(hp : p ≠ 0) (n : ℕ) :
79+
(geometricMeasure R p).real {(n : R)} = (1 - p) ^ n * p := by
80+
rw [geometricMeasure_eq hp, measureReal_def,
81+
Measure.sum_smul_dirac_singleton' (Nat.cast_injective),
82+
ENNReal.toReal_ofReal (geometricMeasure_nonneg p n)]
83+
84+
lemma geometricMeasure_real_singleton_pos [MeasurableSingletonClass R] [CharZero R]
85+
(h1 : p ≠ 0) (h2 : p ≠ 1) (n : ℕ) :
86+
0 < (geometricMeasure R p).real {(n : R)} := by
87+
rw [geometricMeasure_real_singleton h1]
6688
exact geometricMeasure_pos h1 h2 n
6789

68-
lemma hasSum_one_geometricMeasure (h1 : 0 < p) (h2 : p ≤ 1) :
69-
HasSum (fun n ↦ (1 - p) ^ n * p) 1 := by
70-
convert (hasSum_geometric_of_lt_one (r := 1 - p) (by linarith) (by linarith)).mul_right p
71-
simp [field]
90+
lemma hasSum_one_geometricMeasure (hp : p ≠ 0) :
91+
HasSum (fun n ↦ (1 - p : ℝ) ^ n * p) 1 := by
92+
convert (hasSum_geometric_of_lt_one (r := 1 - p) (by grind) (by grind)).mul_right (p : ℝ)
93+
grind
7294

7395
instance isProbabilityMeasure_geometricMeasure :
74-
IsProbabilityMeasure (geometricMeasure p) := by
96+
IsProbabilityMeasure (geometricMeasure R p) := by
7597
rw [geometricMeasure]
7698
split_ifs with h
77-
· exact (hasSum_one_geometricMeasure h.1 h.2).isProbabilityMeasure_sum_dirac
78-
(geometricMeasure_nonneg h.1 h.2)
99+
· exact (hasSum_one_geometricMeasure h).isProbabilityMeasure_sum_dirac
100+
(geometricMeasure_nonneg p)
79101
· infer_instance
80102

81103
section Integral
82104

83-
variable {E : Type*} [NormedAddCommGroup E]
105+
variable {E : Type*} [NormedAddCommGroup E] [MeasurableSingletonClass R]
84106

85-
lemma integrable_geometricMeasure_iff (h1 : 0 < p) (h2 : p ≤ 1) {f : → E} :
86-
Integrable f (geometricMeasure p) ↔ Summable (fun n ↦ (1 - p) ^ n * p * ‖f n‖) := by
87-
rw [geometricMeasure_eq h1 h2, integrable_sum_dirac_iff (by simp)]
107+
lemma integrable_geometricMeasure_iff (hp : p ≠ 0) {f : R → E} :
108+
Integrable f (geometricMeasure R p) ↔ Summable (fun (n : ℕ) ↦ (1 - p : ℝ) ^ n * p * ‖f n‖) := by
109+
rw [geometricMeasure_eq hp, integrable_sum_dirac_iff (by simp)]
88110
congrm Summable (fun n ↦ ?_ * _)
89-
rw [ENNReal.toReal_ofReal (geometricMeasure_nonneg h1 h2 n)]
111+
rw [ENNReal.toReal_ofReal (geometricMeasure_nonneg p n)]
90112

91113
variable [NormedSpace ℝ E]
92114

93-
lemma hasSum_integral_geometricMeasure [CompleteSpace E] {f : → E}
94-
(h1 : 0 < p) (h2 : p ≤ 1) (hf : Integrable f (geometricMeasure p)) :
95-
HasSum (fun n ↦ ((1 - p) ^ n * p) • f n) (∫ n, f n ∂geometricMeasure p) := by
96-
have : (fun n ↦ ((1 - p) ^ n * p) • f n) =
97-
fun n ↦ (ENNReal.ofReal ((1 - p) ^ n * p)).toReal • f n := by
98-
ext n; rw [ENNReal.toReal_ofReal (geometricMeasure_nonneg h1 h2 n)]
99-
rw [this, geometricMeasure_eq h1 h2]
115+
lemma hasSum_integral_geometricMeasure [CompleteSpace E] {f : R → E}
116+
(hp : p ≠ 0) (hf : Integrable f (geometricMeasure R p)) :
117+
HasSum (fun (n : ℕ) ↦ ((1 - p : ℝ) ^ n * p) • f n) (∫ n, f n ∂geometricMeasure R p) := by
118+
have : (fun (n : ℕ) ↦ ((1 - p : ℝ) ^ n * p) • f n) =
119+
fun (n : ℕ) ↦ (ENNReal.ofReal ((1 - p) ^ n * p)).toReal • f n := by
120+
ext n; rw [ENNReal.toReal_ofReal (geometricMeasure_nonneg p n)]
121+
rw [this, geometricMeasure_eq hp]
100122
apply hasSum_integral_sum_dirac (by simp)
101-
convert (integrable_geometricMeasure_iff h1 h2).1 hf with n
102-
rw [ENNReal.toReal_ofReal (geometricMeasure_nonneg h1 h2 n)]
123+
convert (integrable_geometricMeasure_iff hp).1 hf with n
124+
rw [ENNReal.toReal_ofReal (geometricMeasure_nonneg p n)]
103125

104-
lemma integral_geometricMeasure' [CompleteSpace E] {f : → E} (h1 : 0 < p) (h2 : p ≤ 1)
105-
(hf : Integrable f (geometricMeasure p)) :
106-
∫ n, f n ∂geometricMeasure p = ∑' n, ((1 - p) ^ n * p) • f n :=
107-
(hasSum_integral_geometricMeasure h1 h2 hf).tsum_eq.symm
126+
lemma integral_geometricMeasure' [CompleteSpace E] {f : R → E} (hp : p ≠ 0)
127+
(hf : Integrable f (geometricMeasure R p)) :
128+
∫ n, f n ∂geometricMeasure R p = ∑' n : ℕ, ((1 - p : ℝ) ^ n * p) • f n :=
129+
(hasSum_integral_geometricMeasure hp hf).tsum_eq.symm
108130

109-
lemma integral_geometricMeasure [FiniteDimensional ℝ E] (h1 : 0 < p) (h2 : p ≤ 1) (f : → E) :
110-
∫ n, f n ∂geometricMeasure p = ∑' n, ((1 - p) ^ n * p) • f n := by
111-
rw [geometricMeasure_eq h1 h2, integral_sum_dirac (by simp)]
131+
lemma integral_geometricMeasure [FiniteDimensional ℝ E] (hp : p ≠ 0) (f : R → E) :
132+
∫ n, f n ∂geometricMeasure R p = ∑' n : ℕ, ((1 - p : ℝ) ^ n * p) • f n := by
133+
rw [geometricMeasure_eq hp, integral_sum_dirac (by simp)]
112134
congr with n
113-
rw [ENNReal.toReal_ofReal (geometricMeasure_nonneg h1 h2 n)]
135+
rw [ENNReal.toReal_ofReal (geometricMeasure_nonneg p n)]
114136

115137
end Integral
116138

117139
section GeometricPMF
118140

141+
variable {p : ℝ}
142+
119143
/-- The pmf of the geometric distribution depending on its success probability. -/
120144
@[deprecated geometricMeasure (since := "2026-03-08")]
121145
noncomputable

0 commit comments

Comments
 (0)