7 Eigen::VectorXd& x_centers,
8 Eigen::VectorXd& x_scales,
9 const std::string& centering_type,
10 const std::string& scaling_type,
13 const int p = x.cols();
18 if ((x_scales.array().abs() == 0.0).any()) {
19 throw std::invalid_argument(
"One or more columns have zero variance");
22 bool center = centering_type !=
"none";
23 bool scale = scaling_type !=
"none";
24 bool center_jit = center && !modify_x;
25 bool scale_jit = scale && !modify_x;
29 if (center_jit && scale_jit) {
31 }
else if (center_jit) {
33 }
else if (scale_jit) {
39 if (modify_x && (center || scale)) {
40 for (
int j = 0; j < p; ++j) {
42 x.col(j).array() -= x_centers(j);
45 x.col(j).array() /= x_scales(j);
50 return jit_normalization;
55 Eigen::VectorXd& x_centers,
56 Eigen::VectorXd& x_scales,
57 const std::string& centering_type,
58 const std::string& scaling_type,
64 bool center = centering_type !=
"none";
65 bool scale = scaling_type !=
"none";
66 bool center_jit = center;
67 bool scale_jit = scale;
71 if (center_jit && scale_jit) {
73 }
else if (center_jit) {
75 }
else if (scale_jit) {
90 return jit_normalization;
96 const Eigen::SparseMatrix<double>& beta,
97 const Eigen::VectorXd& x_centers,
98 const Eigen::VectorXd& x_scales,
101 int m = beta0.size();
103 bool centering = x_centers.size() > 0;
104 bool scaling = x_scales.size() > 0;
106 Eigen::MatrixXd beta0_out = beta0;
107 Eigen::SparseMatrix<double> beta_out = beta;
109 if (centering || scaling) {
110 for (
int k = 0; k < m; ++k) {
111 double x_bar_beta_sum = 0.0;
113 for (Eigen::SparseMatrix<double>::InnerIterator it(beta_out, k); it;
118 it.valueRef() /= x_scales(j);
122 x_bar_beta_sum += x_centers(j) * it.valueRef();
127 beta0_out(k) -= x_bar_beta_sum;
132 return { beta0_out, beta_out };
JitNormalization normalize(Eigen::MatrixXd &x, Eigen::VectorXd &x_centers, Eigen::VectorXd &x_scales, const std::string ¢ering_type, const std::string &scaling_type, const bool modify_x)
std::tuple< Eigen::VectorXd, Eigen::MatrixXd > rescaleCoefficients(const Eigen::VectorXd &beta0, const Eigen::SparseMatrix< double > &beta, const Eigen::VectorXd &x_centers, const Eigen::VectorXd &x_scales, const bool intercept)
Rescales the coefficients using the given parameters.