• Aucun résultat trouvé

Conclusion sur la métagénomique

2.3 différentes structures de données

2.3.5 Filtre de bloom

Le filtre de bloom est une structure de données probabiliste, et non exacte. Elle peut ainsi retourner une réponse fausse. Il est important de définir les termes de vrai positif, faux positif, vrai négatif et faux négatif avant d’analyser cette structure. La figure11représente ces notions.

a. vrai positif : une séquence identifiée (positif) à raison (vrai) par un algorithme dans un ensemble de séquence est appelée un vrai positif, il est noté vp.

b. faux positif : une séquence identifiée (positif) à tord (faux) par un algorithme dans un ensemble de séquence est appelée un faux positif, il est noté fp.

c. vrai négatif : une séquence non-identifiée (négatif) à raison (vrai) par un algorithme dans un ensemble de séquence est appelée un vrai négatif, il est noté vn.

d. faux négatif : une séquence non-identifiée (négatif) à tord (faux) par un algorithme dans un ensemble de séquence est appelée un faux négatif, il est noté fn.

2.3 différentes structures de données 43

Figure 11: Représentation des notions de vrai positif, faux positif, vrai négatif et faux négatif sur un algo- rithme cherchant à identifier les éléments communs à deux ensembles. Les éléments com- muns aux deux ensemble A et B sont les éléments à détecter et sont représentés sous un fond bleu, à l’intersection de A et B. Les éléments non-communs aux deux ensemble A et B sont représentés sous un fond blanc.

Les éléments communs identifiés à raison par un algorithme sont les vrai positifs (vp) et les éléments communs qui ne sont pas identifiés sont des faux négatifs (fn), représentés par des vagues horizontales rouges. Les éléments non-communs et non-identifiés par l’algo- rithme sont les vrai négatifs (vn). L’algorithme peut identifier à tord certains des éléments non-communs : ce sont les faux positifs (fp), représentés par des vagues verticales orange. L’ensemble détecté, entouré en orange, comporte les vrai positifs et les faux positifs. Le filtre de bloom est très comparable à une table de hachage. La différence principale est qu’il n’y a aucune gestion des collisions [127]. De plus, le filtre de bloom utilise plusieurs fonctions de hachage mais ne stocke pas d’information : seul un booléen est présent dans chaque case. Cette structure a été créée pour tester l’appartenance d’un élément à un ensemble. Les filtres de bloom ont été récemment utilisés en bio-informatique, par exemple dans la problématique de l’assemblage [134] où il a été possible de procéder à un assemblage métagénomique de novo en utilisant 30 fois moins de mémoire que classiquement.

Le filtre de Bloom consiste en un tableau de q bits, tous initialisés à 0, et h fonctions de hachage. Chaque fonction de hachage permet d’attribuer à un élément une unique position dans le tableau. Ainsi, chaque élément est codé par h positions dans le tableau de bits.

Pour insérer un élément dans le filtre, on le hache avec h fonctions de hachage différentes. Chaque code de hachage correspond à une unique position dans le tableau et le bit à cette position est mis à 1, quelle que soit sa valeur précédente. Pour tester la présence d’un élément dans le filtre de Bloom, on commence par le hacher avec les mêmes h fonctions de hachage que précédemment. On contrôle la valeur des bits ciblés par ces codes de hachage. Si tous les bits sont à 1, on estime que l’élément est présent dans l’ensemble indexé. Si au moins un des bits est à 0, on est certain que l’élément ne se trouve pas dans l’index (voir fig.12).

Cette structure est probabiliste, c’est-à-dire elle génère des faux positifs. La requête de pré- sence d’un élément dans un ensemble retourne soit “l’élément est probablement présent dans l’ensemble”, soit “il est sûr que l’élément n’est pas dans l’ensemble”. À l’inverse d’une table de hachage, les collisions ne sont pas résolues. Dès lors, le code de hachage d’un élément à rechercher peut être identique au code de hachage d’un élément différent mais effectivement indexé. Un faux positif correspond à un élément non présent dans le filtre mais où ses h bits sont à 1 : le filtre répondra donc, à tord, que l’élément existe.

Par contre, si un élément est bien dans le jeu indexé, tous les bits correspondant dans le filtre seront à 1. Si on recherche cet élément, on ne peut pas trouver un des bits à 0 et il est

Figure 12: Représentation d’un filtre de Bloom utilisant h=2 fonctions de hachage. L’élément ttg est retrouvé à tord : c’est un faux positif.

donc identifié comme présent : tous les vrai positifs sont identifiés comme positifs. De même, si un élément est identifié comme absent de l’ensemble par le filtre de bloom, il est certain que cet élément n’en fait pas partie : les faux négatifs ne sont pas possibles.

Le filtre de bloom retourne une mauvaise réponse avec une probabilité non nulle. La mesure de cette probabilité est appelée taux de faux positifs. Une approximation asymptotique de ce taux de faux positif est 0.6185q/n, pour n éléments insérés dans le tableau de taille q et

(ln 2· (q/n))fonctions de hachage utilisées [135].

Les filtres de bloom sont un bon moyen pour stocker efficacement de l’information. Broder et Mitzenmacher [135] ont montré qu’il suffit de(n log2e·log2(1/#))bits pour permettre une

requête de présence / absence parmi n éléments, avec un taux de faux positifs égal à #. La taille des éléments à indexer n’a pas d’impact sur la taille mémoire utilisée. Ainsi, pour indexer 30 millions de séquences, avec un taux de faux positif de 0,1%, il suffit de 51,42 mo.

Il est important de noter que cette structure ne permet pas de retrouver les éléments indexés à partir du filtre. Il est seulement possible de savoir, avec une probabilité p, si un élément donné y a été indexé. De plus, comme les fonctions de hachage peuvent générer des collisions, un bit peut servir pour plusieurs éléments différents : il n’est donc pas possible d’enlever un élément du filtre sans risquer d’enlever d’autres éléments. Cette structure est plus légère en mémoire que les autres structures présentées ici. La complexité en temps de l’indexation d’un élément et de la recherche d’un élément sont O(hm), où h est le nombre de fonctions

de hachages utilisées dans le filtre de bloom et m la taille des éléments. Cette complexité est indépendante du nombre d’éléments déjà indexés dans la structure.