• Aucun résultat trouvé

Chapitre 4. Complexité de Kolmogorov

4.1. Historique et définition

Bien que la complexité de Kolmogorov (ou complexité algorithmique) soit nommée en l’honneur de A. N. Kolmogorov, mathématicien russe du 20e siècle, l’idée fut premièrement abordée en 1960 par R. J. Solomonoff, informaticien américain (en dépit de son nom !), dans ses travaux sur une théorie générale de l’inférence inductive [23] puis approfondie dans son article publié en 1964 [24] dans lequel il présente le concept de probabilité algorithmique. Son but était d’abord de bâtir une théorie générale du raisonnement inductif. Il introduit la complexité algorithmique seulement comme un concept auxiliaire pour arriver à définir une probabilité algorithmique. L’idée de Solomonoff s’inspire du rasoir d’Ockham (parmi toutes les explications cohérentes d’un phénomène étudié, choisir celle avec le moins de supposi- tions) et du principe des explications multiples d’Épicure (considérer toutes les explications cohérentes du phénomène étudié plutôt qu’en sélectionner une particulière). La probabilité algorithmique est une probabilité a priori (un poids) assignée aux différentes hypothèses pouvant expliquer un phénomène donné. Toute hypothèse cohérente reçoit une probabilité non nulle et à une hypothèse simple (peu de suppositions) est associée une plus grande pro- babilité. Ainsi, aucune hypothèse cohérente n’est rejetée (Épicure), mais les plus simples sont favorisées (Ockham).

D’un point de vue algorithmique, on représente une observation d’un phénomène par une chaîne de bits et sa description par un programme produisant cette chaîne en sortie. Ainsi,

on assigne un poids à chaque programme candidat – plus un programme est court, plus sa probabilité a priori est grande. La théorie générale de l’inférence inductive suggère alors de prédire la prochaine observation du même phénomène en se basant sur ces probabilités algorithmiques ; la probabilité d’une observation future est calculée à partir des probabilités assignées aux programmes décrivant les observations passées.

Indépendamment des travaux de Solomonoff, Kolmogorov développe un outil aux saveurs similaires à la théorie générale de l’inférence inductive ; la complexité algorithmique (ou de Kolmogorov). C’est dans son article publié en 1965 [17] qu’il définit la complexité d’un objet individuel fini comme la longueur de la plus courte description de cet objet (le plus court programme produisant cet objet) et présente cette complexité comme une mesure de l’aléa et de la quantité d’information contenue dans l’objet. Cette quantité permet une approche factuelle à la complexité : on s’intéresse à ce qui est, et non ce qui aurait pu être. La recherche d’une quantification de l’information contenue dans un objet qui repose strictement sur cet objet, et non à un ensemble d’objets auquel il pourrait appartenir, est l’une des motivations à adopter un point de vue factuel (plutôt que probabiliste à la Shannon).

Finalement, les travaux de G. J. Chaitin publiés en 1969 [10] portent eux aussi sur le concept de complexité algorithmique. De plus, il étudie le comportement de la complexité des chaînes aléatoires infinies. Chaitin se démarque cependant avec son article de 1975 [11] dans lequel il présente une variante à la complexité algorithmique appelée complexité préfixe ou complexité de Chaitin. La complexité préfixe d’un objet est définie comme la longueur du plus court programme auto-délimitant pouvant produire cet objet. La nouveauté est l’introduction du concept de programme auto-délimitant : aucun programme n’est préfixe d’un autre. Ceci permet entre autres de parler de la probabilité d’arrêt d’un programme aléatoire, quantité qu’il a appelée Ω.

Dans la suite de ce travail, c’est la première version de la complexité algorithmique (complexité de Kolmogorov ) qui est définie plus formellement et ensuite utilisée.

4.1.1. Cas des chaînes finies

Afin de définir la complexité de Kolmogorov d’une chaîne de bits de longueur finie (déf.4.1.2), il faut d’abord introduire la machine de Turing universelle. C’est dans un des plus importants articles d’A. M. Turing, publié en 1937, qu’il est prouvé que de telles machines existent [25].

Définition 4.1.1. Une machine de Turing est dite universelle si elle est capable de simuler toute autre machine de Turing.

Définition 4.1.2. Soit r ∈ {0, 1}∗ une chaîne de bits de longueur finie. La complexité de Kolmogorov de la chaîne r, notée KU(r), correspond à la longueur du plus court programme

informatique pouvant produire en sortie la chaîne r, lequel est donné en entrée à une machine de Turing universelle U .

Cette définition de complexité suggère de possibles fluctuations dans la valeur de KU(r).

Varie-t-elle selon le choix de la machine U utilisée ? En effet, une machine U peut être préférable à une machine U0 pour décrire une chaîne donnée, alors que cela serait vice versa pour une autre chaîne. C’est pour cette raison qu’en plus d’être universelle, la machine doit être additivement optimale.

Définition 4.1.3. Une machine de Turing universelle U est dite additivement optimale si pour toute machine de Turing universelle U0, il existe une constante cU ,U0 t.q. :

KU(x) ≤ KU0(x) + cU ,U0 ∀x

Heureusement, il est facile de prouver qu’il existe une machine de Turing universelle additivement optimale [18].

Théorème 4.1.1. Il existe une machine de Turing universelle additivement optimale.

Preuve. Soit une énumération calculable des machines de Turing universelles T1, T2, ... et

soit U une machine de Turing universelle, prenant une entrée de la forme : hn, P i = 11...1

| {z }

|n| f ois

0 nP .

Il faut voir cette entrée en deux parties : la première partie 11...1 0 n, où n est représenté sous forme binaire, définit quelle machine de Turing sera simulée (Tn) et la deuxième partie P est

le programme (représenté sous forme d’une chaîne de bits) qui doit être donné en entrée à la machine Tn. Ainsi, U (n, P ) = Tn(P ). On peut alors dire qu’il est possible de produire une

chaîne x à l’aide de la machine U en lui donnant en entrée hn, P i où n correspond à l’indice de la machine de Turing Tn pour laquelle il existe le plus court programme P produisant la

chaîne x. Finalement, ceci nous permet d’écrire :

KU(x) ≤ KTn(x) + cTn

avec cTn = 2|n| + 1. Ceci est vrai pour toute valeur de x, ce qui nous permet de conclure que

la machine U est additivement optimale. 

Le théorème4.1.1nous permet maintenant d’énoncer le théorème d’invariance, qui donne tout son sens à la complexité de Kolmogorov. Ce théorème a été prouvé indépendamment par Solomonoff en 1964 [24], par Kolmogorov en 1965 [17] et finalement par Chaitin en 1969 [10].

Théorème 4.1.2 (Théorème d’invariance). Soit U et U0 deux machines de Turing univer- selles additivement optimales. Alors,

|KU(x) − KU0(x)| ≤ ˜cU ,U0

où ˜cU ,U0 = max(cU ,U0, cU0,U).

Ce théorème dit qu’une méthode de description pour la chaîne x basée sur la machine universelle additivement optimale U offrira nécessairement la plus courte description de x et aucune autre méthode de description basée sur une machine universelle additivement optimale U0 ne pourra réduire la longueur de cette description par une quantité supérieure à une constante fixe. C’est pourquoi la complexité de Kolmogorov est un outil utile et intéressant. De plus, le théorème d’invariance nous permet de fixer une machine de Turing universelle additivement optimale comme étant la machine U de la définition 4.1.2. C’est pourquoi nous utiliserons dorénavant la notation K(r) plutôt que KU(r), puisque la la

Définition 4.1.4. La complexité1conditionnelle K(r|q), pour r ∈ {0, 1}net q ∈ {0, 1}m des

chaînes de longueur finie, est définie comme la longueur du plus court programme produisant la chaîne r lorsque la chaîne q lui est donnée en entrée.

4.1.2. Cas des chaînes infinies

Puisque le travail présenté au chapitre 5 porte entre autres sur l’étude de chaînes infinies, il est nécessaire de définir ce qu’est la complexité de Kolmogorov dans le cas de chaînes infinies.

Définition 4.1.5. Soit s = s1s2... une chaîne infinie de bits (si ∈ {0, 1} pour i = 1, 2, ...) et

s[n] = s1s2...sn les n premiers bits de s. La fonction

K(s) : N → N

n 7→ K(s[n])

définit la complexité de Kolmogorov d’une chaîne infinie de bits. Ainsi, K(s)(n) = K(s[n]).

Définition 4.1.6. La complexité conditionnelle K(s|t) pour des chaînes infinies s et t est définie pour toute valeur de n ∈ N par :

K(s|t)(n)def=K(s[n]|t[n]).

Il faut remarquer que la complexité conditionnelle dans le cas de chaînes infinies aurait pu être définie différemment. En effet, pourquoi ne pas utiliser K(s|t)(n) = K(s[n]|t) ? La

définition4.1.6est motivée par la règle de la chaîne, qui est introduite à la sous-section4.2.2.

Documents relatifs