Source code for dstk.visualization.statistique

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Fonctions ou classes utiles pour le la visualisation et l'analyse.

Created on Tue Apr 14 22:44:11 2020

@author: Cyrile Delestre
"""

from typing import Callable, Optional, NewType
from math import erf

import numpy as np

TypeCDF = NewType(
    'TypeCDF',
    Callable[[np.ndarray, Optional[float], Optional[float]], np.ndarray]
)

@np.vectorize
def cdf_normal(x: np.ndarray, mean: float=0, std: float=1):
    r"""
    Fonction vectorisée permettant de calculer la CDF de la loi Normale.
    
    Parameters
    ----------
    x : ndarray
        points d'évaluation de la CDF.
    mean : float
        moyenne
    std : float
        écart-type
    
    See also
    --------
    cdf_rayleigh, kolmogorov_smirnov_test
    """
    return 1/2*(1+erf((x-mean)/(std*np.sqrt(2))))

[docs]def cdf_rayleigh(x: np.ndarray, mean: float=1, std: None=None): r""" Fonction vectorisée permettant de calculer la CDF de la loi Rayleigh. Parameters ---------- x : ndarray points d'évaluation de la CDF. mean : float moyenne std : None pour être ISO avec la fonction :func:`~dstk.visualization.statistique.cdf_normal` (inutilisé). See also -------- cdf_normal, kolmogorov_smirnov_test """ if mean <= 0: raise AttributeError( "La moyenne de la loi de Rayleigh est strictement positive." ) x_ = np.zeros_like(x) filt = x >= 0 sig = mean*(np.pi/2)**2 x_[filt] = 1 - np.exp(-x[filt]**2/(2*sig**2)) return x_
[docs]def kolmogorov_smirnov_test(x: np.ndarray, cdf: TypeCDF, mean: Optional[float], std: Optional[float], **kargs): r""" Fonction permettant de calculer l'écart entre deux CDF du test de Kolmogorow-Smirnov. Parameters ---------- x : np.ndarray variable aléatoire suivant une loi inconnue. cdf : TypeCDF fonction de CDF continue. mean : Optional[float] moyenne estimée de la variable x. std : Optional[float] écrat-type estimé de la variable x. **kargs : arguments pour la fonction histogram de Numpy. Returns ------- Ecart de Kolmogorow-Smirnov. Notes ----- La fonction cdf doit avoir le format : cdf(x: np.array, mean: float, std: float) Les arguments mean et std sont juste des noms en référence à la loie normale, elles peuvent représentrer d'autres carastéristiques statistiques. Si la cdf à besoins de plus de 2 caractéristiques pour être calculé, cette fonction ne fonctionnera pas. .. todo:: Faire une méthode qui permettrait d'avoir autant de caractéristiques statistiques souhaité. (attention a RocAnalyser !) See also -------- cdf_normal, cdf_rayleigh """ if 'density' in kargs.keys(): del kargs['density'] hist, bin_edges = np.histogram(x, density=False, **kargs) cum_hist = np.cumsum(hist)/x.shape[0] theo = cdf(bin_edges[1:], mean=mean, std=std) return np.max(np.abs(theo-cum_hist))