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