Je trouve l’entropie extrêmement fascinante. Cependant, faire correspondre la formule à ses explications “intuitives” liées aux codes préfixes et au contenu informationnel n’est pas évident. Ici, je souhaite explorer quelques méthodes pour arriver indépendamment à cette notion.
Propriétés de l’information
Supposons que nous voulions définir une fonction , qui représente le contenu informationnel d’un événement. En faisant abstraction des spécificités de l’événement, une mesure que nous pourrions utiliser pour comparer un événement à un autre est leur probabilité d’occurrence. Ainsi, pourrait être une application d’une probabilité vers . Avec cette approche, les exigences suivantes sont raisonnables :
-
. Si un événement se produit certainement, il n’est pas très intéressant et nous apporte peu d’information.
-
doit être continue et monotoniquement décroissante sur . Un événement plus courant est moins informatif.
-
Deux événements indépendants de probabilités et doivent avoir une information
La dernière exigence est la plus révélatrice. Par définition, la probabilité que deux événements indépendants se produisent est . Donc
Puisque la fonction doit être continue, cela n’est vrai que pour
Si nous voulons que soit monotoniquement décroissante,
doit être négative. Comme est positif, doit être négatif. En posant
Puisque , où le dénominateur est une constante, nous pouvons considérer que encode la base du logarithme. Par commodité, nous posons et utilisons pour désigner le logarithme en base 2.
L’entropie est simplement l’espérance de , sur une distribution
Nous supposons également que , motivé par la continuité.
Par exemple, considérons la variable aléatoire de Bernoulli , qui prend la valeur avec probabilité , et avec probabilité . Si nous traçons son entropie
Code de tracé
import numpy as np
import plotly.graph_objects as go
# Function to calculate the entropy of a Bernoulli variable
def bernoulli_entropy(p):
return -p * np.log2(p) - (1 - p) * np.log2(1 - p)
# Generate values for p from 0 to 1
p_values = np.linspace(0.01, 0.99, 100)
entropy_values = bernoulli_entropy(p_values)
# Create the plot
fig = go.Figure()
# Add the entropy trace
fig.add_trace(go.Scatter(x=p_values, y=entropy_values, mode='lines', name='Entropy', line=dict(color='red')))
# Update layout for dark mode
fig.update_layout(
title='Entropy of a Bernoulli Random Variable',
xaxis_title='p',
yaxis_title='Entropy',
template='plotly_dark'
)
# Save the plot to an HTML file
fig.write_html("bernoulli_entropy_plot.html")
nous voyons qu’elle est maximisée lorsque la distribution est uniforme, et minimisée lorsqu’elle est presque déterministe.
Codes préfixes
Supposons que nous ayons un ensemble de symboles que nous souhaitons transmettre via un canal binaire. Nous construisons le canal de manière à pouvoir envoyer soit un , soit un à la fois. Nous voulons trouver un schéma d’encodage optimal pour , avec une condition : il doit être préfixe.
Définissons une fonction d’encodage , qui associe des symboles à des chaînes binaires de longueur . Nous disons qu’un encodage est préfixe si aucun mot de code n’est le préfixe d’un autre. Par exemple, n’est pas préfixe car est un préfixe de . En revanche, l’est.
Un code préfixe implique que le code est uniquement décodable sans délimiteurs supplémentaires entre les symboles, ce qui est une propriété souhaitable.
Nous remarquons également qu’un code binaire préfixe est uniquement défini par un arbre binaire :
où le chemin de la racine au symbole détermine le mot de code, et les symboles sont toujours des feuilles. Assurez-vous qu’une telle construction donne toujours un code préfixe.
Nous allons maintenant montrer que la longueur moyenne des mots de code de tout code préfixe sur est bornée par
où est une variable aléatoire prenant des valeurs dans l’ensemble avec des probabilités . Plus important encore, nous voyons que l’entropie de est une borne inférieure pour le degré de compression d’une distribution, ou de manière équivalente, la quantité d’information qu’elle contient.
L’inégalité de Kraft
Supposons que soit la longueur du ème mot de code. Si le code est sans préfixe :
Preuve :
Soit la longueur du mot de code le plus long. On remarque que :
- Il y a au plus nœuds au niveau
- Pour tout mot de code de longueur , il y a descendants au niveau .
- Les ensembles de descendants de chaque mot de code sont disjoints (puisqu’un mot de code n’est jamais un descendant d’un autre)
Cela implique
Pourquoi au lieu de l’égalité ? Parce qu’il est possible qu’un nœud au niveau ne soit le descendant d’aucun mot de code (considérez l’arbre du code ) !
Borne inférieure pour L
Considérons maintenant la longueur attendue d’un mot de code
Nous allons montrer que l’entropie est une borne inférieure pour , c’est-à-dire
Démonstration :
Où l’inégalité finale est due à 1) la divergence KL étant non négative et 2) à en raison de l’inégalité de Kraft. Une chose à noter est que si , alors , le minimum théorique. La raison pour laquelle nous ne pouvons pas toujours l’atteindre est que n’est pas nécessairement un entier, ce qui est évidemment requis.
Une borne supérieure pour L
Remarquez qu’il est possible de construire un code préfixe avec des longueurs
puisqu’elles satisfont l’inégalité de Kraft :
Par définition de la fonction plafond
En prenant l’espérance sur , on obtient
Cela montre que est une bonne borne supérieure pour L !
En résumé, l’entropie est une borne inférieure, et une estimation raisonnable, pour le nombre moyen de bits nécessaires pour encoder une distribution sous forme de code préfixe.
Références
- Cours Alon Orlitsky ECE 255A, UCSD
- Cover, T. M., & Thomas, J. A. (2006). Éléments de théorie de l’information. Wiley-Interscience.