@@ -10,20 +10,37 @@ public import Mathlib.Probability.ProbabilityMassFunction.Basic
1010
1111import 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
3552namespace 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
7395instance 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
81103section 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
91113variable [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
115137end Integral
116138
117139section 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" )]
121145noncomputable
0 commit comments