1 #ifndef SUBGRADIENT_DESCENT_H 2 #define SUBGRADIENT_DESCENT_H 9 #include <eigen3/Eigen/Dense> 10 #include <eigen3/Eigen/Core> 18 #include "../../Generic/generics.hpp" 19 #include "../../Generic/debug.hpp" 20 #include "../solver.hpp" 21 #include "../screeningsolver.hpp" 33 template <
typename T,
typename Base =
internal::Solver<T> >
48 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
49 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
50 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta );
53 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
54 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
55 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
56 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_prime,
59 Eigen::Matrix< T, Eigen::Dynamic, 1 > update_beta_ista (
60 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
61 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
62 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
70 template <
typename T,
typename Base >
72 static_assert(std::is_floating_point< T >::value,\
73 "Subgradient descent methods can only be used with floating point types.");
76 template <
typename T,
typename Base >
79 template <
typename T,
typename Base >
81 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
82 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
83 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta ) {
85 return (X*Beta - Y).squaredNorm();
89 template <
typename T,
typename Base >
91 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
92 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
93 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
94 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_prime,
97 Eigen::Matrix< T, Eigen::Dynamic, 1 > f_beta = X*Beta_prime - Y;
98 T taylor_term_0 = f_beta.squaredNorm();
100 Eigen::Matrix< T, Eigen::Dynamic, 1 > f_grad = 2.0*X.transpose()*( f_beta );
101 Eigen::Matrix< T, Eigen::Dynamic, 1 > beta_diff = ( Beta - Beta_prime );
103 T taylor_term_1 = f_grad.transpose()*beta_diff;
105 T taylor_term_2 = L/2.0*beta_diff.squaredNorm();
107 return taylor_term_0 + taylor_term_1 + taylor_term_2;
110 template <
typename T,
typename Base >
112 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
113 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
114 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
118 Eigen::Matrix< T, Eigen::Dynamic, 1 > f_grad = 2.0*( X.transpose()*( X*Beta - Y ) );
119 Eigen::Matrix< T, Eigen::Dynamic, 1 > beta_to_modify = Beta - (1.0/L)*f_grad;
121 return beta_to_modify.unaryExpr(
SoftThres<T>( thres/L ) );
129 #endif // SUBGRADIENT_DESCENT_H
Abstract base class for Sub-Gradient Descent algorithms ,such as ISTA and FISTA, with backtracking li...
Soft Threshold functor used to apply hdim::soft_threshold to each element in a matrix or vector...