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
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]"
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,
-
ne semble pas marcher
-
Documenter le fait que les paramètre bins et weights de numpy.histogram ne sont pas supporté
-
éventuellement, référence à numpy.histogram
khisto.matplotlib.hist
Lien avec numpy.histogram
Par défaut, la density est False: density: bool = False,
Paramètre ax: Optional[Axes] = None
- je ne comprend l'usage de ce paramètre
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: ???
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
- ...
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
pip install "khisto[matplotlib]"
Pour l'apha-test, il faut passer par
Documentation
Installation
Changer
en
Features
Ajout de screenshot pour servir de teaser (exemples du quick start)
Quick Start
NumPy-like API
Update
max_bins=10est sans effetAdd
Ajout d'un exemple avec une distribution à queue lourde (point fort de l'approche)
Matplotlib Integration
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,ne semble pas marcher
Documenter le fait que les paramètre
binsetweightsde numpy.histogram ne sont pas supportééventuellement, référence à
numpy.histogramastropy.stats.histogram: https://docs.astropy.org/en/stable/api/astropy.stats.histogram.htmlkhisto.matplotlib.hist
Lien avec numpy.histogram
Par défaut, la density est False:
density: bool = False,Paramètre
ax: Optional[Axes] = Nonematplotlib.pyplot.hist: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist.htmlastropy.visualization.hist???: https://docs.astropy.org/en/stable/api/astropy.visualization.hist.htmlSimplifier la documentation
astropy.visualization.histx) ou spécifiques (max_bins)Paramètre
xmatplotlib.pyplot.hist: (n,) array or sequence of (n,) arraysastropy.visualization.hist: array_like, array of data to be histogrammedAccepter le paramètre
cumulative:matplotlib.pyplot.histetastropy.visualization.histmatplotlib.pyplot.histetastropy.visualization.histHow It Works
Rajouter des références bibliographiques en fin de section.
Test
Bug 1
densityest sans effetdensity=Trueet avecdensity=Falsetest_histogramBug 2
Parfois, de façon non reproductible, j'obtiens un histogramme avec un seul bin (que ce soit avec
histouhistogram).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
histogramont un seul bin.Effets de bord
Cf.
test_side_effectsLes effets de bord sont correctement gérés, notamment les ensemble vides et les valeurs manquantes.
Bizarrement, cela marche avec des tableaux de tableaux: ???
xRésultats détaillés:
Temps de calcul
Cf.
test_histogram_performancePour différentes tailles de Gaussienne, on a mesuré les temps suivant:
tofile)Bilan:
Globalement, c'est acceptable.
Piste d'optimisation
Eventuellement pour des prochaine versions (à discuter):
Passer par un format de données binaire: envisageable
Remplacer l'executable khisto par une DLL: non envisageable