RSS page de blog - 1/7 ==> Blog Azure (2) algorithme (3) blog (2) deep_learning (2) machine_learning (8) modules (4) pandas (3) programmation (3) references (2) setup (2) tutoriel (2)


page de blog - 1/7

Awesome quelque chose

2017-12-16

On voit de plus en plus d’exemples de repository GitHub qui références des listes d’articles ou de librairies qui sont awesome.

article

C++ depuis un notebook

2017-12-02

Il est maintenant possible de faire du C++ dans un notebook : Interactive Workflows for C++ with Jupyter. Ce langage s’ajoute à l’incroyable liste déjà disponible : Jupyter kernels. Ce petit tour de force repose sur Cling, un interpréteur pour C++ et Xeus qui implémente le kernel. L’article mentionne d’autres outils très sympathiques. Parmi eux, xtensor qui permet le calcul numérique sous C++. mybinder permet de dockeriser un repository github.

article

Resté informé sur le Deep Learning

2017-11-13

Un article qui suggèrent des blogs à lire :

Des cours filmés à Sanford :

Le deep learning est assimilé à une intelligence artificielle mais il n’est ni aussi performant qu’un cerveau humain, loin de là, ni aussi peu économoe en terme d’énergie : Les conséquences pratiques d’AlphaGo Zero.

article

Cours de deep learning appliqués au NLP

2017-11-13

Stanford University School of Engineering met en ligne beaucoup de cours dont les suivants Natural Language Processing with Deep Learning. C’est l’état de l’art cette année.

Une série d’articles sur le deep learning :

A propos des Generative Adversarial Networks :

Un résultat d’expérience qui est amené à prendre plus d’importance. Une couche d’un réseau de neurones profond est consistitué de plusieurs ensembles de neurones non connecté (des filtres). Ces filtres reçoivent tous les mêmes entrées. L’article proposent une façon de spécialiser chaque filtre plus rapidement en routant (en pondérant) les exemples entre chauqe couche.

Enfin :

article

Lectures sur Map Reduce, algorithme distribués

2017-11-10

Il arrive parfois de faire quelques trouvailles, des articles bien écrits qu’on se surprend à penser qu’il n’est plus besoin de préparer un support écrit. C’est le cas de cet article de blog MapReduce Patterns, Algorithms, and Use Cases. Je recommande également la lecture des autres articles de ce blog : Highly Scalable Blog. J’ai trouvé cette référence en parcourant les supports de cours de Roxana Geambasu comme Distributed Systems Fundamentals.

article

Algorithmes classiques implémentés

2017-11-04

Le module algorithms implémente beaucoup d’algorithmes classiques tels que la recherche binaire, le générateur de nombre aléatoire de Mersenne, le tri heapsort.

article

Après l’architecture Von Neumann

2017-10-26

Les ordinateurs d’aujourd’hui ne sont pas très éloignés de l”architecture Von Neumann qui place le processor CPU au centre de la machine. C’est l’architecture dans le cours proposé en dernière de l’école Anatomie et histoire d’un ordinateur.

source: wikipédia

L’article suivant suggère que cela pourrait changer : IBM scientists say radical new “in-memory” computing architecture will speed up computers by 200 times. L’article suivant est plus détaillé quant à l’innovation proposée : Temporal correlation detection using computational phase-change memory. L’idée principale consiste à déléguer certains calculs jusqu’alors réalisés par le processeur à une mémoire capable d’en prendre une partie en charge de façon parallèle. Cela signifie également qu’il est nécessaire de réécrire les algorithmes pour cette nouvelle architecture si on souhaite en tirer parti.

article

RUST

2017-10-24

Le langage RUST est utilisé pour réécrire certaines parties de Firefox. Il est optimisé pour la gestion des threads.

article

Pourquoi pandas et numpy, pourquoi pas seulement pandas (2A) ?

2017-09-19

Voici quelques questions abordées durant la première séance. L’instruction pandas.read_csv n’a pas toujours fonctionné. Deux principales raisons à cela, la première à cause du chemin. Un chemin peut être absolu, il commence par c:\ ou \ sous Windows ou / sous Linux, ou relatif, il commence par un nom. Le chemin absolu ne pose pas de difficulté en Python sauf dans quelques cas où le chemin est un chemin réseau (commençant par \\). Par défaut, Python cherche les données à partir de l’emplacement du programme si le chemin est relatif. Cet emplacement est aussi l’emplacement courant pour le programme. Il suffit de placer les fichiers dans ce répetoire pour n’utiliser que le nom du fichier. On l’obtient en exécutant :

>>>

import os
print(os.getcwd())

Sortie

    c:\jenkins\pymy\ensae_teaching_cs\ensae_teaching_cs_UT_36_std\_doc\sphinxdoc

Il est possivble de vérifier le contenu d’un répertoire, en particulier du répertoire courent avec :

>>>

import os
for name in os.listdir("."):
    print(name)

Sortie

    build
    source

La seconde raison est l”encoding. Les caractères chinois nécessitent un encodage particulier car il faut plusieurs octets pour coder un des nombreux caractères. Il n’existe pas une seule façon d’associer un caractère chinois mais la façon commune est utf-8 qui est le standard du web. Il faut s’assurer que le code utilisée pour créer le fichier de données est le même que celui utilisé pour relire :

import pandas
df = pandas.read_csv("...", encoding="...")

Autre question, pourquoi numpy alors que pandas fait déjà tout. La réponse tient dans l’image qui suit :

../_images/ml_simple.png

pandas sert à préparer les données, à transformer tout ce qui n’est pas numérique en nombres réelles, à enrichir les données en fusionnant avec d’autres bases. Une fois que cela est fait, on peut convertir toutes les données au format numérique, en matrice pour simplfiier car les algorihmes numériques utilisant principalement cela. Des nombres réels sous forme de matrices, c’est ce que manipulent tous les algorithmes de machine learning. matplotlib conclue le processus en donnant les moyens de représenter le résultat de l’expérience.

Pour ceux qui ont commencé la compétition, les liens vers les données sont cassés et seront réparés dès la publication de cet article. Un data leakage ou expérience surprenante avec la dernière variable de la base qui contient le nombre de valeurs non nulles parmi les colonnes dont le nom se termine pas 100g. La prise en compte de cette variable semble influencer beaucoup la prédiction.

article

Carré magique (1A) et transformation d’une fonction

2017-09-19

On veut écrire une fonction qui calcule la somme des nombres sur chaque ligne d’un carré magique pour s’assurer qu’on a bien la même somme à chaque fois.

1 2 3  --> 6
4 5 6  --> 15
7 8 9  --> 24

La première idée est d’écrire quelque chose comme :

>>>

def est_magique(a, b, c, d, e, f, g, h, i):
    l1 = a + b + c
    l2 = d + e + f
    l3 = g + h + i
    if l1 == l2 == l3:
        return True
    else:
        return False


print(est_magique(1, 2, 3, 4, 5, 6, 7, 8, 9))

Sortie

    False

Plus un code est long, plus la probabilité de faire une erreur est grande. C’est pourquoi, on préfère toujours un code court. La dernière partie de la fonction retourne un booléen qui en fait identique à la condition du test dont il dépend. On réduit donc les quatre dernières lignes à une seule.

>>>

def est_magique(a, b, c, d, e, f, g, h, i):
    l1 = a + b + c
    l2 = d + e + f
    l3 = g + h + i
    return l1 == l2 == l3


print(est_magique(1, 2, 3, 4, 5, 6, 7, 8, 9))

Sortie

    False

Avoir neuf lettres pour désigner les coefficients est l’assurance de se tromper. Une lettre pour désigner l’ensemble, une liste sera tout de suite plus lisible.

>>>

def est_magique(coefs):
    l1 = coefs[0] + coefs[1] + coefs[2]
    l2 = coefs[3] + coefs[4] + coefs[5]
    l3 = coefs[6] + coefs[7] + coefs[8]
    return l1 == l2 == l3


print(est_magique([1, 2, 3, 4, 5, 6, 7, 8, 9]))

Sortie

    False

Cela reste quand même fastidieux d’écrire les positions des coefficients. Réduisons encore cela avec la fonction python.sum.

>>>

def est_magique(coefs):
    l1 = sum(coefs[0:3])
    l2 = sum(coefs[3:6])
    l3 = sum(coefs[6:9])
    return l1 == l2 == l3


print(est_magique([1, 2, 3, 4, 5, 6, 7, 8, 9]))

Sortie

    False

C’est mieux mais il reste toujours le problème du copier/coller pour chaque ligne. Une boucle devrait résoudre le tout. Il faut également adapter la condition finale.

>>>

def est_magique(coefs):
    l123 = [sum(coefs[3 * i: 3 * i + 3]) for i in range(0, 3)]
    return l123[0] == l123[1] == l123[2]


print(est_magique([1, 2, 3, 4, 5, 6, 7, 8, 9]))

Sortie

    False

La dernière condition est toujours longue, on peut la simplifier en disant que si le plus petit et le plus grand montant de chaque ligne sont égaux, alors ils sont tous égaux.

>>>

def est_magique(coefs):
    l123 = [sum(coefs[3 * i: 3 * i + 3]) for i in range(0, 3)]
    return min(l123) == max(l123)


print(est_magique([1, 2, 3, 4, 5, 6, 7, 8, 9]))

Sortie

    False

Il reste maintenant à changer la fonction pour que celle-ci soit capable de traiter des carrés de n’importe quelle dimension. Les nombres 3 vont disparaître. On précise également la dimension du carré comme argument de la fonction même si on pourrait la dimension comme étant la racine carré de la longueur de la liste en entrée.

>>>

def est_magique(coefs, n):
    # n devrait être égal à len(coefs) ** 0.5
    ln = [sum(coefs[n * i: n * i + n]) for i in range(0, n)]
    return min(ln) == max(ln)


print(est_magique([1, 2, 3, 4, 5, 6, 7, 8, 9], 3))
print(est_magique([1, 2, 3, 4], 2))

Sortie

    False
    False

Le code final est plus concis et plus générique. En supportant plusieurs dimensions pour lesquelles on le teste, il est aussi plus robuste. En revanche, il est plus lent que la version initiale qui ne fait que les calculs nécessaires. La dernière version inclut des opérations implicites mais pourtant bien réelles. A chaque itération de boucle, on incrémente un compteur (i par exemple) et on vérifie qu’il n’est pas plus grand que le nombre d’itérations souhaité. Cela signifie que le code final devrait être deux fois plus lent que le code initial. Ce choix lisibilité / performance revient plus fréquemment qu’on ne le pense. La dernière fonction contient n + 3 boucles. Saurez-vous les identifier ?

article


RSS page de blog - 1/7 ==> 2015-04 (5) 2015-05 (5) 2015-07 (2) 2015-08 (1) 2015-09 (2) 2015-12 (1) 2016-01 (6) 2016-03 (8) 2016-04 (1) 2016-05 (1) 2016-06 (1) 2016-08 (4) 2016-09 (2) 2016-10 (3) 2016-11 (4) 2016-12 (2) 2017-01 (2) 2017-02 (2) 2017-06 (1) 2017-08 (2) 2017-09 (4) 2017-10 (2) 2017-11 (4) 2017-12 (2)