slope 0.29.0
Loading...
Searching...
No Matches
poisson.cpp
1#include "poisson.h"
2#include "../constants.h"
3
4namespace slope {
5
6double
7Poisson::loss(const Eigen::MatrixXd& eta, const Eigen::MatrixXd& y)
8{
9 return -(y.array() * eta.array() - eta.array().exp()).mean();
10}
11
12double
13Poisson::dual(const Eigen::MatrixXd& theta,
14 const Eigen::MatrixXd& y,
15 const Eigen::VectorXd&)
16{
17 const Eigen::ArrayXd e = theta + y;
18
19 assert(theta.allFinite() && "theta is not finite");
20
21 return (e * (1.0 - e.max(constants::P_MIN).log())).mean();
22}
23
24Eigen::MatrixXd
25Poisson::residual(const Eigen::MatrixXd& eta, const Eigen::MatrixXd& y)
26{
27 return eta.array().exp() - y.array();
28}
29
30void
32 Eigen::VectorXd& z,
33 const Eigen::VectorXd& eta,
34 const Eigen::VectorXd& y)
35{
36 w = eta.array().exp();
37 z = eta.array() - 1.0 + y.array() / w.array();
38}
39
40Eigen::MatrixXd
41Poisson::preprocessResponse(const Eigen::MatrixXd& y)
42{
43 if ((y.array() < 0).any()) {
44 throw std::invalid_argument("Response must be non-negative");
45 }
46
47 return y;
48}
49
50void
51Poisson::updateIntercept(Eigen::VectorXd& beta0,
52 const Eigen::MatrixXd& eta,
53 const Eigen::MatrixXd& y)
54{
55 Eigen::VectorXd residual = this->residual(eta, y);
56 double grad = residual.mean();
57 double hess = eta.array().exp().mean();
58
59 beta0(0) -= grad / hess;
60}
61
62Eigen::MatrixXd
63Poisson::link(const Eigen::MatrixXd& mu)
64{
65 return mu.array().max(constants::P_MIN).log();
66}
67
68Eigen::MatrixXd
69Poisson::inverseLink(const Eigen::MatrixXd& eta)
70{
71 return eta.array().exp();
72}
73
74Eigen::MatrixXd
75Poisson::predict(const Eigen::MatrixXd& eta)
76{
77 return inverseLink(eta);
78}
79
80} // namespace slope
void updateWeightsAndWorkingResponse(Eigen::VectorXd &w, Eigen::VectorXd &z, const Eigen::VectorXd &eta, const Eigen::VectorXd &y) override
Updates the weights and working response for IRLS (Iteratively Reweighted Least Squares).
Definition poisson.cpp:31
Eigen::MatrixXd residual(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y) override
Calculates the residual (negative gradient) for the Poisson regression.
Definition poisson.cpp:25
Eigen::MatrixXd predict(const Eigen::MatrixXd &eta) override
Return predicted response, that is 0 or 1 depending on the predicted probabilities.
Definition poisson.cpp:75
void updateIntercept(Eigen::VectorXd &beta0, const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y) override
Updates the intercept with a gradient descent update. Unlike the Quadratic and Logistic cases,...
Definition poisson.cpp:51
double dual(const Eigen::MatrixXd &theta, const Eigen::MatrixXd &y, const Eigen::VectorXd &w) override
Calculates the Fenchel conjugate (dual) of the Poisson loss.
Definition poisson.cpp:13
double loss(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y) override
Calculates the negative log-likelihood loss for the Poisson regression.
Definition poisson.cpp:7
Eigen::MatrixXd inverseLink(const Eigen::MatrixXd &eta) override
The inverse link function, also known as the mean function.
Definition poisson.cpp:69
Eigen::MatrixXd link(const Eigen::MatrixXd &mu) override
The link function.
Definition poisson.cpp:63
Eigen::MatrixXd preprocessResponse(const Eigen::MatrixXd &y) override
Preprocesses the response for the Poisson model.
Definition poisson.cpp:41
constexpr double P_MIN
Minimum allowed probability value to avoid numerical underflow.
Definition constants.h:30
Namespace containing SLOPE regression implementation.
Definition clusters.cpp:5
Poisson loss function implementation for SLOPE algorithm.