pub struct MultinomialLogitLikelihood {
pub active_classes: usize,
pub row_weights: Option<Array1<f64>>,
}Expand description
Multinomial-logit (softmax) likelihood with explicit reference class.
Conventions:
Kis the total number of classes; the linear predictor hasM = K - 1columns corresponding to the active classes. ClassK - 1is the reference class with η_{K-1} ≡ 0 (so the gauge is fixed by construction and no additional sum-to-zero projection is required at the η level).yis the categorical response with shape(N, K). Each row must be a point on the probability simplex (y_c ≥ 0,Σ_c y_c = 1): a one-hot indicator for hard-label classification, or a label-smoothed probability vector. The row weightw_nscales the whole row’s likelihood contribution and is independent of the row mass — it is not the row sum. Callers enforce the simplex precondition via [validate_multinomial_simplex] at every construction boundary; under it the residual gradienty_a − p_aand Fisher blockp_a δ_ab − p_a p_bbelow are the exact derivatives of the log-likelihoodΣ_c y_c log p_c.etais the active linear predictor with shape(N, M = K - 1).
Softmax with baseline:
p_a = exp(η_a) / (1 + Σ_b exp(η_b)) for a ∈ [0, K-1)
p_{K-1} = 1 / (1 + Σ_b exp(η_b))Log-likelihood (rows with weight w_n, default 1.0):
log L = Σ_n w_n · ( Σ_{a < K-1} y_{n,a} · η_{n,a} − log(1 + Σ_b exp(η_{n,b})) )
= Σ_n w_n · Σ_{c ∈ [0, K)} y_{n,c} · log p_{n,c}Per-row gradient w.r.t. the active η is the canonical Bernoulli/softmax residual:
∂ log L / ∂η_{n,a} = w_n · (y_{n,a} − p_{n,a}) for a ∈ [0, K-1)Per-row Fisher (= observed, since logit is canonical for the multinomial)
information block, shape (M, M):
H_{n,a,b} = w_n · ( p_{n,a} · δ_{ab} − p_{n,a} · p_{n,b} )This is the standard reference-coded multinomial-logit GLM. The dense
per-row block flows through VectorLikelihood::hess_block into
gam_solve::pirls::dense_block_xtwx, which builds the stacked
XᵀWX in output-major coefficient ordering β = [β_0; β_1; …; β_{K-2}]
with each per-class block of size (P, P).
Fields§
§active_classes: usizeNumber of active classes M = K − 1. Cached for shape checks.
row_weights: Option<Array1<f64>>Optional row weights (length N), or None for uniform 1.0.
Implementations§
Source§impl MultinomialLogitLikelihood
impl MultinomialLogitLikelihood
Sourcepub fn with_classes(total_classes: usize) -> Result<Self, EstimationError>
pub fn with_classes(total_classes: usize) -> Result<Self, EstimationError>
Construct from the total number of classes K ≥ 2.
Sourcepub fn with_row_weights(self, w: Array1<f64>) -> Result<Self, EstimationError>
pub fn with_row_weights(self, w: Array1<f64>) -> Result<Self, EstimationError>
Attach per-row weights (length N, finite and non-negative).
Sourcepub fn total_classes(&self) -> usize
pub fn total_classes(&self) -> usize
Total class count K = M + 1.
Sourcepub fn softmax_with_baseline(eta_active: &[f64], out: &mut [f64])
pub fn softmax_with_baseline(eta_active: &[f64], out: &mut [f64])
Numerically-stable softmax with implicit reference column (η_{K-1} = 0).
Writes K probabilities into out (length M + 1). The shift uses
max(0, max(eta_active)) so the reference class is included in the
max and the denominator stays bounded. This is the canonical
reference implementation; the FFI surface and any direct
matrix-free callers route through this method rather than carrying
their own softmax.
Sourcepub fn probabilities(&self, eta: ArrayView2<'_, f64>) -> Array2<f64>
pub fn probabilities(&self, eta: ArrayView2<'_, f64>) -> Array2<f64>
Convenience: compute the full (N, K) probability matrix from (N, K-1) active linear predictor. This is the multinomial inverse link used by prediction.
Trait Implementations§
Source§impl Clone for MultinomialLogitLikelihood
impl Clone for MultinomialLogitLikelihood
Source§fn clone(&self) -> MultinomialLogitLikelihood
fn clone(&self) -> MultinomialLogitLikelihood
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for MultinomialLogitLikelihood
impl Debug for MultinomialLogitLikelihood
Source§impl VectorLikelihood for MultinomialLogitLikelihood
impl VectorLikelihood for MultinomialLogitLikelihood
Source§fn log_lik(&self, eta: ArrayView2<'_, f64>, y: ArrayView2<'_, f64>) -> f64
fn log_lik(&self, eta: ArrayView2<'_, f64>, y: ArrayView2<'_, f64>) -> f64
Source§fn grad_eta(
&self,
eta: ArrayView2<'_, f64>,
y: ArrayView2<'_, f64>,
) -> Array2<f64>
fn grad_eta( &self, eta: ArrayView2<'_, f64>, y: ArrayView2<'_, f64>, ) -> Array2<f64>
Source§fn hess_diag(
&self,
eta: ArrayView2<'_, f64>,
y: ArrayView2<'_, f64>,
) -> Array2<f64>
fn hess_diag( &self, eta: ArrayView2<'_, f64>, y: ArrayView2<'_, f64>, ) -> Array2<f64>
solver/arrow_schur.rs.Source§fn hess_block(
&self,
eta: ArrayView2<'_, f64>,
y: ArrayView2<'_, f64>,
) -> Array3<f64>
fn hess_block( &self, eta: ArrayView2<'_, f64>, y: ArrayView2<'_, f64>, ) -> Array3<f64>
Auto Trait Implementations§
impl Freeze for MultinomialLogitLikelihood
impl RefUnwindSafe for MultinomialLogitLikelihood
impl Send for MultinomialLogitLikelihood
impl Sync for MultinomialLogitLikelihood
impl Unpin for MultinomialLogitLikelihood
impl UnsafeUnpin for MultinomialLogitLikelihood
impl UnwindSafe for MultinomialLogitLikelihood
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.