Skip to content

Commit 5d2706f

Browse files
authored
Better mathematical expression (#52)
* Improve style * fix ext * fix ut * ext * fix * req * remove * req * fix ut * fix paths * Replace \R by \mathbb{R} * urls * nb * using github only * fix ut
1 parent 0558411 commit 5d2706f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+6120
-4122
lines changed

.circleci/config.yml

-77
This file was deleted.

.github/workflows/documentation.yml

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Documentation and Code Coverage
1+
name: Test, Documentation and Code Coverage
22

33
on:
44
push:
@@ -51,6 +51,9 @@ jobs:
5151
pytest --cov=./mlstatpy/ --cov-report=xml --durations=10 --ignore-glob=**LONG*.py --ignore-glob=**notebook*.py
5252
export PYTHONPATH=
5353
54+
- name: test notebooks
55+
run: python -m pytest _unittests/ut_xrun_doc/test_documentation_notebook.py --durations=10
56+
5457
- name: Upload coverage reports to Codecov
5558
uses: codecov/codecov-action@v3
5659
env:

.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
*.pyc
55
*.pyd
66
*.so
7+
*.gv
8+
*.gv.*
9+
*.jpg
710
.coverage
811
.eggs/*
912
_cache/*
@@ -31,3 +34,8 @@ _unittests/ut__main/*.html
3134
_unittests/.hypothesis/*
3235
_doc/notebooks/ml/*.onnx
3336
_doc/notebooks/dsgarden/*.onnx
37+
_doc/notebooks/nlp/frwiki-*
38+
_doc/notebooks/nlp/sample*.txt
39+
frwiki-*
40+
mobilenetv2-12.onnx
41+
sample1000.txt

_doc/c_algo/edit_distance.rst

+5-5
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ On peut définir la distance d'édition :
117117
.. math::
118118
119119
\begin{array}{crcl}
120-
d : & \mathcal{S}_\mathcal{C} \times \mathcal{S}_\mathcal{C} & \longrightarrow & \R^+\\
120+
d : & \mathcal{S}_\mathcal{C} \times \mathcal{S}_\mathcal{C} & \longrightarrow & \mathbb{R}^+\\
121121
& \pa{m_1,m_2} & \longrightarrow & \underset{ \begin{subarray} OO \text{ séquence} \\ \text{d'opérations} \end{subarray}}{ \min} \, d\pa{m_1,m_2,O}
122122
\end{array}
123123
@@ -140,7 +140,7 @@ Ce paragraphe a pour objectif de démontrer que la
140140

141141
Soit :math:`\mathcal{C}' = \mathcal{C} \bigcup \acc{.}`
142142
l'ensemble des caractères ajouté au caractère vide ``.``.
143-
On note :math:`c : \pa{\mathcal{C}'}^2 \longrightarrow \R^+`
143+
On note :math:`c : \pa{\mathcal{C}'}^2 \longrightarrow \mathbb{R}^+`
144144
la fonction coût définie comme suit :
145145

146146
.. math::
@@ -197,7 +197,7 @@ en utilisant les mots acceptables :
197197
198198
\begin{eqnarray}
199199
\begin{array}{crcl}
200-
d : & \mathcal{S}_\mathcal{C} \times \mathcal{S}_\mathcal{C} & \longrightarrow & \R^+\\
200+
d : & \mathcal{S}_\mathcal{C} \times \mathcal{S}_\mathcal{C} & \longrightarrow & \mathbb{R}^+\\
201201
& \pa{m_1,m_2} & \longrightarrow &
202202
\min \acc{ \sum_{i=1}^{+\infty} c\pa{M_1^i, M_2^i} |
203203
\pa{M_1,M_2} \in acc\pa{m_1} \times acc\pa{m_2}}
@@ -334,7 +334,7 @@ serait tenté de définir une nouvelle distance d'édition inspirée de la préc
334334
335335
\begin{eqnarray*}
336336
\begin{array}{crcl}
337-
d' : & \mathcal{S}_\mathcal{C} \times \mathcal{S}_\mathcal{C} & \longrightarrow & \R^+\\
337+
d' : & \mathcal{S}_\mathcal{C} \times \mathcal{S}_\mathcal{C} & \longrightarrow & \mathbb{R}^+\\
338338
& \pa{m_1,m_2} & \longrightarrow & d'\pa{m_1,m_2} = \dfrac{d^*\pa{m_1,m_2}}{ \max \acc {l\pa{m_1}, l\pa{m_2}}} \\ \\
339339
& & & \text{où } l\pa{m} \text{ est la longueur du mot } m
340340
\end{array}
@@ -604,7 +604,7 @@ par descente de gradient. Les coûts sont donc appris en deux étapes :
604604

605605
Dans cette étape, les coefficients :math:`\alpha_{ik}\pa{\Omega}`
606606
restent constants. Il suffit alors de minimiser la fonction
607-
dérivable :math:`E\pa{\Omega}` sur :math:`\R^n`, ceci peut être
607+
dérivable :math:`E\pa{\Omega}` sur :math:`\mathbb{R}^n`, ceci peut être
608608
effectué au moyen d'un algorithme de descente de gradient
609609
similaire à ceux utilisés pour les réseaux de neurones.
610610

_doc/c_clus/kmeans.rst

+16-16
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ critère appelé *inertie* ou variance *intra-classe*.
2929

3030
.. math::
3131
32-
\left(X_i\right)_{1\leqslant i\leqslant P}\in\left(\R^N\right)^P
32+
\left(X_i\right)_{1\leqslant i\leqslant P}\in\left(\mathbb{R}^N\right)^P
3333
3434
A chaque point est associée une classe :
3535
:math:`\left(c_i\right)_{1\leqslant i\leqslant P}\in\left\{1,...,C\right\}^P`.
3636
On définit les barycentres des classes :
37-
:math:`\left( G_i\right)_{1\leqslant i\leqslant C}\in\left(\R^N\right)^C`.
37+
:math:`\left( G_i\right)_{1\leqslant i\leqslant C}\in\left(\mathbb{R}^N\right)^C`.
3838

3939
*Initialisation*
4040

@@ -86,9 +86,9 @@ La démonstration du théorème nécessite le lemme suivant.
8686
:tag: Lemme
8787
:lid: lemme_inertie_minimum
8888

89-
Soit :math:`\vecteur{X_1}{X_P} \in \pa{\R^N}^P`,
90-
:math:`P` points de :math:`\R^N`, le minimum de la quantité
91-
:math:`Q\pa{Y \in \R^N}` :
89+
Soit :math:`\vecteur{X_1}{X_P} \in \pa{\mathbb{R}^N}^P`,
90+
:math:`P` points de :math:`\mathbb{R}^N`, le minimum de la quantité
91+
:math:`Q\pa{Y \in \mathbb{R}^N}` :
9292

9393
.. math::
9494
:nowrap:
@@ -100,16 +100,16 @@ La démonstration du théorème nécessite le lemme suivant.
100100
est atteint pour :math:`Y=G=\dfrac{1}{P} \sum_{i=1}^{P} X_i`
101101
le barycentre des points :math:`\vecteur{X_1}{X_P}`.
102102

103-
Soit :math:`\vecteur{X_1}{X_P} \in \pa{\R^N}^P`,
104-
:math:`P` points de :math:`\R^N`.
103+
Soit :math:`\vecteur{X_1}{X_P} \in \pa{\mathbb{R}^N}^P`,
104+
:math:`P` points de :math:`\mathbb{R}^N`.
105105

106106
.. math::
107107
:nowrap:
108108
109109
\begin{eqnarray*}
110110
\sum_{i=1}^{P} \overrightarrow{GX_{i}} = \overrightarrow{0}
111111
&\Longrightarrow& \sum_{i=1}^{P} d^2\pa{X_i,Y} = \sum_{i=1}^{P} d^2\pa{X_i,G}+ P \, d^2\pa{G,Y} \\
112-
&\Longrightarrow& \underset{Y\in\R^N}{\arg\min} \; \sum_{i=1}^{P} d^2\pa{X_i,Y} = \acc{G}
112+
&\Longrightarrow& \underset{Y\in\mathbb{R}^N}{\arg\min} \; \sum_{i=1}^{P} d^2\pa{X_i,Y} = \acc{G}
113113
\end{eqnarray*}
114114
115115
On peut maintenant démontrer le théorème.
@@ -166,7 +166,7 @@ Homogénéité des dimensions
166166
++++++++++++++++++++++++++
167167

168168
Les coordonnées des points
169-
:math:`\left(X_i\right) \in \R^N` sont généralement non homogènes :
169+
:math:`\left(X_i\right) \in \mathbb{R}^N` sont généralement non homogènes :
170170
les ordres de grandeurs de chaque dimension sont différents.
171171
C'est pourquoi il est conseillé de centrer et normaliser chaque dimension.
172172
On note : :math:`\forall i \in \intervalle{1}{P}, \; X_i = \vecteur{X_{i,1}}{X_{i,N}}` :
@@ -225,7 +225,7 @@ par la suivante :
225225

226226
.. math::
227227
228-
X=\left(X_i\right)_{1\leqslant i\leqslant P}\in\left(\R^N\right)^P
228+
X=\left(X_i\right)_{1\leqslant i\leqslant P}\in\left(\mathbb{R}^N\right)^P
229229
230230
A chaque point est associée une classe :
231231
:math:`\left(c_i\right)_{1\leqslant i\leqslant P}\in\left\{1,...,C\right\}^P`.
@@ -279,7 +279,7 @@ que :ref:`l-kmeanspp` mais plus rapide et parallélisable.
279279

280280
.. math::
281281
282-
X=\left(X_i\right)_{1\leqslant i\leqslant P}\in\left(\R^N\right)^P
282+
X=\left(X_i\right)_{1\leqslant i\leqslant P}\in\left(\mathbb{R}^N\right)^P
283283
284284
A chaque point est associée une classe :
285285
:math:`\left(c_i\right)_{1\leqslant i\leqslant P}\in\left\{1,...,C\right\}^P`.
@@ -429,7 +429,7 @@ Maxima de la fonction densité
429429
L'article [Herbin2001]_ propose une méthode différente pour estimer
430430
le nombre de classes, il s'agit tout d'abord d'estimer la fonction
431431
densité du nuage de points qui est une fonction de
432-
:math:`\R^n \longrightarrow \R`. Cette estimation est effectuée au moyen
432+
:math:`\mathbb{R}^n \longrightarrow \mathbb{R}`. Cette estimation est effectuée au moyen
433433
d'une méthode non paramètrique telle que les estimateurs à noyau
434434
(voir [Silverman1986]_)
435435
Soit :math:`\vecteur{X_1}{X_N}` un nuage de points inclus dans une image,
@@ -451,15 +451,15 @@ d'image qui ne peut pas être résolu par la méthode des nuées
451451
dynamiques puisque la forme des classes n'est pas convexe,
452452
ainsi que le montre la figure suivante. La fonction de densité
453453
:math:`f` est seuillée de manière à obtenir une fonction
454-
:math:`g : \R^n \longrightarrow \acc{0,1}` définie par :
454+
:math:`g : \mathbb{R}^n \longrightarrow \acc{0,1}` définie par :
455455

456456
.. math::
457457
458458
g \pa{x} = \indicatrice{f\pa{x} \supegal s}
459459
460460
.. index:: composante connexe
461461

462-
L'ensemble :math:`g^{-1}\pa{\acc{1}} \subset \R^n`
462+
L'ensemble :math:`g^{-1}\pa{\acc{1}} \subset \mathbb{R}^n`
463463
est composée de :math:`N` composantes connexes notées
464464
:math:`\vecteur{C_1}{C_N}`, la classe d'un point :math:`x`
465465
est alors l'indice de la composante connexe à la
@@ -499,7 +499,7 @@ L'inertie de ce nuage de points est définie par :
499499
I = \sum_{x \in X} \; \norme{ x - y_{C\pa{x} }}^2
500500
501501
On définit tout d'abord une distance
502-
:math:`\alpha \in \R^+`, puis l'ensemble
502+
:math:`\alpha \in \mathbb{R}^+`, puis l'ensemble
503503
:math:`V\pa{y,\alpha} = \acc{ z \in Y \sac d\pa{y,z} \infegal \alpha }`,
504504
:math:`V\pa{y,\alpha}` est donc l'ensemble des voisins des
505505
centres dont la distance avec :math:`y` est inférieur à :math:`\alpha`.
@@ -877,7 +877,7 @@ lors de l'estimation des centres des classes, l'algorithme évite la formation d
877877
Soit un nuage de points :math:`\vecteur{X_1}{X_N}`,
878878
soit :math:`C` vecteurs :math:`\vecteur{\omega_1}{\omega_C}`
879879
initialisés de manière aléatoires.
880-
Soit :math:`F : \pa{u,t} \in \R^2 \longrightarrow \R^+`
880+
Soit :math:`F : \pa{u,t} \in \mathbb{R}^2 \longrightarrow \mathbb{R}^+`
881881
croissante par rapport à :math:`u`.
882882
Soit une suite de réels :math:`\vecteur{u_1}{u_C}`,
883883
soit une suite :math:`\epsilon\pa{t} \in \cro{0,1}` décroissante où :math:`t`

_doc/c_clus/kohonen.rst

+6-5
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ linéaire, rectangulaire, triangulaire.
3535
:tag: Algorithme
3636
:lid: classification_som_algo
3737

38-
Soient :math:`\vecteur{\mu_1^t}{\mu_N^t} \in \pa{\R^n}^N`
39-
des neurones de l'espace vectoriel :math:`\R^n`. On
38+
Soient :math:`\vecteur{\mu_1^t}{\mu_N^t} \in \pa{\mathbb{R}^n}^N`
39+
des neurones de l'espace vectoriel :math:`\mathbb{R}^n`. On
4040
désigne par :math:`V\pa{\mu_j}` l'ensemble des neurones
4141
voisins de :math:`\mu_j` pour cette carte de Kohonen.
4242
Par définition, on a :math:`\mu_j \in V\pa{\mu_j}`.
43-
Soit :math:`\vecteur{X_1}{X_K} \in \pa{\R^n}^K` un nuage de points.
43+
Soit :math:`\vecteur{X_1}{X_K} \in \pa{\mathbb{R}^n}^K` un nuage de points.
4444
On utilise une suite de réels positifs
4545
:math:`\pa{\alpha_t}` vérifiant
4646
:math:`\sum_{t \supegal 0} \alpha_t^2 < \infty` et
@@ -49,7 +49,7 @@ linéaire, rectangulaire, triangulaire.
4949
*initialisation*
5050

5151
Les neurones :math:`\vecteur{\mu_1^0}{\mu_N^0}`
52-
sont répartis dans l'espace :math:`\R^n`
52+
sont répartis dans l'espace :math:`\mathbb{R}^n`
5353
de manière régulière selon la forme de leur voisinage.
5454
:math:`t \longleftarrow 0`.
5555

@@ -202,7 +202,8 @@ Autres utilisation des cartes de Kohenen
202202
On peut les utiliser pour déterminer le plus court
203203
chemin passant par tous les noeuds d'un graphe,
204204
c'est à dire appliquer
205-
`Kohonen au problème du voyageur de commerce <http://www.xavierdupre.fr/app/ensae_teaching_cs/helpsphinx/specials/tsp_kohonen.html>`_.
205+
`Kohonen au problème du voyageur de commerce
206+
<https://sdpython.github.io/doc/teachpyx/dev/c_expose/tsp/tsp_kohonen.html>`_.
206207

207208
Bibliographie
208209
=============

_doc/c_metric/roc.rst

+6-7
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,12 @@ La courbe ROC s'obtient en faisant varier :math:`s`.
9090
On suppose également que tous les scores sont indépendants.
9191
On note :math:`F_Y` et :math:`F_X` les fonctions de répartition de ces variables.
9292
:math:`F_Y(s)=\pr{Y \infegal s}` et :math:`F_X(s)=\pr{X \infegal s}`.
93-
On définit en fonction d'un seuil :math:`s \in \R` :
93+
On définit en fonction d'un seuil :math:`s \in \mathbb{R}` :
9494

9595
* :math:`R(s) = 1 - F_Y(s) = \pr{Y > s}`
9696
* :math:`E(s) = 1 - F_X(s) = \pr{X > s}`
9797

98-
La courbe ROC est le graphe :math:`\pa{E(s),R(s)}` lorsque :math:`s` varie dans :math:`\R`.
98+
La courbe ROC est le graphe :math:`\pa{E(s),R(s)}` lorsque :math:`s` varie dans :math:`\mathbb{R}`.
9999

100100
:math:`TP(s)` désigne les true positifs au-dessus du seuil :math:`s`,
101101
avec les notations *TP*, *FP*, *FN*, *TN*, cela revient à :
@@ -181,7 +181,7 @@ De plus, soit :math:`g` une fonction intégrable quelconque, on pose :math:`u =
181181

182182
.. math::
183183
184-
\int_{\R} g(x) \, f(x) \,dx = \int_{\cro{0,1}} g(F^{-1}(u)) \, du
184+
\int_{\mathbb{R}} g(x) \, f(x) \,dx = \int_{\cro{0,1}} g(F^{-1}(u)) \, du
185185
186186
**Démonstration**
187187

@@ -337,7 +337,7 @@ est construite une courbe ROC (voir :ref:`Courbe ROC <def_roc_2>`).
337337
:lid: algo_courb_ROC
338338

339339
On suppose qu'on dispose d'un ensemble de points :math:`\pa{X_i,\theta_i}
340-
\in \R \times \acc{0,1}` pour :math:`i \in \ensemble{1}{n}`.
340+
\in \mathbb{R} \times \acc{0,1}` pour :math:`i \in \ensemble{1}{n}`.
341341
`X_i` est le score obtenu pour l'expérience :math:`i`,
342342
`\theta_i` vaut 1 si elle a réussi et 0 si elle a échoué.
343343
On suppose également que cette liste est triée par ordre croissant :
@@ -405,7 +405,7 @@ On s'inspire pour cela des méthodes de `bootstrap <https://fr.wikipedia.org/wik
405405
:lid: roc_boostrap_algo
406406

407407
On dispose toujours du nuage de points
408-
:math:`E = \pa{X_i,\theta_i} \in \R \times \acc{0,1}` avec :math:`i \in \ensemble{1}{n}`.
408+
:math:`E = \pa{X_i,\theta_i} \in \mathbb{R} \times \acc{0,1}` avec :math:`i \in \ensemble{1}{n}`.
409409
On choisit :math:`C \in \N` le nombre de courbes ROC qu'on désire tracer.
410410
Pour chaque courbe :math:`c \in \ensemble{1}{C}` :
411411

@@ -614,8 +614,7 @@ Le premier cas correspond par exemple à des problèmes de
614614
`détection de fraude <https://en.wikipedia.org/wiki/Predictive_analytics#Fraud_detection>`_.
615615
Le second cas correspond à taux de classification global. La courbe ROC
616616
pour ce cas est en règle général moins bonne que la plupart des
617-
courbes ROC obtenues pour chacune des classes prise séparément
618-
(voir `Régression logistique <http://www.xavierdupre.fr/app/papierstat/helpsphinx/notebooks/wines_color.html>`_).
617+
courbes ROC obtenues pour chacune des classes prise séparément.
619618

620619
Exemple
621620
=======

_doc/c_ml/index_reg_lin.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ est le modèle prédictif le plus simple et celui qu'on préfère
1010
quand il marche car il est facilement interprétable à l'inverse
1111
des modèles non linéaires qui gardent leurs secrets si on s'en tient
1212
seulement à leurs coefficients. Concrètement, on dispose d'un nuage
13-
de point :math:`(X_i, y_i)` où :math:`X_i \in \R^d` est un vecteur
14-
de dimension *d* et :math:`y_i \in \R` un réel. La régression
13+
de point :math:`(X_i, y_i)` où :math:`X_i \in \mathbb{R}^d` est un vecteur
14+
de dimension *d* et :math:`y_i \in \mathbb{R}` un réel. La régression
1515
linéaire consiste à construire une fonction prédictive
1616
:math:`\hat{y_i} = f(X_i) = <X_i, \beta> = X_i \beta` où
1717
:math:`\beta` est un vecteur de dimension *d*. Dans le cas le plus

_doc/c_ml/index_reg_log.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ est le modèle prédictif le plus simple et celui qu'on préfère
1010
quand il marche car il est facilement interprétable à l'inverse
1111
des modèles non linéaires qui gardent leurs secrets si on s'en tient
1212
seulement à leurs coefficients. Concrètement, on dispose d'un nuage
13-
de point :math:`(X_i, y_i)` où :math:`X_i \in \R^d` est un vecteur
13+
de point :math:`(X_i, y_i)` où :math:`X_i \in \mathbb{R}^d` est un vecteur
1414
de dimension *d* et :math:`y_i \in \acc{0, 1}` un entier binaire.
1515
Le problème de la régression linéaire consiste à
1616
construire une fonction prédictive
1717
:math:`\hat{y_i} = f(X_i) = <X_i, \beta> = X_i \beta` où
1818
:math:`\beta` est un vecteur de dimension *d*
1919
(voir `classification
20-
<http://www.xavierdupre.fr/app/papierstat/helpsphinx/lectures/regclass.html#classification>`_).
20+
<https://sdpython.github.io/doc/teachpyx/dev/c_ml/regclass.html>`_).
2121
Le signe de la fonction :math:`f(X_i)`
2222
indique la classe de l'observation :math:`X_i` et la valeur
2323
:math:`\frac{1}{1 + e^{f(X)}}` la probabilité d'être dans la classe 1.

0 commit comments

Comments
 (0)