14#include <Eigen/SparseCore>
24quadraticOlsDualPointFromDesign(
const T& x,
25 const Eigen::MatrixXd& y,
28 Eigen::MatrixXd theta(y.rows(), y.cols());
30 for (Eigen::Index k = 0; k < y.cols(); ++k) {
31 auto [beta0, beta] = fitOls(x, Eigen::VectorXd(y.col(k)), intercept);
32 theta.col(k) = x * beta - y.col(k);
34 theta.col(k).array() += beta0;
35 theta.col(k).array() -= theta.col(k).mean();
44quadraticOlsDualPoint(
const Eigen::MatrixBase<T>& x,
45 const Eigen::MatrixXd& y,
46 const Eigen::VectorXd& x_centers,
47 const Eigen::VectorXd& x_scales,
51 Eigen::MatrixXd x_effective = x;
57 if (center && !intercept) {
58 x_effective.rowwise() -= x_centers.transpose();
61 x_effective.array().rowwise() /= x_scales.transpose().array();
64 return quadraticOlsDualPointFromDesign(x_effective, y, intercept);
69quadraticOlsDualPoint(
const Eigen::SparseMatrixBase<T>& x,
70 const Eigen::MatrixXd& y,
71 const Eigen::VectorXd& x_centers,
72 const Eigen::VectorXd& x_scales,
81 Eigen::SparseMatrix<double> x_effective = x;
83 for (
int k = 0; k < x_effective.outerSize(); ++k) {
84 for (Eigen::SparseMatrix<double>::InnerIterator it(x_effective, k); it;
86 it.valueRef() /= x_scales(it.col());
91 if (!center || intercept) {
92 return quadraticOlsDualPointFromDesign(x_effective, y, intercept);
95 Eigen::VectorXd effective_centers = x_centers;
97 effective_centers.array() /= x_scales.array();
100 Eigen::MatrixXd theta(y.rows(), y.cols());
101 for (Eigen::Index k = 0; k < y.cols(); ++k) {
102 auto fit = fitOls(x_effective, Eigen::VectorXd(y.col(k)),
true);
103 const Eigen::VectorXd& beta = fit.second;
104 theta.col(k) = x_effective * beta - y.col(k);
105 theta.col(k).array() -= effective_centers.dot(beta);
130template<
typename MatrixType>
133 Eigen::MatrixXd theta,
134 const std::unique_ptr<Loss>& loss,
136 const Eigen::ArrayXd& lambda,
138 const Eigen::MatrixXd& y,
139 const Eigen::VectorXd& x_centers,
140 const Eigen::VectorXd& x_scales,
143 const int n = x.rows();
144 Eigen::VectorXd gradient(beta.size());
151 Eigen::VectorXd::Ones(n),
154 const double dual_norm = sl1_norm.
dualNorm(gradient, lambda);
155 theta.array() /= std::max(1.0, dual_norm);
157 return loss->dual(theta, y, Eigen::VectorXd::Ones(n));
182template<
typename MatrixType>
185 const Eigen::MatrixXd& eta,
186 const std::unique_ptr<Loss>& loss,
188 const Eigen::ArrayXd& lambda,
190 const Eigen::MatrixXd& y,
191 const Eigen::VectorXd& x_centers,
192 const Eigen::VectorXd& x_scales,
194 const bool intercept)
196 Eigen::MatrixXd theta = loss->dualPoint(eta, y, intercept);
Class representing the Sorted L1 Norm.
double dualNorm(const Eigen::VectorXd &a, const Eigen::ArrayXd &lambda) const
Computes the dual norm of a vector.
Enums to control predictor standardization behavior.
The declartion of the Objctive class and its subclasses, which represent the data-fitting part of the...
Mathematical support functions for the slope package.
Namespace containing SLOPE regression implementation.
double computeDualFromPoint(const Eigen::VectorXd &beta, Eigen::MatrixXd theta, const std::unique_ptr< Loss > &loss, const SortedL1Norm &sl1_norm, const Eigen::ArrayXd &lambda, const MatrixType &x, const Eigen::MatrixXd &y, const Eigen::VectorXd &x_centers, const Eigen::VectorXd &x_scales, const JitNormalization &jit_normalization)
Scales a candidate into the SLOPE dual constraint and evaluates it.
JitNormalization
Enums to control predictor standardization behavior.
double computeDual(const Eigen::VectorXd &beta, const Eigen::MatrixXd &eta, const std::unique_ptr< Loss > &loss, const SortedL1Norm &sl1_norm, const Eigen::ArrayXd &lambda, const MatrixType &x, const Eigen::MatrixXd &y, const Eigen::VectorXd &x_centers, const Eigen::VectorXd &x_scales, const JitNormalization &jit_normalization, const bool intercept)
Computes the dual objective function value for SLOPE optimization.
void updateGradient(Eigen::VectorXd &gradient, const T &x, const Eigen::MatrixXd &residual, const std::vector< int > &active_set, const Eigen::VectorXd &x_centers, const Eigen::VectorXd &x_scales, const Eigen::VectorXd &w, const JitNormalization jit_normalization)
Computes the gradient for selected coefficients.
Ordinary Least Squares (OLS) regression functionality.
The declaration of the SortedL1Norm class.