Je trouve l’entropie extrêmement fascinante. Cependant, faire correspondre la formule à ses explications “intuitives” liées aux codes sans préfixe et au contenu informationnel n’est pas évident. Ici, je veux explorer quelques façons d’arriver indépendamment à cette idée.
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 ce cadre, les exigences suivantes sont raisonnables :
-
. Si un événement se produit certainement, il n’est pas très intéressant et nous donne peu d’information.
-
doit être continue et monotoniquement décroissante sur . Un événement plus commun est moins informatif.
-
Deux événements indépendants avec des probabilités et devraient 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 ne tient que pour
Si nous voulons que soit monotoniquement décroissante,
doit être négatif. Puisque est positif, doit être négatif. En posant
Puisque , où le dénominateur est une constante, nous pouvons considérer comme encodant la base du logarithme. Pour plus de commodité, nous laissons être 1, et nous laissons désigner le logarithme en base 2.
L’entropie est simplement la valeur attendue 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
# Fonction pour calculer l'entropie d'une variable de Bernoulli
def bernoulli_entropy(p):
return -p * np.log2(p) - (1 - p) * np.log2(1 - p)
# Générer des valeurs pour p de 0 à 1
p_values = np.linspace(0.01, 0.99, 100)
entropy_values = bernoulli_entropy(p_values)
# Créer le tracé
fig = go.Figure()
# Ajouter la trace de l'entropie
fig.add_trace(go.Scatter(x=p_values, y=entropy_values, mode='lines', name='Entropie', line=dict(color='red')))
# Mettre à jour la mise en page pour le mode sombre
fig.update_layout(
title='Entropie d\'une variable aléatoire de Bernoulli',
xaxis_title='p',
yaxis_title='Entropie',
template='plotly_dark'
)
# Sauvegarder le tracé dans un fichier HTML
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 sans préfixe
Supposons que nous ayons un ensemble de symboles que nous voulons transmettre sur un canal binaire. Nous construisons le canal de telle sorte que nous puissions envoyer soit un soit un à la fois. Nous voulons trouver un schéma de codage optimal pour , avec une exigence : il doit être sans préfixe.
Définissons une fonction de codage , qui mappe des symboles à des chaînes binaires de longueur . Nous disons qu’un codage est sans préfixe si aucun mot de code n’est un préfixe d’un autre. Par exemple, n’est pas sans préfixe car est un préfixe de . Cependant, l’est.
Un code sans préfixe implique que le code est décomposable de manière unique sans délimiteurs supplémentaires entre les symboles, ce qui est une propriété souhaitable.
Nous remarquons également qu’un code binaire sans 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. Convainquez-vous que toute construction de ce type résulte en un code sans préfixe.
Nous allons maintenant montrer que la longueur moyenne des mots de code de tout code sans préfixe sur est bornée par
où est une variable aléatoire qui prend des valeurs dans l’ensemble avec des probabilités . Plus important encore, nous voyons que l’entropie de est une borne inférieure pour la compression d’une distribution, ou de manière équivalente, pour la quantité d’information qu’elle contient.
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. Nous remarquons 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 pas un descendant d’aucun mot de code (considérez l’arbre du code ) !
Borne inférieure pour L
Considérons maintenant la longueur moyenne des mots de code
Nous allons montrer que l’entropie est une borne inférieure pour , ou
Preuve :
Où la dernière inégalité est due à 1) la divergence de KL étant non négative et 2) à en raison de l’inégalité de Kraft. Une chose à noter est que si , , le minimum théorique. La raison pour laquelle nous ne pouvons pas toujours atteindre ce minimum est que n’a pas besoin d’être un entier, ce qui est évidemment requis.
Une borne supérieure pour L
Remarquons qu’il est possible de construire un code sans préfixe avec des longueurs
puisqu’elles satisfont l’inégalité de Kraft :
Par la définition de la fonction plafond
En prenant l’espérance sur , nous obtenons
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 en tant que code sans préfixe.
Références
- Alon Orlitsky’s ECE 255A Lectures, UCSD
- Cover, T. M., & Thomas, J. A. (2006). Elements of Information Theory. Wiley-Interscience.