36 const std::string& update_type)
39 , learning_rate_decr(0.5)
40 , update_type{ update_type }
46 void run(Eigen::VectorXd& beta0,
47 Eigen::VectorXd& beta,
49 const Eigen::ArrayXd& lambda,
50 const std::unique_ptr<Loss>& loss,
52 const Eigen::VectorXd& gradient,
53 const std::vector<int>& working_set,
54 const Eigen::MatrixXd& x,
55 const Eigen::VectorXd& x_centers,
56 const Eigen::VectorXd& x_scales,
57 const Eigen::MatrixXd& y)
override;
60 void run(Eigen::VectorXd& beta0,
61 Eigen::VectorXd& beta,
63 const Eigen::ArrayXd& lambda,
64 const std::unique_ptr<Loss>& loss,
66 const Eigen::VectorXd& gradient,
67 const std::vector<int>& working_set,
68 const Eigen::SparseMatrix<double>& x,
69 const Eigen::VectorXd& x_centers,
70 const Eigen::VectorXd& x_scales,
71 const Eigen::MatrixXd& y)
override;
74 void run(Eigen::VectorXd& beta0,
75 Eigen::VectorXd& beta,
77 const Eigen::ArrayXd& lambda,
78 const std::unique_ptr<Loss>& loss,
80 const Eigen::VectorXd& gradient,
81 const std::vector<int>& working_set,
82 const Eigen::Map<Eigen::MatrixXd>& x,
83 const Eigen::VectorXd& x_centers,
84 const Eigen::VectorXd& x_scales,
85 const Eigen::MatrixXd& y)
override;
88 void run(Eigen::VectorXd& beta0,
89 Eigen::VectorXd& beta,
91 const Eigen::ArrayXd& lambda,
92 const std::unique_ptr<Loss>& loss,
94 const Eigen::VectorXd& gradient,
95 const std::vector<int>& working_set,
96 const Eigen::Map<Eigen::SparseMatrix<double>>& x,
97 const Eigen::VectorXd& x_centers,
98 const Eigen::VectorXd& x_scales,
99 const Eigen::MatrixXd& y)
override;
102 template<
typename MatrixType>
103 void runImpl(Eigen::VectorXd& beta0,
104 Eigen::VectorXd& beta,
105 Eigen::MatrixXd& eta,
106 const Eigen::ArrayXd& lambda,
107 const std::unique_ptr<Loss>& loss,
109 const Eigen::VectorXd& gradient,
110 const std::vector<int>& working_set,
112 const Eigen::VectorXd& x_centers,
113 const Eigen::VectorXd& x_scales,
114 const Eigen::MatrixXd& y)
117 using Eigen::MatrixXd;
118 using Eigen::VectorXd;
120 int n_working = working_set.size();
122 Eigen::VectorXd beta_old = beta(working_set);
123 Eigen::VectorXd beta_diff(n_working);
124 Eigen::VectorXd beta0_old = beta0;
126 double g_old = loss->loss(eta, y);
129 Eigen::MatrixXd residual = loss->residual(eta, y);
130 Eigen::VectorXd intercept_grad = residual.colwise().mean();
131 Eigen::VectorXd grad_working = gradient(working_set);
133 int line_search_iter = 0;
134 const int max_line_search_iter = 100;
138 beta0 = beta0_old - this->learning_rate * intercept_grad;
142 penalty.
prox(beta_old - this->learning_rate * grad_working,
143 this->learning_rate * lambda.head(n_working));
145 beta_diff = beta(working_set) - beta_old;
146 double beta_diff_norm =
147 beta_diff.dot(grad_working) +
148 (1.0 / (2 * this->learning_rate)) * beta_diff.squaredNorm();
151 Eigen::VectorXd beta0_diff = beta0 - beta0_old;
154 intercept_grad.dot(beta0_diff) +
155 (1.0 / (2 * this->learning_rate)) * beta0_diff.squaredNorm();
167 double g = loss->loss(eta, y);
168 double q = g_old + beta_diff_norm;
170 if (q >= g * (1 - 1e-12) || this->learning_rate < 1e-12) {
171 this->learning_rate *= 1.1;
174 this->learning_rate *= this->learning_rate_decr;
178 if (line_search_iter >= max_line_search_iter) {
183 if (update_type ==
"fista") {
184 if (beta_prev.size() == 0) {
188 this->t = 0.5 * (1.0 + std::sqrt(1.0 + 4.0 * t_old * t_old));
189 Eigen::VectorXd beta_current = beta(working_set);
192 (beta_current - beta_prev(working_set)) * (t_old - 1.0) / this->t;
193 beta_prev(working_set) = beta_current;
206 double learning_rate;
207 double learning_rate_decr;
208 std::string update_type;
210 Eigen::VectorXd beta_prev;
void run(Eigen::VectorXd &beta0, Eigen::VectorXd &beta, Eigen::MatrixXd &eta, const Eigen::ArrayXd &lambda, const std::unique_ptr< Loss > &loss, const SortedL1Norm &penalty, const Eigen::VectorXd &gradient, const std::vector< int > &working_set, const Eigen::Map< Eigen::MatrixXd > &x, const Eigen::VectorXd &x_centers, const Eigen::VectorXd &x_scales, const Eigen::MatrixXd &y) override
Pure virtual function defining the solver's optimization routine.
void run(Eigen::VectorXd &beta0, Eigen::VectorXd &beta, Eigen::MatrixXd &eta, const Eigen::ArrayXd &lambda, const std::unique_ptr< Loss > &loss, const SortedL1Norm &penalty, const Eigen::VectorXd &gradient, const std::vector< int > &working_set, const Eigen::SparseMatrix< double > &x, const Eigen::VectorXd &x_centers, const Eigen::VectorXd &x_scales, const Eigen::MatrixXd &y) override
Pure virtual function defining the solver's optimization routine.
void run(Eigen::VectorXd &beta0, Eigen::VectorXd &beta, Eigen::MatrixXd &eta, const Eigen::ArrayXd &lambda, const std::unique_ptr< Loss > &loss, const SortedL1Norm &penalty, const Eigen::VectorXd &gradient, const std::vector< int > &working_set, const Eigen::MatrixXd &x, const Eigen::VectorXd &x_centers, const Eigen::VectorXd &x_scales, const Eigen::MatrixXd &y) override
Pure virtual function defining the solver's optimization routine.
void run(Eigen::VectorXd &beta0, Eigen::VectorXd &beta, Eigen::MatrixXd &eta, const Eigen::ArrayXd &lambda, const std::unique_ptr< Loss > &loss, const SortedL1Norm &penalty, const Eigen::VectorXd &gradient, const std::vector< int > &working_set, const Eigen::Map< Eigen::SparseMatrix< double > > &x, const Eigen::VectorXd &x_centers, const Eigen::VectorXd &x_scales, const Eigen::MatrixXd &y) override
Pure virtual function defining the solver's optimization routine.