Skip to content

MahalanobisTransformer

sknnr.transformers.MahalanobisTransformer

Bases: OneToOneFeatureMixin, TransformerMixin, BaseEstimator

Transformer that first standardizes features to zero mean and unit variance using a modified StandardScaler that uses N-1 degrees of freedom, then applies a Mahalanobis transformation to decorrelate features.

When used in conjunction with Euclidean distance metrics, this is equivalent to calculating Mahalanobis distances between samples.

Attributes:

Name Type Description
n_features_in_ int

Number of features seen during fit.

scaler_ StandardScalerWithDOF

The fitted scaler used to standardize feature data.

transform_ ndarray of shape (n_features, n_features)

The Mahalanobis transformation matrix.

Functions

fit

fit(X: DataLike, y: None = None) -> Self
Source code in src/sknnr/transformers/_mahalanobis_transformer.py
def fit(self, X: DataLike, y: None = None) -> Self:
    validate_data(
        self, X=X, ensure_all_finite="allow-nan", reset=True, ensure_min_features=2
    )

    self.scaler_ = StandardScalerWithDOF(ddof=1).fit(X)
    covariance = np.cov(self.scaler_.transform(X), rowvar=False)
    self.transform_ = np.linalg.inv(np.linalg.cholesky(covariance).T)
    return self

fit_transform

fit_transform(X: DataLike, y: None = None) -> NDArray[float64]
Source code in src/sknnr/transformers/_mahalanobis_transformer.py
def fit_transform(self, X: DataLike, y: None = None) -> NDArray[np.float64]:
    return self.fit(X, y).transform(X)

transform

transform(X: DataLike, y: None = None) -> NDArray[float64]
Source code in src/sknnr/transformers/_mahalanobis_transformer.py
def transform(self, X: DataLike, y: None = None) -> NDArray[np.float64]:
    check_is_fitted(self)
    validate_data(self, X=X, ensure_all_finite="allow-nan", reset=False)

    return self.scaler_.transform(X) @ self.transform_