Sur cs.stackexchange, j'ai posé des questions sur la bibliothèque d' algebird scala sur github, spéculant sur les raisons pour lesquelles ils pourraient avoir besoin d'un paquet d'algèbre abstrait.
La page github contient quelques indices:
Implémentations de Monoids pour des algorithmes d'approximation intéressants, tels que le filtre Bloom, HyperLogLog et CountMinSketch. Ceux-ci vous permettent de penser à ces opérations sophistiquées comme vous le feriez avec des chiffres, et de les additionner en hadoop ou en ligne pour produire des statistiques et des analyses puissantes.
et dans une autre partie de la page GitHub:
Il a été initialement développé dans le cadre de l'API Matrix de Scalding, où les matrices avaient des valeurs qui sont des éléments de monoïdes, de groupes ou d'anneaux. Par la suite, il était clair que le code avait une application plus large au sein de Scalding et sur d'autres projets au sein de Twitter.
Même Oskar Boykin de Twitter a sonné:
La réponse principale est qu'en exploitant la structure semi-groupe, nous pouvons construire des systèmes qui se parallélisent correctement sans connaître l'opération sous-jacente (l'utilisateur promet l'associativité).
En utilisant des Monoïdes, nous pouvons profiter de la rareté (nous avons affaire à beaucoup de matrices clairsemées, où presque toutes les valeurs sont nulles dans certains Monoïdes).
En utilisant des anneaux, nous pouvons faire une multiplication matricielle sur des choses autres que des nombres (ce que nous avons parfois fait).
Le projet algebird lui-même (ainsi que l'historique des problèmes) explique assez clairement ce qui se passe ici: nous construisons beaucoup d'algorithmes pour l'agrégation de grands ensembles de données, et tirer parti de la structure des opérations nous donne une victoire du côté des systèmes (ce qui est généralement le point douloureux lorsque l'on tente de produire des algorithmes sur des milliers de nœuds).
Résolvez les problèmes de systèmes une fois pour tout Semigroup / Monoïde / Groupe / Anneau, et ensuite vous pouvez brancher n'importe quel algorithme sans avoir à penser à Memcache, Hadoop, Storm, etc ...
Comment sont Bloom filters
/ hyperloglog
/ countminsketch
comme les nombres?
Comment se fait-il que les agrégations de bases de données aient une structure monoïdale?
À quoi ressemble ce monoïde? Ont-ils jamais une structure de groupe?
Des références bibliographiques seraient utiles.
la source
Réponses:
Vous demandez pourquoi les agrégations de bases de données ont une structure monoïdale.
Supposons que nous voulons combiner les valeurs de données et , mais que les choses restent générales - il peut s'agir d'entiers, de chaînes, de nombres à virgule flottante, de vecteurs, de matrices, de distributions de probabilités, d'ensembles ou de tout autre élément que nous voulons stocker et manipuler. Nous désignons donc "l'agrégation" de et par .une b une b a.b
L'opérationest généralement associatif, car nous ne voulons pas que l'ordre dans lequel il est appliqué affecte le résultat: nous voulons . Nous avons donc un semi - groupe .. (a.b).c=a.(b.c)
Il existe presque toujours une sorte d'identité, que ce soit le nombre 0 ou 1, la chaîne vide, une matrice d'identité, une distribution uniforme ou l'ensemble vide, qui dépend de l'opération. Donc, en fait, les données forment généralement un monoïde .
Le point pratique de penser que les données forment un monoïde est qu'elles fournissent un moyen de discuter des opérations sur différents types de données en utilisant un langage algébrique commun. Cela se traduit ensuite par des bibliothèques de code génériques qui peuvent traiter tous les monoïdes, en passant simplement une opération d'agrégation appropriée comme argument.
Notez que de nombreux types de données n'ont pas d'inverses, donc une structure de groupe est trop à espérer. Si vous avez une structure de groupe, alors certaines façons supplémentaires de manipuler les données deviennent possibles, mais comme ni les matrices avec multiplication, ni les entiers positifs avec addition n'ont d'invers, les données non structurées en groupe sont assez courantes.
Nous ne voulons généralement pas simplement stocker des données, mais exécuter des requêtes sur la base de données. Nous avons donc besoin d'une idée de ce qu'il faut faire lorsqu'une requête génère de nombreuses réponses. Cela nécessite souvent une opération de combinaison (qui peut être la même que ), Et qui doit être compatible avecdans la façon dont ils interagissent. Il faut donc une sorte de distributivité. Commutativité de et parfois aussi deest aussi souvent naturel. On a alors un semirage ou un semirage commutatif. Encore une fois, les inverses sont généralement trop à espérer, donc les demi-anneaux conviennent mieux que les anneaux.+ . . + .
Un modèle de semi-agrégation d'agrégation de données existe depuis un certain temps dans la communauté de satisfaction des contraintes. Notez qu'une instance de problème de satisfaction de contrainte est une requête conjonctive sur une base de données particulière de faits, c'est donc assez général: la plupart des requêtes pratiques sur les données sont conjonctives.
La poussée actuelle de l'analyse théorique du modèle de semi-agrégation d'agrégation de données a été lancée en 2007, dans le contexte de la provenance . La provenance est un terme de fantaisie pour annoter des données. Étant donné que tout tuple de base de données peut être considéré comme des annotations appliquées à un identifiant de tuple unique, l'agrégation de données peut être considérée comme une simple combinaison d'annotations. La provenance est donc une généralisation de l'idée d'agrégation de données, et il a été explicitement avancé que le bon modèle théorique de combinaison d'annotations est un semirage. Le semiring le plus général, des polynômes de provenance, permet en fait de garder une trace de l'historique complet de la façon dont un élément de données a été obtenu à partir des parties constituantes. Par exemple, une valeur pdans l'analyse d'un essai clinique peut garder une trace de la façon dont il a été calculé à partir de chacun des résultats des essais individuels. Si certains d'entre eux s'avèrent faux (ou faux), alors on peut simplement recalculer sans les mauvaises données.
Il y a eu beaucoup de travail supplémentaire en utilisant des demi-anneaux pour agréger des données, voir les articles citant celui-ci .
Du point de vue plus immédiatement pratique que vous citez, voyez par exemple le cadre GDL pour savoir comment on peut paralléliser efficacement un calcul en groupant de manière appropriée l'expression semiring sous-jacente.
la source