pub struct MultinomialFitOutputs {
pub coefficients_active: Array2<f64>,
pub fitted_probabilities: Array2<f64>,
pub iterations: usize,
pub penalized_neg_log_likelihood: f64,
pub deviance: f64,
pub coefficient_covariance: Array2<f64>,
}Expand description
Outputs of fit_penalized_multinomial.
Fields§
§coefficients_active: Array2<f64>Active-class coefficient block, shape (P, K-1) (column a is β_a).
The reference class K - 1 has β_{K-1} ≡ 0 by construction and is
not stored.
fitted_probabilities: Array2<f64>Fitted probabilities, shape (N, K).
iterations: usizeNumber of Newton iterations executed (including the final step that
satisfied the tolerance). Non-convergence (outside the separation lane,
which escalates to the Firth refit) is surfaced as the typed
EstimationError::FixedLambdaNewtonDidNotConverge rather than an Ok
with a flag, so every constructed value of this struct is a certified
converged fit (SPEC: a fit only ever comes from a converged
optimization).
penalized_neg_log_likelihood: f64Penalized negative log-likelihood at the returned β̂:
−log L(β̂) + ½ Σ_a λ_a · β̂_a^T S β̂_a.
deviance: f64Unpenalized deviance −2 log L(β̂) for diagnostic reporting.
coefficient_covariance: Array2<f64>Joint Laplace posterior coefficient covariance H⁻¹ at the converged
β̂, shape (P·(K−1))×(P·(K−1)) (#1101). Block-ordered to match the
stacked active-class coefficient vector β = [β_0; …; β_{K-2}]: active
class a’s P coefficients occupy rows/cols a·P .. (a+1)·P, indexed
θ[a·P + i] = β̂[i, a]. This is the Laplace covariance from the factored
penalized Hessian XᵀWX + diag_a(λ_a)⊗S; it drives the delta-method
per-class probability standard errors
(Self::logistic_normal_softmax_moments)
on the fixed-λ inner-solve path.
Implementations§
Source§impl MultinomialFitOutputs
impl MultinomialFitOutputs
Sourcepub fn n_active_classes(&self) -> usize
pub fn n_active_classes(&self) -> usize
Number of active classes M = K − 1 (columns of
Self::coefficients_active).
Sourcepub fn p_per_class(&self) -> usize
pub fn p_per_class(&self) -> usize
Per-class coefficient dimension P (rows of
Self::coefficients_active).
Sourcepub fn logistic_normal_softmax_moments(
&self,
x_new: ArrayView2<'_, f64>,
) -> Result<(Array2<f64>, Array2<f64>), EstimationError>
pub fn logistic_normal_softmax_moments( &self, x_new: ArrayView2<'_, f64>, ) -> Result<(Array2<f64>, Array2<f64>), EstimationError>
Integrate the logistic-normal coefficient posterior at fresh design rows:
E[softmax(η)] and its marginal standard deviations with
η ~ N(x'β̂, x'Σx), the full joint covariance (cross-class blocks
included) contracted into each row’s active-logit covariance before
deterministic adaptive integration.
§This is NOT the posterior mean, and the name says so on purpose (#2612)
The quantity a caller usually wants — the posterior mean probability —
is not this. Integrating a nonlinear functional over the Laplace Gaussian
keeps the curvature half of the O(n⁻¹) correction to a posterior mean
and drops the skewness half; on a (quasi-)separated softmax the two are
neither small nor same-signed, and the result is under-confident by up to
tens of percentage points at unchanged argmax. The posterior mean is
computed by crate::multinomial_predictive as a ratio of normalising
constants, and MultinomialSavedModel::predict_probabilities is the
entry point that publishes it.
What this function IS, and why it stays: the exact moments of softmax
under a STATED Gaussian. That is a well-defined object with its own uses
(propagating a declared coefficient uncertainty through the link, and
pinning the integrator itself), and naming it for the Gaussian rather
than for the posterior is what keeps the two from being confused again.
pub fn logistic_normal_softmax_moments_with_control( &self, x_new: ArrayView2<'_, f64>, control: &MultinomialPosteriorIntegrationControl, ) -> Result<(Array2<f64>, Array2<f64>), EstimationError>
Trait Implementations§
Source§impl Clone for MultinomialFitOutputs
impl Clone for MultinomialFitOutputs
Source§fn clone(&self) -> MultinomialFitOutputs
fn clone(&self) -> MultinomialFitOutputs
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for MultinomialFitOutputs
impl RefUnwindSafe for MultinomialFitOutputs
impl Send for MultinomialFitOutputs
impl Sync for MultinomialFitOutputs
impl Unpin for MultinomialFitOutputs
impl UnsafeUnpin for MultinomialFitOutputs
impl UnwindSafe for MultinomialFitOutputs
Blanket Implementations§
impl<T> Allocation for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T, U> Imply<T> for U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.