slope 6.5.4
Loading...
Searching...
No Matches
diagnostics.h
Go to the documentation of this file.
1
6#pragma once
7
8#include "jit_normalization.h"
9#include "losses/loss.h"
10#include "math.h"
11#include "ols.h"
12#include "sorted_l1_norm.h"
13#include <Eigen/Dense>
14#include <Eigen/SparseCore>
15#include <algorithm>
16#include <memory>
17
18namespace slope {
19
20namespace detail {
21
22template<typename T>
23Eigen::MatrixXd
24quadraticOlsDualPointFromDesign(const T& x,
25 const Eigen::MatrixXd& y,
26 const bool intercept)
27{
28 Eigen::MatrixXd theta(y.rows(), y.cols());
29
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);
33 if (intercept) {
34 theta.col(k).array() += beta0;
35 theta.col(k).array() -= theta.col(k).mean();
36 }
37 }
38
39 return theta;
40}
41
42template<typename T>
43Eigen::MatrixXd
44quadraticOlsDualPoint(const Eigen::MatrixBase<T>& x,
45 const Eigen::MatrixXd& y,
46 const Eigen::VectorXd& x_centers,
47 const Eigen::VectorXd& x_scales,
48 const JitNormalization jit_normalization,
49 const bool intercept)
50{
51 Eigen::MatrixXd x_effective = x;
52 const bool center = jit_normalization == JitNormalization::Center ||
53 jit_normalization == JitNormalization::Both;
54 const bool scale = jit_normalization == JitNormalization::Scale ||
55 jit_normalization == JitNormalization::Both;
56
57 if (center && !intercept) {
58 x_effective.rowwise() -= x_centers.transpose();
59 }
60 if (scale) {
61 x_effective.array().rowwise() /= x_scales.transpose().array();
62 }
63
64 return quadraticOlsDualPointFromDesign(x_effective, y, intercept);
65}
66
67template<typename T>
68Eigen::MatrixXd
69quadraticOlsDualPoint(const Eigen::SparseMatrixBase<T>& x,
70 const Eigen::MatrixXd& y,
71 const Eigen::VectorXd& x_centers,
72 const Eigen::VectorXd& x_scales,
73 const JitNormalization jit_normalization,
74 const bool intercept)
75{
76 const bool center = jit_normalization == JitNormalization::Center ||
77 jit_normalization == JitNormalization::Both;
78 const bool scale = jit_normalization == JitNormalization::Scale ||
79 jit_normalization == JitNormalization::Both;
80
81 Eigen::SparseMatrix<double> x_effective = x;
82 if (scale) {
83 for (int k = 0; k < x_effective.outerSize(); ++k) {
84 for (Eigen::SparseMatrix<double>::InnerIterator it(x_effective, k); it;
85 ++it) {
86 it.valueRef() /= x_scales(it.col());
87 }
88 }
89 }
90
91 if (!center || intercept) {
92 return quadraticOlsDualPointFromDesign(x_effective, y, intercept);
93 }
94
95 Eigen::VectorXd effective_centers = x_centers;
96 if (scale) {
97 effective_centers.array() /= x_scales.array();
98 }
99
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);
106 }
107
108 return theta;
109}
110
111} // namespace detail
112
130template<typename MatrixType>
131double
132computeDualFromPoint(const Eigen::VectorXd& beta,
133 Eigen::MatrixXd theta,
134 const std::unique_ptr<Loss>& loss,
135 const SortedL1Norm& sl1_norm,
136 const Eigen::ArrayXd& lambda,
137 const MatrixType& x,
138 const Eigen::MatrixXd& y,
139 const Eigen::VectorXd& x_centers,
140 const Eigen::VectorXd& x_scales,
141 const JitNormalization& jit_normalization)
142{
143 const int n = x.rows();
144 Eigen::VectorXd gradient(beta.size());
145
146 updateGradient(gradient,
147 x,
148 theta,
149 x_centers,
150 x_scales,
151 Eigen::VectorXd::Ones(n),
152 jit_normalization);
153
154 const double dual_norm = sl1_norm.dualNorm(gradient, lambda);
155 theta.array() /= std::max(1.0, dual_norm);
156
157 return loss->dual(theta, y, Eigen::VectorXd::Ones(n));
158}
159
182template<typename MatrixType>
183double
184computeDual(const Eigen::VectorXd& beta,
185 const Eigen::MatrixXd& eta,
186 const std::unique_ptr<Loss>& loss,
187 const SortedL1Norm& sl1_norm,
188 const Eigen::ArrayXd& lambda,
189 const MatrixType& x,
190 const Eigen::MatrixXd& y,
191 const Eigen::VectorXd& x_centers,
192 const Eigen::VectorXd& x_scales,
193 const JitNormalization& jit_normalization,
194 const bool intercept)
195{
196 Eigen::MatrixXd theta = loss->dualPoint(eta, y, intercept);
197 return computeDualFromPoint(beta,
198 theta,
199 loss,
200 sl1_norm,
201 lambda,
202 x,
203 y,
204 x_centers,
205 x_scales,
206 jit_normalization);
207}
208
209} // namespace slope
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.
Definition clusters.h:11
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.
Definition math.h:311
Ordinary Least Squares (OLS) regression functionality.
The declaration of the SortedL1Norm class.