"""Various helper functions"""
from typing import List, Dict
import numpy as np
[docs]
def correlation_to_covariance(
correlation_matrix: np.ndarray, standard_deviations: np.ndarray
) -> np.ndarray:
r"""
Convert correlation matrix into covariance matrix.
Computes :math:`\Sigma_{ij} = \sigma_i \rho_{ij} \sigma_j` where
:math:`\sigma_i` are the per-bin standard deviations and :math:`\rho_{ij}`
is the input correlation matrix.
Args:
correlation_matrix (``np.ndarray``): A real NxN correlation matrix
:math:`\rho` (diagonal entries equal to one, off-diagonals in
``[-1, 1]``).
standard_deviations (``np.ndarray``): A real N-dimensional vector
of per-bin standard deviations :math:`\sigma_i`.
Returns:
``np.ndarray``:
Covariance matrix :math:`\Sigma` of shape ``(N, N)``.
Example:
.. code-block:: python3
>>> import numpy as np
>>> from spey.helper_functions import correlation_to_covariance
>>> rho = np.array([[1.0, 0.3], [0.3, 1.0]])
>>> sigma = np.array([2.0, 4.0])
>>> correlation_to_covariance(rho, sigma)
array([[ 4. , 2.4],
[ 2.4, 16. ]])
"""
sigma = np.diag(standard_deviations)
return sigma @ correlation_matrix @ sigma
[docs]
def covariance_to_correlation(covariance_matrix: np.ndarray) -> np.ndarray:
r"""
Convert covariance matrix into correlation matrix.
Computes :math:`\rho_{ij} = \Sigma_{ij} / (\sigma_i \sigma_j)` where
:math:`\sigma_i = \sqrt{\Sigma_{ii}}` are the per-bin standard deviations.
Args:
covariance_matrix (``np.ndarray``): A real NxN covariance matrix
:math:`\Sigma` with strictly positive diagonal entries.
Returns:
``np.ndarray``:
Correlation matrix :math:`\rho` of shape ``(N, N)``.
Example:
.. code-block:: python3
>>> import numpy as np
>>> from spey.helper_functions import covariance_to_correlation
>>> cov = np.array([[4.0, 2.4], [2.4, 16.0]])
>>> covariance_to_correlation(cov)
array([[1. , 0.3],
[0.3, 1. ]])
"""
sigma_inv = np.diag(1.0 / np.sqrt(np.diag(covariance_matrix)))
return sigma_inv @ covariance_matrix @ sigma_inv