Documentation

Convex.Algorithm.LASSO

LASSO #

Main results #

This file mainly concentrates on the definition and the proof of the convergence rate of the Lasso problem using proximal gradient method.

theorem dot_mul_eq_transpose_mul_dot {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} (u : EuclideanSpace ℝ (Fin ↑m)) (v : EuclideanSpace ℝ (Fin ↑n)) :
Matrix.dotProduct u (A.mulVec v) = Matrix.dotProduct (A.transpose.mulVec u) v
theorem mulVec_sub {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} (u : Fin ↑n → ℝ) (v : Fin ↑n → ℝ) :
A.mulVec u - A.mulVec v = A.mulVec (u - v)
theorem real_inner_eq_dot {m : ℕ+} (x : EuclideanSpace ℝ (Fin ↑m)) (y : EuclideanSpace ℝ (Fin ↑m)) :
⟪x, y⟫_ℝ = Matrix.dotProduct x y
theorem quadratic_gradient {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} (x : EuclideanSpace ℝ (Fin ↑n)) :
HasGradientAt (fun (x : EuclideanSpace ℝ (Fin ↑n)) => Matrix.dotProduct (A.mulVec x) (A.mulVec x)) (2 • A.transpose.mulVec (A.mulVec x)) x
theorem affine_sq_gradient {n : ℕ+} {m : ℕ+} {b : Fin ↑m → ℝ} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} (x : EuclideanSpace ℝ (Fin ↑n)) :
HasGradientAt (fun (x : EuclideanSpace ℝ (Fin ↑n)) => 1 / 2 * ‖A.mulVec x - b‖ ^ 2) (A.transpose.mulVec (A.mulVec x - b)) x
theorem affine_sq_convex {n : ℕ+} {m : ℕ+} {b : Fin ↑m → ℝ} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} :
ConvexOn ℝ Set.univ fun (x : EuclideanSpace ℝ (Fin ↑n)) => 1 / 2 * ‖A.mulVec x - b‖ ^ 2
theorem norm_one_convex {n : ℕ+} :
ConvexOn ℝ Set.univ fun (x : EuclideanSpace ℝ (Fin ↑n)) => ∑ i : Fin ↑n, ‖x i‖
theorem real_sign_mul_abs (x : ℝ) :
x.sign * |x| = x
theorem norm_one_proximal {n : ℕ+} {t : ℝ} {μ : ℝ} {h : EuclideanSpace ℝ (Fin ↑n) → ℝ} (lasso : h = fun (y : EuclideanSpace ℝ (Fin ↑n)) => μ • ∑ i : Fin ↑n, ‖y i‖) (x : EuclideanSpace ℝ (Fin ↑n)) (xm : EuclideanSpace ℝ (Fin ↑n)) (tpos : 0 < t) (μpos : 0 < μ) (minpoint : ∀ (i : Fin ↑n), xm i = Real.sign (x i) * max (|x i| - t * μ) 0) :
prox_prop (t • h) x xm
theorem Transpose_mul_self_eq_zero {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} :
A.transpose * A = 0 ↔ A = 0
class LASSO {n : ℕ+} {m : ℕ+} (A : Matrix (Fin ↑m) (Fin ↑n) ℝ) (b : Fin ↑m → ℝ) (μ : ℝ) (μpos : 0 < μ) (Ane0 : A ≠ 0) (x₀ : EuclideanSpace ℝ (Fin ↑n)) :
Instances
    theorem LASSO.feq {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} [self : LASSO A b μ μpos Ane0 x₀] :
    LASSO.f b μpos Ane0 x₀ = fun (x : EuclideanSpace ℝ (Fin ↑n)) => 1 / 2 * ‖A.mulVec x - b‖ ^ 2
    theorem LASSO.f'eq {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} [self : LASSO A b μ μpos Ane0 x₀] :
    LASSO.f' b μpos Ane0 x₀ = fun (x : EuclideanSpace ℝ (Fin ↑n)) => A.transpose.mulVec (A.mulVec x - b)
    theorem LASSO.heq {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} [self : LASSO A b μ μpos Ane0 x₀] :
    LASSO.h b μpos Ane0 x₀ = fun (y : EuclideanSpace ℝ (Fin ↑n)) => μ • ∑ i : Fin ↑n, ‖y i‖
    theorem LASSO.teq {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} [self : LASSO A b μ μpos Ane0 x₀] :
    LASSO.t b μpos Ane0 x₀ = 1 / ↑(LASSO.L b μpos Ane0 x₀)
    theorem LASSO.Leq {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} [self : LASSO A b μ μpos Ane0 x₀] :
    LASSO.L b μpos Ane0 x₀ = ‖(Matrix.toEuclideanLin ≪≫ₗ LinearMap.toContinuousLinearMap) (A.transpose * A)‖₊
    theorem LASSO.minphi {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} [self : LASSO A b μ μpos Ane0 x₀] :
    IsMinOn (LASSO.f b μpos Ane0 x₀ + LASSO.h b μpos Ane0 x₀) Set.univ (LASSO.xm b μpos Ane0 x₀)
    theorem LASSO.ori {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} [self : LASSO A b μ μpos Ane0 x₀] :
    LASSO.x b μpos Ane0 x₀ 0 = x₀
    theorem LASSO.update1 {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} [self : LASSO A b μ μpos Ane0 x₀] (k : ℕ) :
    LASSO.y b μpos Ane0 x₀ k = LASSO.x b μpos Ane0 x₀ k - LASSO.t b μpos Ane0 x₀ • LASSO.f' b μpos Ane0 x₀ (LASSO.x b μpos Ane0 x₀ k)
    theorem LASSO.update2 {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} [self : LASSO A b μ μpos Ane0 x₀] (k : ℕ) :
    LASSO.x b μpos Ane0 x₀ (k + 1) = fun (i : Fin ↑n) => Real.sign (LASSO.y b μpos Ane0 x₀ k i) * max (|LASSO.y b μpos Ane0 x₀ k i| - LASSO.t b μpos Ane0 x₀ * μ) 0
    instance instProximal_gradient_methodEuclideanSpaceRealFinValFHF' {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} [p : LASSO A b μ μpos Ane0 x₀] :
    proximal_gradient_method (LASSO.f b μpos Ane0 x₀) (LASSO.h b μpos Ane0 x₀) (LASSO.f' b μpos Ane0 x₀) x₀
    Equations
    • One or more equations did not get rendered due to their size.
    theorem LASSO_converge {n : ℕ+} {m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} {b : Fin ↑m → ℝ} {μ : ℝ} {μpos : 0 < μ} {Ane0 : A ≠ 0} {x₀ : EuclideanSpace ℝ (Fin ↑n)} {alg : LASSO A b μ μpos Ane0 x₀} (k : ℕ+) :
    LASSO.f b μpos Ane0 x₀ (LASSO.x b μpos Ane0 x₀ ↑k) + LASSO.h b μpos Ane0 x₀ (LASSO.x b μpos Ane0 x₀ ↑k) - LASSO.f b μpos Ane0 x₀ (LASSO.xm b μpos Ane0 x₀) - LASSO.h b μpos Ane0 x₀ (LASSO.xm b μpos Ane0 x₀) ≤ ↑(LASSO.L b μpos Ane0 x₀) / (2 * ↑↑k) * ‖x₀ - LASSO.xm b μpos Ane0 x₀‖ ^ 2