17 #include "../../../Generic/generics.hpp" 18 #include "../subgradient_descent.hpp" 22 template <
typename T,
typename Base =
internal::Solver< T > >
29 FISTA(
const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0, T L_0 = 0.1 );
32 Eigen::Matrix< T, Eigen::Dynamic, 1 > update_rule(
33 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
34 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
35 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
40 Eigen::Matrix< T, Eigen::Dynamic, 1 > update_beta_fista (
41 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
42 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
43 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
47 Eigen::Matrix< T, Eigen::Dynamic, 1 > y_k;
48 Eigen::Matrix< T, Eigen::Dynamic, 1 > y_k_old;
50 Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > x_k_less_1;
53 T t_k =
static_cast<T
>( 1 );
54 T L =
static_cast<T
>( 0 );
57 template <
typename T,
typename Base >
63 template <
typename T,
typename Base >
65 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
66 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
67 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
71 Eigen::Matrix< T, Eigen::Dynamic, 1 > x_k = Beta;
76 T t_k_plus_1 = ( 1.0 + std::sqrt( 1.0 + 4.0 *
square( t_k ) ) ) / 2.0;
79 y_k = x_k + ( t_k - 1.0 ) / ( t_k_plus_1 ) * ( x_k - x_k_less_1 );
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,
100 unsigned int counter = 0;
114 return update_beta_fista( X, Y, Beta, L, lambda );;
117 template <
typename T,
typename Base >
119 const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
120 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
121 const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
130 Eigen::Matrix< T, Eigen::Dynamic, 1 > f_grad = 2.0*( X.transpose()*( X*y_k_old - Y ) );
132 Eigen::Matrix< T, Eigen::Dynamic, 1 > to_modify = y_k_old - (1.0/L)*f_grad;
133 Eigen::Matrix< T, Eigen::Dynamic, 1 > y_k_temp = to_modify.unaryExpr(
SoftThres<T>( lambda/L ) );
135 unsigned int counter = 0;
137 T f_beta = ( X*y_k_temp - Y ).squaredNorm();
139 Eigen::Matrix< T, Eigen::Dynamic, 1 > f_part = X*y_k_old - Y;
140 T taylor_term_0 = f_part.squaredNorm();
142 Eigen::Matrix< T, Eigen::Dynamic, 1 > beta_diff = ( y_k_temp - y_k_old );
144 T taylor_term_1 = f_grad.transpose()*beta_diff;
146 T taylor_term_2 = L/2.0*beta_diff.squaredNorm();
148 T f_beta_tilde = taylor_term_0 + taylor_term_1 + taylor_term_2;
150 while( f_beta > f_beta_tilde ) {
158 to_modify = y_k_old - (1.0/L)*f_grad;
159 y_k_temp = to_modify.unaryExpr(
SoftThres<T>( lambda/L ) );
161 f_beta = ( X*y_k_temp - Y ).squaredNorm();;
163 beta_diff = ( y_k_temp - y_k_old );
164 taylor_term_1 = f_grad.transpose()*beta_diff;
165 taylor_term_2 = L/2.0*beta_diff.squaredNorm();
167 f_beta_tilde = taylor_term_0 + taylor_term_1 + taylor_term_2;
171 Eigen::Matrix< T, Eigen::Dynamic, 1 > x_k = Beta;
175 to_modify = y_k_old - (1.0/L)*f_grad;
178 T t_k_plus_1 = ( 1.0 + std::sqrt( 1.0 + 4.0 *
square( t_k ) ) ) / 2.0;
181 y_k = x_k + ( t_k - 1.0 ) / ( t_k_plus_1 ) * ( x_k - x_k_less_1 );
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,...)
T square(T &val)
Compute the square of a value.
Run the Fast Iterative Shrinking and Thresholding Algorthim.