import numpy as np
from pprint import pprint
from crabbymetrics import MultinomialLogit
np.set_printoptions(precision=4, suppress=True)Multinomial Logit Example
This page mirrors examples/multinomial_logit_example.py.
1 Fit A Multiclass Logit Model
def softmax(x: np.ndarray) -> np.ndarray:
x = x - x.max(axis=1, keepdims=True)
exps = np.exp(x)
return exps / exps.sum(axis=1, keepdims=True)
rng = np.random.default_rng(3)
n = 1000
k = 3
c = 3
coef = np.array(
[
[1.0, -0.5, 0.2],
[-0.7, 0.9, -0.4],
[0.2, -0.3, 0.8],
]
)
intercept = np.array([0.3, -0.2, 0.0])
x = rng.normal(size=(n, k))
logits = x @ coef.T + intercept
probs = softmax(logits)
y = np.array([rng.choice(c, p=probs[i]) for i in range(n)], dtype=np.int32)
model = MultinomialLogit(alpha=1.0, max_iterations=200)
model.fit(x, y)
print("true intercept:", intercept)
print("true coef:", coef)
pprint(model.summary())2 Prediction surfaces
For multinomial logit, predict_lin() returns one latent score per class, predict() returns class probabilities, and predict_label() returns the argmax class.
check = x[:5]
print("linear scores")
print(model.predict_lin(check))
print("probabilities")
print(model.predict(check))
print("labels")
print(model.predict_label(check))