17 #include "../../../Generic/generics.hpp" 18 #include "../../../Generic/debug.hpp" 19 #include "../subgradient_descent.hpp" 29 template <
typename T,
typename Base =
internal::Solver< T > >
39 Eigen::Matrix< T, Eigen::Dynamic, 1 > update_rule(
40 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
41 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
42 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
47 T L =
static_cast<T
>( 0 );
51 template <
typename T,
typename Base >
55 template <
typename T,
typename Base >
57 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
58 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
59 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
62 Eigen::Matrix< T, Eigen::Dynamic, 1 > Beta = Beta_0;
64 unsigned int counter = 0;
85 template <
typename T,
typename Base >
87 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
88 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
89 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
94 Eigen::Matrix< T, Eigen::Dynamic, 1 > f_grad = 2.0*( X.transpose()*( X*Beta - Y ) );
95 Eigen::Matrix< T, Eigen::Dynamic, 1 > Beta_temp = ( Beta - (1.0/L)*f_grad ).unaryExpr(
SoftThres<T>( lambda/L ) );
97 T f_beta = ( X*Beta_temp - Y ).squaredNorm();
99 Eigen::Matrix< T, Eigen::Dynamic, 1 > f_part = X*Beta - Y;
100 T taylor_term_0 = f_part.squaredNorm();
102 Eigen::Matrix< T, Eigen::Dynamic, 1 > beta_diff = ( Beta_temp - Beta );
104 T taylor_term_1 = f_grad.transpose()*beta_diff;
106 T taylor_term_2 = L/2.0*beta_diff.squaredNorm();
108 T f_beta_tilde = taylor_term_0 + taylor_term_1 + taylor_term_2;
110 while( f_beta > f_beta_tilde ) {
114 Beta_temp = ( Beta - (1.0/L)*f_grad ).unaryExpr(
SoftThres<T>( lambda/L ) );
116 f_beta = ( X*Beta_temp - Y ).squaredNorm();;
118 beta_diff = ( Beta_temp - Beta );
119 taylor_term_1 = f_grad.transpose()*beta_diff;
120 taylor_term_2 = L/2.0*beta_diff.squaredNorm();
122 f_beta_tilde = taylor_term_0 + taylor_term_1 + taylor_term_2;
126 return ( Beta - 1.0/L*f_grad ).unaryExpr(
SoftThres<T>( lambda/L ) );
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...
#define DEBUG_PRINT(x,...)
Run the Iterative Shrinking and Thresholding Algorthim.