1.6. ForMathlib.MeasureTheory.Order.MeasurableArg
Argmax and argmin functions on finite sets
We prove in particular that those functions are measurable.
Module LeanMachineLearning.ForMathlib.MeasureTheory.Order.MeasurableArg contains 17 exposed declarations.
max🔗
Function.maxThe maximum value of a tuple.
Function.max.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : αFunction.max.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : α
Code
abbrev max : α := univ.sup' univ_nonempty f
Used by (8)
Actions: Source · Open Issue
min🔗
Function.minThe minimum value of a tuple.
Function.min.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : αFunction.min.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : α
Code
def min : {ι : Type u_1} → {α : Type u_2} → [LinearOrder α] → [Fintype ι] → [Nonempty ι] → (ι → α) → αUsed by (8)
Actions: Source · Open Issue
le_max🔗
Function.le_maxNo docstring.
Function.le_max.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) (x : ι) : f x ≤ max fFunction.le_max.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) (x : ι) : f x ≤ max f
Code
lemma le_max (x : ι) : f x ≤ max f
Type uses (1)
Used by (1)
Actions: Source · Open Issue
Proof
le_sup' _ (by simp)
min_le🔗
Function.min_leNo docstring.
Function.min_le.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) (x : ι) : min f ≤ f xFunction.min_le.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) (x : ι) : min f ≤ f x
Code
theorem min_le : ∀ {ι : Type u_1} {α : Type u_2} [inst : LinearOrder α] [inst_1 : Fintype ι] [inst_2 : Nonempty ι] (f : ι → α) (x : ι),
Function.min f ≤ f xType uses (1)
Used by (1)
Actions: Source · Open Issue
Proof
@[to_dual min_le]
exists_argmax🔗
exists_argmaxNo docstring.
exists_argmax.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : ∃ i, f i = Function.max fexists_argmax.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : ∃ i, f i = Function.max f
Code
lemma exists_argmax : ∃ i, f i = f.max
Type uses (1)
Used by (3)
Actions: Source · Open Issue
Proof
by obtain ⟨i, -, hi⟩ := Finset.exists_mem_eq_sup' (by simp : Finset.univ.Nonempty) f exact ⟨i, hi.symm⟩
exists_argmin🔗
exists_argminNo docstring.
exists_argmin.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : ∃ i, f i = Function.min fexists_argmin.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : ∃ i, f i = Function.min f
Code
theorem exists_argmin : ∀ {ι : Type u_1} {α : Type u_2} [inst : LinearOrder α] [inst_1 : Fintype ι] [inst_2 : Nonempty ι] (f : ι → α),
∃ i, f i = Function.min fType uses (1)
Used by (3)
Actions: Source · Open Issue
Proof
@[to_dual exists_argmin]
argmax🔗
argmaxThe index of the maximum value of a tuple.
argmax.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : ιargmax.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : ι
Code
noncomputable def argmax := (exists_argmax f).choose
Body uses (2)
Used by (17)
Actions: Source · Open Issue
argmin🔗
argminThe index of the minimum value of a tuple.
argmin.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : ιargmin.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : ι
Code
def argmin : {ι : Type u_1} → {α : Type u_2} → [LinearOrder α] → [Fintype ι] → [Nonempty ι] → (ι → α) → ιBody uses (2)
Used by (3)
Actions: Source · Open Issue
argmax_spec🔗
argmax_specNo docstring.
argmax_spec.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : f (argmax f) = Function.max fargmax_spec.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : f (argmax f) = Function.max f
Code
lemma argmax_spec : f (argmax f) = f.max
Body uses (1)
Used by (1)
Actions: Source · Open Issue
Proof
(exists_argmax f).choose_spec
argmin_spec🔗
argmin_specNo docstring.
argmin_spec.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : f (argmin f) = Function.min fargmin_spec.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) : f (argmin f) = Function.min f
Code
theorem argmin_spec : ∀ {ι : Type u_1} {α : Type u_2} [inst : LinearOrder α] [inst_1 : Fintype ι] [inst_2 : Nonempty ι] (f : ι → α),
f (argmin f) = Function.min fBody uses (1)
Used by (1)
Actions: Source · Open Issue
Proof
@[to_dual argmin_spec]
isMaxOn_argmax🔗
isMaxOn_argmaxNo docstring.
isMaxOn_argmax.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) (x : ι) : f x ≤ f (argmax f)isMaxOn_argmax.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) (x : ι) : f x ≤ f (argmax f)
Code
lemma isMaxOn_argmax (x : ι) : f x ≤ f (argmax f)
Type uses (1)
Body uses (3)
Used by (4)
Actions: Source · Open Issue
Proof
by rw [argmax_spec f] exact f.le_max x
isMinOn_argmin🔗
isMinOn_argminNo docstring.
isMinOn_argmin.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) (x : ι) : f (argmin f) ≤ f xisMinOn_argmin.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) (x : ι) : f (argmin f) ≤ f x
Code
theorem isMinOn_argmin : ∀ {ι : Type u_1} {α : Type u_2} [inst : LinearOrder α] [inst_1 : Fintype ι] [inst_2 : Nonempty ι] (f : ι → α) (x : ι),
f (argmin f) ≤ f xType uses (1)
Body uses (3)
Actions: Source · Open Issue
Proof
@[to_dual isMinOn_argmin]
measurable_max🔗
measurable_maxNo docstring.
measurable_max.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] [MeasurableSpace α] [MeasurableSup₂ α] : Measurable fun t => Function.max tmeasurable_max.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] [MeasurableSpace α] [MeasurableSup₂ α] : Measurable fun t => Function.max t
Code
lemma measurable_max [MeasurableSup₂ α] : Measurable (fun (t : ι → α) => t.max)
Type uses (1)
Used by (1)
Actions: Source · Open Issue
Proof
fun_prop)]
lemma measurable_max [MeasurableSup₂ α] : Measurable (fun (t : ι → α) => t.max) := by
suffices (fun f : ι → α ↦ f.max) = (univ.sup' univ_nonempty fun i f => f i) by
rw [this]
exact measurable_sup' univ_nonempty (fun i _ => measurable_pi_apply i)
ext
simp [Function.max]
measurable_min🔗
measurable_minNo docstring.
measurable_min.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] [MeasurableSpace α] [MeasurableInf₂ α] : Measurable fun t => Function.min tmeasurable_min.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] [MeasurableSpace α] [MeasurableInf₂ α] : Measurable fun t => Function.min t
Code
theorem measurable_min : ∀ {ι : Type u_1} {α : Type u_2} [inst : LinearOrder α] [inst_1 : Fintype ι] [inst_2 : Nonempty ι]
[inst_3 : MeasurableSpace α] [MeasurableInf₂ α], Measurable fun t => Function.min tType uses (1)
Body uses (1)
Used by (1)
Actions: Source · Open Issue
Proof
fun_prop)]
measurable_argmax🔗
measurable_argmaxNo docstring.
measurable_argmax.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] [MeasurableSpace α] [MeasurableSpace ι] [MeasurableEq α] [MeasurableSup₂ α] : Measurable fun f => argmax fmeasurable_argmax.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] [MeasurableSpace α] [MeasurableSpace ι] [MeasurableEq α] [MeasurableSup₂ α] : Measurable fun f => argmax f
Code
lemma measurable_argmax [MeasurableSpace ι] [MeasurableEq α] [MeasurableSup₂ α] :
Measurable fun f : ι → α ↦ argmax fType uses (1)
Body uses (3)
Actions: Source · Open Issue
Proof
fun_prop) measurable_argmin]
lemma measurable_argmax [MeasurableSpace ι] [MeasurableEq α] [MeasurableSup₂ α] :
Measurable fun f : ι → α ↦ argmax f := by
refine measurable_to_countable' fun i ↦ ?_
simp only [Set.preimage, Set.mem_singleton_iff]
let Maximizers (f : ι → α) : Set ι := {i | f i = f.max}
suffices {f : ι → α | argmax f = i} = ⋃ (S)
(hS : ∀ x, Maximizers x = S → argmax x = i), {f | Maximizers f = S} by
rw [this]
refine MeasurableSet.iUnion fun S ↦ (.iUnion fun hS ↦ ?_)
exact measurableSet_eq_fun (by fun_prop) measurable_const
ext f
simp only [Set.mem_setOf_eq, Set.mem_iUnion, exists_prop, exists_eq_right']
constructor
· intro hf x hx
rw [← hf]
exact Classical.choose.congr_simp hx (exists_argmax x)
· intro h
exact h f rfl
measurable_argmin🔗
measurable_argminNo docstring.
measurable_argmin.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] [MeasurableSpace α] [MeasurableSpace ι] [MeasurableEq α] [MeasurableInf₂ α] : Measurable fun f => argmin fmeasurable_argmin.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] [MeasurableSpace α] [MeasurableSpace ι] [MeasurableEq α] [MeasurableInf₂ α] : Measurable fun f => argmin f
Code
theorem measurable_argmin : ∀ {ι : Type u_1} {α : Type u_2} [inst : LinearOrder α] [inst_1 : Fintype ι] [inst_2 : Nonempty ι]
[inst_3 : MeasurableSpace α] [inst_4 : MeasurableSpace ι] [MeasurableEq α] [MeasurableInf₂ α],
Measurable fun f => argmin fType uses (1)
Body uses (3)
Actions: Source · Open Issue
Proof
fun_prop) measurable_argmin]
neg_max_eq_min_neg🔗
neg_max_eq_min_negNo docstring.
neg_max_eq_min_neg.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) [AddGroup α] [AddLeftMono α] [AddRightMono α] : -Function.max f = Function.min (-f)neg_max_eq_min_neg.{u_1, u_2} {ι : Type u_1} {α : Type u_2} [LinearOrder α] [Fintype ι] [Nonempty ι] (f : ι → α) [AddGroup α] [AddLeftMono α] [AddRightMono α] : -Function.max f = Function.min (-f)
Code
lemma neg_max_eq_min_neg [AddGroup α] [AddLeftMono α] [AddRightMono α] : -f.max = (-f).min
Body uses (2)
Actions: Source · Open Issue
Proof
by
refine le_antisymm ?_ ?_
· simp; grind
· simp only [inf'_le_iff, mem_univ, Pi.neg_apply, neg_le_neg_iff, sup'_le_iff, forall_const,
true_and]
exact ⟨argmax f, isMaxOn_argmax f⟩