slope 6.6.0
Loading...
Searching...
No Matches
loss.h
Go to the documentation of this file.
1
6
7#pragma once
8
9#include <Eigen/Core>
10
11namespace slope {
12
20class Loss
21{
22public:
26 virtual ~Loss() = default;
27
38 virtual double loss(const Eigen::MatrixXd& eta, const Eigen::MatrixXd& y) = 0;
39
41 virtual double loss(const Eigen::MatrixXd& eta,
42 const Eigen::MatrixXd& y,
43 const Eigen::VectorXd& observation_weights);
44
56 virtual double dual(const Eigen::MatrixXd& theta,
57 const Eigen::MatrixXd& y,
58 const Eigen::VectorXd& w) = 0;
59
72 Eigen::MatrixXd residual(const Eigen::MatrixXd& eta,
73 const Eigen::MatrixXd& y);
74 // TODO: This function could be removed since it is just
75 // g^{-1}(eta) - y for all families
76
89 virtual Eigen::MatrixXd dualPoint(const Eigen::MatrixXd& eta,
90 const Eigen::MatrixXd& y,
91 bool fit_intercept);
92
95 virtual Eigen::MatrixXd dualPoint(const Eigen::MatrixXd& eta,
96 const Eigen::MatrixXd& y,
97 bool fit_intercept,
98 const Eigen::VectorXd& observation_weights);
99
109 virtual Eigen::MatrixXd hessianDiagonal(const Eigen::MatrixXd& eta) = 0;
110
122 virtual void updateWeightsAndWorkingResponse(Eigen::MatrixXd& w,
123 Eigen::MatrixXd& z,
124 const Eigen::MatrixXd& eta,
125 const Eigen::MatrixXd& y);
126
129 Eigen::MatrixXd& w,
130 Eigen::MatrixXd& z,
131 const Eigen::MatrixXd& eta,
132 const Eigen::MatrixXd& y,
133 const Eigen::VectorXd& observation_weights);
134
140 virtual Eigen::MatrixXd preprocessResponse(const Eigen::MatrixXd& y) = 0;
141
150 virtual void updateIntercept(Eigen::VectorXd& beta0,
151 const Eigen::MatrixXd& eta,
152 const Eigen::MatrixXd& y)
153 {
154 Eigen::MatrixXd residual = this->residual(eta, y);
155 beta0 -= residual.colwise().mean() / this->lipschitz_constant;
156 };
157 // TODO: This function is not currently used anywhere and could
158 // probably be removed.
159
166 virtual Eigen::MatrixXd link(const Eigen::MatrixXd& mu) = 0;
167
174 virtual Eigen::MatrixXd inverseLink(const Eigen::MatrixXd& eta) = 0;
175
181 virtual Eigen::MatrixXd predict(const Eigen::MatrixXd& eta) = 0;
182
190 virtual double deviance(const Eigen::MatrixXd& eta, const Eigen::MatrixXd& y)
191 {
192 return 2.0 * (loss(eta, y) - loss(link(y), y));
193 }
194
196 virtual double deviance(const Eigen::MatrixXd& eta,
197 const Eigen::MatrixXd& y,
198 const Eigen::VectorXd& observation_weights);
199
200protected:
202 Eigen::MatrixXd residualOnSupport(const Eigen::MatrixXd& eta,
203 const Eigen::MatrixXd& y,
204 const Eigen::VectorXd& observation_weights);
205
213 explicit Loss(double lipschitz_constant)
214 : lipschitz_constant(lipschitz_constant)
215 {
216 }
217
226 Eigen::MatrixXd domainSafePoint(const Eigen::MatrixXd& mean,
227 const Eigen::MatrixXd& y,
228 double lower,
229 double upper) const;
230
231 Eigen::MatrixXd domainSafePoint(
232 const Eigen::MatrixXd& mean,
233 const Eigen::MatrixXd& y,
234 double lower,
235 double upper,
236 const Eigen::VectorXd& observation_weights) const;
237
238private:
239 const double lipschitz_constant;
240};
241
242} // namespace slope
virtual Eigen::MatrixXd dualPoint(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, bool fit_intercept)
Constructs a dual candidate from a linear predictor.
Loss(double lipschitz_constant)
Constructs an loss function with specified Lipschitz constant.
Definition loss.h:213
virtual double loss(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, const Eigen::VectorXd &observation_weights)
Calculates the loss averaged by observation weights.
virtual double loss(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y)=0
Calculates the loss function.
virtual Eigen::MatrixXd preprocessResponse(const Eigen::MatrixXd &y)=0
Preprocess response.
virtual double deviance(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y)
Computes deviance, which is 2 times the difference between the loglikelihood of the model and the log...
Definition loss.h:190
Eigen::MatrixXd residualOnSupport(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, const Eigen::VectorXd &observation_weights)
Evaluates family residuals only on positive-weight observations.
virtual void updateIntercept(Eigen::VectorXd &beta0, const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y)
Updates the intercept with a gradient descent update.
Definition loss.h:150
Eigen::MatrixXd residual(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y)
Calculates the generalized residual.
virtual void updateWeightsAndWorkingResponse(Eigen::MatrixXd &w, Eigen::MatrixXd &z, const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y)
Updates weights and working response.
virtual Eigen::MatrixXd inverseLink(const Eigen::MatrixXd &eta)=0
The inverse link function, also known as the mean function.
virtual Eigen::MatrixXd predict(const Eigen::MatrixXd &eta)=0
Return predicted response.
virtual double deviance(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, const Eigen::VectorXd &observation_weights)
Computes deviance averaged by observation weights.
virtual double dual(const Eigen::MatrixXd &theta, const Eigen::MatrixXd &y, const Eigen::VectorXd &w)=0
Calculates the dual loss.
virtual void updateWeightsAndWorkingResponse(Eigen::MatrixXd &w, Eigen::MatrixXd &z, const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, const Eigen::VectorXd &observation_weights)
Updates the IRLS approximation including observation weights.
virtual Eigen::MatrixXd hessianDiagonal(const Eigen::MatrixXd &eta)=0
Calculates the hessian diagonal of the loss function.
virtual ~Loss()=default
Destructor for the Loss class.
virtual Eigen::MatrixXd link(const Eigen::MatrixXd &mu)=0
The link function.
virtual Eigen::MatrixXd dualPoint(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, bool fit_intercept, const Eigen::VectorXd &observation_weights)
Constructs a dual candidate with weighted intercept stationarity.
Eigen::MatrixXd domainSafePoint(const Eigen::MatrixXd &mean, const Eigen::MatrixXd &y, double lower, double upper) const
Enforces scalar intercept stationarity without leaving a mean domain.
Namespace containing SLOPE regression implementation.
Definition clusters.h:11