@@ -146,25 +146,49 @@ double calculate_sum_error(const VectorXd &errors)
146146 return error;
147147}
148148
149+ VectorXd calculate_exp_of_linear_predictor_adjusted_for_numerical_problems (const VectorXd &linear_predictor, double min_exponent, double max_exponent)
150+ {
151+ VectorXd exp_of_linear_predictor{linear_predictor.array ().exp ()};
152+ double min_exp_of_linear_predictor{std::exp (min_exponent)};
153+ double max_exp_of_linear_predictor{std::exp (max_exponent)};
154+ for (size_t i = 0 ; i < static_cast <size_t >(linear_predictor.rows ()); ++i)
155+ {
156+ bool linear_predictor_is_too_small{std::isless (linear_predictor[i], min_exponent)};
157+ if (linear_predictor_is_too_small)
158+ {
159+ exp_of_linear_predictor[i] = min_exp_of_linear_predictor;
160+ continue ;
161+ }
162+
163+ bool linear_predictor_is_too_large{std::isgreater (linear_predictor[i], max_exponent)};
164+ if (linear_predictor_is_too_large)
165+ {
166+ exp_of_linear_predictor[i] = max_exp_of_linear_predictor;
167+ }
168+
169+ }
170+
171+ return exp_of_linear_predictor;
172+ }
173+
149174VectorXd transform_linear_predictor_to_predictions (const VectorXd &linear_predictor, const std::string &link_function=" identity" , double tweedie_power=1.5 )
150175{
151176 if (link_function==" identity" )
152177 return linear_predictor;
153178 else if (link_function==" logit" )
154179 {
155- VectorXd exp_of_linear_predictor{linear_predictor.array ().exp ()};
180+ double min_exponent{-MAX_ABS_EXPONENT_TO_APPLY_ON_LINEAR_PREDICTOR_IN_LOGIT_MODEL};
181+ double max_exponent{MAX_ABS_EXPONENT_TO_APPLY_ON_LINEAR_PREDICTOR_IN_LOGIT_MODEL};
182+ VectorXd exp_of_linear_predictor{calculate_exp_of_linear_predictor_adjusted_for_numerical_problems (linear_predictor, min_exponent, max_exponent)};
156183 VectorXd predictions{exp_of_linear_predictor.array () / (1.0 + exp_of_linear_predictor.array ())};
157- for (size_t i = 0 ; i < static_cast <size_t >(predictions.size ()); ++i)
158- {
159- if (std::isgreater (predictions[i],MAX_PREDICTED_PROBABILITY))
160- predictions[i]=MAX_PREDICTED_PROBABILITY;
161- else if (std::isless (predictions[i],MIN_PREDICTED_PROBABILITY))
162- predictions[i]=MIN_PREDICTED_PROBABILITY;
163- }
164184 return predictions;
165185 }
166186 else if (link_function==" log" )
167- return linear_predictor.array ().exp ();
187+ {
188+ double min_exponent{std::numeric_limits<double >::min_exponent10};
189+ double max_exponent{std::numeric_limits<double >::max_exponent10};
190+ return calculate_exp_of_linear_predictor_adjusted_for_numerical_problems (linear_predictor, min_exponent, max_exponent);
191+ }
168192 return VectorXd (0 );
169193}
170194
0 commit comments