Skip to content

Feedback from alpha-test #9

@marcboulle

Description

@marcboulle

Khisto alpha test

Programme test développé temporairement pour l'alpha-test:
test_khisto.py

Installation

Temporairement le temps de l'apha-test

notes personnelles: ignorer cette partie des retours

pip install khisto

  • Renvoie une erreur
ERROR: Could not find a version that satisfies the requirement khisto[matplotlib] (from versions: none)
ERROR: No matching distribution found for khisto[matplotlib]

pip install "khisto[matplotlib]"

  • Idem

Pour l'apha-test, il faut passer par

pip install --index-url https://test.pypi.org/simple/ khisto
pip install --index-url https://test.pypi.org/simple/ khisto[matplotlib]

Documentation

Installation

Changer

pip install "khisto[matplotlib]"

en

pip install khisto[matplotlib]

Features

Ajout de screenshot pour servir de teaser (exemples du quick start)

  • Gaussian: distribution standard
  • Pareto: distribution à queue lourde

Quick Start

NumPy-like API

Update

# Generate Gaussian data
data = np.random.normal(0, 1, 10000)
  • spécialiser le commentaire
  • passer à une taille de 10000
    • pas d'overhead significatif en temps
    • permet d'avoir un histogramme assez fin
    • sinon, le paramètre max_bins=10 est sans effet

Add

Ajout d'un exemple avec une distribution à queue lourde (point fort de l'approche)

# Generate long-tail data with Pareto distribution
shape = 3
long_tail_data = np.random.pareto(shape, size=10000) + 1

# Create optimal histogram plot for long tail distribution,  with logarithmic scales
n, bins, patches = hist(long_tail_data)
plt.xscale('log')
plt.yscale('log')
plt.show()

Matplotlib Integration

# Generate Gaussian data
data = np.random.normal(0, 1, 10000)
  • manque le commentaire
  • passer à une taille de 10000
    • pas d'overhead significatif en temps
    • permet d'avoir un histogramme plus fin, joli à visualizer

Recommander de visualiser avec les densités

API Reference

khisto.histogram

Lien avec numpy.histogram

Par défaut, la density est False: density: bool = False,

khisto.matplotlib.hist

Lien avec numpy.histogram

Par défaut, la density est False: density: bool = False,

  • ne semble pas marcher

Paramètre ax: Optional[Axes] = None

Simplifier la documentation

  • s'inpirer de astropy.visualization.hist
  • uniquement paramètres obligatoires (x) ou spécifiques (max_bins)
  • tous les autres en kwargs

Paramètre x

  • dans matplotlib.pyplot.hist: (n,) array or sequence of (n,) arrays
  • dans astropy.visualization.hist: array_like, array of data to be histogrammed
  • dans khisto, On accepte une sequence de tableaux, ou non ?
    • apparemment ça marche
    • contrairement à la doc
    # On accepte une séquence de tableaux, ou non???
    data1 = np.random.normal(0, 1, 1000)
    data2 = np.random.normal(2, 1.5, 1000)
    data3 = np.random.normal(-2, 0.5, 1000)
    plt.clf()
    n, bins, patches = hist([data1, data2, data3])
    plt.show()

Accepter le paramètre cumulative:

  • comme dans matplotlib.pyplot.hist et astropy.visualization.hist
    • il ne parait pas difficile d'obtenir le même comportement
    • attention au cas density à True ou False
    • bien spécifier le comportement attendu (contenu des vecteurs retourné et affichage effectué), selon celui de matplotlib.pyplot.hist et astropy.visualization.hist

How It Works

Rajouter des références bibliographiques en fin de section.

The method implemented in Khiops is comprehensively detailed in [2] and further extended in [1].

- [1] M. Boullé. Floating-point histograms for exploratory analysis of large scale real-world data sets. Intelligent Data Analysis, 28(5):1347-1394, 2024
- [2] V. Zelaya Mendizábal, M. Boullé, F. Rossi. Fast and fully-automated histograms for large-scale data sets. Computational Statistics & Data Analysis, 180:0-0, 2023

Test

Bug 1

density, bin_edges = histogram(data, density=True)
  • le paramètre density est sans effet
  • même résultats obtenus sans le paramètre, avec density=True et avec density=False
  • cf. test_histogram

Bug 2

Parfois, de façon non reproductible, j'obtiens un histogramme avec un seul bin (que ce soit avec histou histogram).

En relançant le programme plusieurs fois de suite (éventuellement apres de micro-changement), on arrive reproduire le bug assez souvent.

Ci-dessous avec 10000 points, les premiers résultats de histogram ont un seul bin.

Histogram (frequency)
[10000.]
[-3.52734375  3.93359375]
Histogram (density)
[10000.]
[-3.52734375  3.93359375]
Histogram (max bins)
[  19.  203. 1347. 6790. 1418.  211.   12.]
[-3.52734375 -3.         -2.         -1.          1.          2.
  3.          3.93359375]
Histogram (range)
[  58.  292.  340.  802.  971. 4475. 1450.  640.  319.  208.]
[-2.      -1.875   -1.5625  -1.3125  -0.9375  -0.59375  0.59375  1.09375
  1.4375   1.71875  2.     ]

Effets de bord

Cf. test_side_effects

Les effets de bord sont correctement gérés, notamment les ensemble vides et les valeurs manquantes.

Bizarrement, cela marche avec des tableaux de tableaux: ???

  • cf. doc du paramètre x

Résultats détaillés:

Histogram []
An error occurred while computing the histogram: Input array is empty after filtering
Histogram [0]
[1.]
[-9.31322575e-10  0.00000000e+00]
Histogram [0, 0]
[2.]
[-9.31322575e-10  0.00000000e+00]
Histogram [0, 1]
[2.]
[-0.5  1. ]
Histogram [nan]
An error occurred while computing the histogram: Input array is empty after filtering
Histogram [0, nan]
[1.]
[-9.31322575e-10  0.00000000e+00]
Histogram ['a']
An error occurred while computing the histogram: could not convert string to float: 'a'
Histogram [[0]]
[1.]
[-9.31322575e-10  0.00000000e+00]
Histogram [[0], [1]]
[2.]
[-0.5  1. ]
Histogram [[[0]]]
[1.]
[-9.31322575e-10  0.00000000e+00]

Temps de calcul

Cf. test_histogram_performance

Pour différentes tailles de Gaussienne, on a mesuré les temps suivant:

  • Text write time: temps d'écriture des données au format texte
  • Binary write time: temp d'écriture au format binaire (vi méthode tofile)
  • Histogram process time: temps global de calcul de l'histogramme
    • stockage des données au format texte
    • appel de l'executable khisto
    • optimisation pour calculer l'histogramme
    • lecture des résultats
Size Text write time Binary write time Histogram process time
100 0.0008 0.0004 0.1176
1000 0.0016 0.0003 0.0797
10000 0.0135 0.0004 0.1158
100000 0.1303 0.0008 0.3671
1000000 1.2604 0.0030 2.4699

Bilan:

  • il y a un overhead quasiment d'un facteur 2, en passant par un fichier texte intermédiaire
  • il y a un probablement un overhead d'environ 0.05 lié au lancement de l'exécutable

Globalement, c'est acceptable.

Piste d'optimisation

Eventuellement pour des prochaine versions (à discuter):

Passer par un format de données binaire: envisageable

  • ajout d'une option dans l’exécutable khisto pour lire des données au format binaire
    • gain de temps important escompté: au moins un facteur 2
    • pas très cher à implémenter
    • pas de problème d'endianness si on reste sur la même machine

Remplacer l'executable khisto par une DLL: non envisageable

  • coût d'implémentation plus important
    • gain de temps important escompté: faible overhead, de l'ordre de 0.05 s
    • perte de l'indépendance des contextes d'exécution entre python et khisto
      • mémoire partagée
      • le crash de khisto entraine le crash de python
      • le code de khisto n'est pas ré-entrant, ce qui interdit le multi-threading
      • ...

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions