Source code for skmatter.utils._sparsekde
"""The file holds utility functions and classes for the sparse KDE."""
import numpy as np
[docs]
def effdim(cov):
"""
Calculate the effective dimension of a covariance matrix based on Shannon entropy.
Parameters
----------
cov : numpy.ndarray
The covariance matrix.
Returns
-------
float
The effective dimension of the covariance matrix.
Examples
--------
>>> import numpy as np
>>> from skmatter.utils import effdim
>>> cov = np.array([[25, 15, -5], [15, 18, 0], [-5, 0, 11]], dtype=np.float64)
>>> print(round(effdim(cov), 3))
2.214
References
----------
https://ieeexplore.ieee.org/document/7098875
"""
eigval = np.linalg.eigvals(cov)
if (lowest_eigval := np.min(eigval)) <= -np.max(cov.shape) * np.finfo(
cov.dtype
).eps:
raise np.linalg.LinAlgError(
f"Matrix is not positive definite."
f"Lowest eigenvalue {lowest_eigval} is "
f"above numerical threshold."
)
eigval[eigval < 0.0] = 0.0
eigval /= sum(eigval)
eigval *= np.log(eigval)
return np.exp(-sum(eigval))
[docs]
def oas(cov: np.ndarray, n: float, D: int) -> np.ndarray:
"""
Oracle approximating shrinkage (OAS) estimator
Parameters
----------
cov : numpy.ndarray
A covariance matrix
n : float
The local population
D : int
Dimension
Examples
--------
>>> import numpy as np
>>> from skmatter.utils import oas
>>> cov = np.array([[0.5, 1.0], [0.7, 0.4]])
>>> oas(cov, 10, 2)
array([[0.48903924, 0.78078484],
[0.54654939, 0.41096076]])
Returns
-------
np.ndarray
Covariance matrix
"""
tr = np.trace(cov)
tr2 = tr**2
tr_cov2 = np.trace(cov**2)
phi = ((1 - 2 / D) * tr_cov2 + tr2) / ((n + 1 - 2 / D) * tr_cov2 - tr2 / D)
return (1 - phi) * cov + phi * np.eye(D) * tr / D