2010-04-25 bibdesk + citeulike

2010-04-25 10:31:51
  • as described in http://www.academicproductivity.com/2009/citeulike-bibdesk-sync-your-references-and-live-smarter/
  • "Add external file group"
  • enter the http://www.citeulike.org/bibtex/user/LaurentPerrinet?fieldmap=posted-at:date-added&do_username_prefix=0&key_type=4 URL (change the name accordingly)
  • no back sync bidesk > citeUlike except manual export / import workflow
  • to focus on one tag, use something like http://www.citeulike.org/bibtex/user/LaurentPerrinet/tag/motion-energy?fieldmap=posted-at:date-added&do_username_prefix=0&key_type=4


2010-04-24 Richard Dawkins on our "queer" universe

2010-04-25 12:13:24

http://www.ted.com/talks/richard_dawkins_on_our_queer_universe.html http://dotsub.com/view/2e6446ef-42c7-483a-bbda-df65b1cc4c84/viewTranscript/eng

My title: "Queerer than we can suppose: The strangeness of science." "Queerer than we can suppose" comes from J.B.S. Haldane, the famous biologist, who said, "Now, my own suspicion is that the universe is not only queerer than we suppose, but queerer than we can suppose. I suspect that there are more things in heaven and earth than are dreamed of, or can be dreamed of, in any philosophy." Richard Feynman compared the accuracy of quantum theories -- experimental predictions -- to specifying the width of North America to within one hair's breadth of accuracy. This means that quantum theory has got to be in some sense true. Yet the assumptions that quantum theory needs to make in order to deliver those predictions are so mysterious that even Feynman himself was moved to remark, "If you think you understand quantum theory, you don't understand quantum theory."

It's so queer that physicists resort to one or another paradoxical interpretation of it. David Deutsch, who's talking here, in The Fabric of Reality, embraces the "many worlds" interpretation of quantum theory, because the worst that you can say about it is that it's preposterously wasteful. It postulates a vast and rapidly growing number of universes existing in parallel -- mutually undetectable except through the narrow porthole of quantum mechanical experiments. And that's Richard Feynman.

The biologist Lewis Wolpert believes that the queerness of modern physics is just an extreme example. Science, as opposed to technology, does violence to common sense. Every time you drink a glass of water, he points out, the odds are that you will imbibe at least one molecule that passed through the bladder of Oliver Cromwell. (Laughter) It's just elementary probability theory. The number of molecules per glassful is hugely greater than the number of glassfuls, or bladdersful, in the world -- and, of course, there's nothing special about Cromwell or bladders. You have just breathed in a nitrogen atom that passed through the right lung of the third iguanodon to the left of the tall cycad tree.

"Queerer than we can suppose." What is it that makes us capable of supposing anything, and does this tell us anything about what we can suppose? Are there things about the universe that will be forever beyond our grasp, but not beyond the grasp of some superior intelligence? Are there things about the universe that are, in principle, ungraspable by any mind, however superior? The history of science has been one long series of violent brainstorms, as successive generations have come to terms with increasing levels of queerness in the universe. We're now so used to the idea that the Earth spins -- rather than the Sun moves across the sky -- it's hard for us to realize what a shattering mental revolution that must have been. After all, it seems obvious that the Earth is large and motionless, the Sun small and mobile. But it's worth recalling Wittgenstein's remark on the subject. "Tell me," he asked a friend, "why do people always say, it was natural for man to assume that the sun went round the earth rather than that the earth was rotating?" His friend replied, "Well, obviously because it just looks as though the Sun is going round the Earth." Wittgenstein replied, "Well, what would it have looked like if it had looked as though the Earth was rotating?" (Laughter)

Science has taught us, against all intuition, that apparently solid things, like crystals and rocks, are really almost entirely composed of empty space. And the familiar illustration is the nucleus of an atom is a fly in the middle of a sports stadium and the next atom is in the next sports stadium. So it would seem the hardest, solidest, densest rock is really almost entirely empty space, broken only by tiny particles so widely spaced they shouldn't count. Why, then, do rocks look and feel solid and hard and impenetrable? As an evolutionary biologist I'd say this: our brains have evolved to help us survive within the orders of magnitude of size and speed which our bodies operate at. We never evolved to navigate in the world of atoms. If we had, our brains probably would perceive rocks as full of empty space. Rocks feel hard and impenetrable to our hands precisely because objects like rocks and hands cannot penetrate each other. It's therefore useful for our brains to construct notions like "solidity" and "impenetrability," because such notions help us to navigate our bodies through the middle-sized world in which we have to navigate.

Moving to the other end of the scale, our ancestors never had to navigate through the cosmos at speeds close to the speed of light. If they had, our brains would be much better at understanding Einstein. I want to give the name "Middle World" to the medium-scaled environment in which we've evolved the ability to take act -- nothing to do with Middle Earth. Middle World. (Laughter) We are evolved denizens of Middle World, and that limits what we are capable of imagining. You find it intuitively easy to grasp ideas like, when a rabbit moves at the -- sort of medium velocity at which rabbits and other Middle World objects move, and hits another Middle World object, like a rock, it knocks itself out.

May I introduce Major General Albert Stubblebine III, commander of military intelligence in 1983. He stared at his wall in Arlington, Virginia, and decided to do it. As frightening as the prospect was, he was going into the next office. He stood up, and moved out from behind his desk. What is the atom mostly made of? he thought. Space. He started walking. What am I mostly made of? Atoms. He quickened his pace, almost to a jog now. What is the wall mostly made of? Atoms. All I have to do is merge the spaces. Then, General Stubblebine banged his nose hard on the wall of his office. Stubblebine, who commanded 16,000 soldiers, was confounded by his continual failure to walk through the wall. He has no doubt that this ability will, one day, be a common tool in the military arsenal. Who would screw around with an army that could do that? That's from an article in Playboy, which I was reading the other day. (Laughter)

I have every reason to think it's true; I was reading Playboy because I, myself, had an article in it. (Laughter) Unaided human intuition schooled in Middle World finds it hard to believe Galileo when he tells us a heavy object and a light object, air friction aside, would hit the ground at the same instant. And that's because in Middle World, air friction is always there. If we'd evolved in a vacuum we would expect them to hit the ground simultaneously. If we were bacteria, constantly buffeted by thermal movements of molecules, it would be different, but we Middle Worlders are too big to notice Brownian motion. In the same way, our lives are dominated by gravity but are almost oblivious to the force of surface tension. A small insect would reverse these priorities.

Steve Grand -- he's the one on the left, Douglas Adams is on the right -- Steve Grand, in his book, Creation: Life and How to Make It, is positively scathing about our preoccupation with matter itself. We have this tendency to think that only solid, material things are really things at all. Waves of electromagnetic fluctuation in a vacuum seem unreal. Victorians thought the waves had to be waves in some material medium -- the ether. But we find real matter comforting only because we've evolved to survive in Middle World, where matter is a useful fiction. A whirlpool, for Steve Grand, is a thing with just as much reality as a rock.

In a desert plain in Tanzania, in the shadow of the volcano Ol Donyo Lengai, there's a dune made of volcanic ash. The beautiful thing is that it moves bodily. It's what's technically known as a barchan, and the entire dune walks across the desert in a westerly direction at a speed of about 17 meters per year. It retains its crescent shape and moves in the direction of the horns. What happens is that the wind blows the sand up the shallow slope on the other side, and then, as each sand grain hits the top of the ridge, it cascades down on the inside of the crescent, and so the whole horn-shaped dune moves. Steve Grand points out that you and I are, ourselves, more like a wave than a permanent thing. He invites us, the reader, to "think of an experience from your childhood -- something you remember clearly, something you can see, feel, maybe even smell, as if you were really there. After all, you really were there at the time, weren't you? How else would you remember it? But here is the bombshell: You weren't there. Not a single atom that is in your body today was there when that event took place. Matter flows from place to place and momentarily comes together to be you. Whatever you are, therefore, you are not the stuff of which you are made. If that doesn't make the hair stand up on the back of your neck, read it again until it does, because it is important."

So "really" isn't a word that we should use with simple confidence. If a neutrino had a brain, which it evolved in neutrino-sized ancestors, it would say that rocks really do consist of empty space. We have brains that evolved in medium-sized ancestors which couldn't walk through rocks. "Really," for an animal, is whatever its brain needs it to be in order to assist its survival, and because different species live in different worlds, there will be a discomforting variety of reallys. What we see of the real world is not the unvarnished world but a model of the world, regulated and adjusted by sense data, but constructed so it's useful for dealing with the real world.

The nature of the model depends on the kind of animal we are. A flying animal needs a different kind of model from a walking, climbing or swimming animal. A monkey's brain must have software capable of simulating a three-dimensional world of branches and trunks. A mole's software for constructing models of its world will be customized for underground use. A water strider's brain doesn't need 3D software at all, since it lives on the surface of the pond in an Edwin Abbott flatland.

I've speculated that bats may see color with their ears. The world model that a bat needs in order to navigate through three dimensions catching insects must be pretty similar to the world model that any flying bird, a day-flying bird like a swallow, needs to perform the same kind of tasks. The fact that the bat uses echoes in pitch darkness to input the current variables to its model, while the swallow uses light, is incidental. Bats, I even suggested, use perceived hues, such as red and blue, as labels, internal labels, for some useful aspect of echoes -- perhaps the acoustic texture of surfaces, furry or smooth and so on, in the same way as swallows or, indeed, we, use those perceived hues -- redness and blueness etcetera -- to label long and short wavelengths of light. There's nothing inherent about red that makes it long wavelength.

And the point is that the nature of the model is governed by how it is to be used, rather than by the sensory modality involved. J. B .S. Haldane himself had something to say about animals whose world is dominated by smell. Dogs can distinguish two very similar fatty acids, extremely diluted: caprylic acid and caproic acid. The only difference, you see, is that one has an extra pair of carbon atoms in the chain. Haldane guesses that a dog would probably be able to place the acids in the order of their molecular weights by their smells, just as a man could place a number of piano wires in the order of their lengths by means of their notes. Now, there's another fatty acid, capric acid, which is just like the other two, except that it has two more carbon atoms. A dog that had never met capric acid would, perhaps, have no more trouble imagining its smell than we would have trouble imagining a trumpet, say, playing one note higher than we've heard a trumpet play before. Perhaps dogs and rhinos and other smell-oriented animals smell in color. And the argument would be exactly the same as for the bats.

Middle World -- the range of sizes and speeds which we have evolved to feel intuitively comfortable with -- is a bit like the narrow range of the electromagnetic spectrum that we see as light of various colors. We're blind to all frequencies outside that, unless we use instruments to help us. Middle World is the narrow range of reality which we judge to be normal, as opposed to the queerness of the very small, the very large and the very fast. We could make a similar scale of improbabilities; nothing is totally impossible. Miracles are just events that are extremely improbable. A marble statue could wave its hand at us; the atoms that make up its crystalline structure are all vibrating back and forth anyway. Because there are so many of them, and because there's no agreement among them in their preferred direction of movement, the marble, as we see it in Middle World, stays rock steady. But the atoms in the hand could all just happen to move the same way at the same time, and again and again. In this case, the hand would move and we'd see it waving at us in Middle World. The odds against it, of course, are so great that if you set out writing zeros at the time of the origin of the universe, you still would not have written enough zeros to this day.

Evolution in Middle World has not equipped us to handle very improbable events; we don't live long enough. In the vastness of astronomical space and geological time, that which seems impossible in Middle World might turn out to be inevitable. One way to think about that is by counting planets. We don't know how many planets there are in the universe, but a good estimate is about ten to the 20, or 100 billion billion. And that gives us a nice way to express our estimate of life's improbability. Could make some sort of landmark points along a spectrum of improbability, which might look like the electromagnetic spectrum we just looked at.

If life has arisen only once on any -- if -- if life could -- I mean, life could originate once per planet, could be extremely common, or it could originate once per star, or once per galaxy or maybe only once in the entire universe, in which case it would have to be here. And somewhere up there would be the chance that a frog would turn into a prince and similar magical things like that. If life has arisen on only one planet in the entire universe, that planet has to be our planet, because here we are talking about it. And that means that if we want to avail ourselves of it, we're allowed to postulate chemical events in the origin of life which have a probability as low as one in 100 billion billion. I don't think we shall have to avail ourselves of that, because I suspect that life is quite common in the universe. And when I say quite common, it could still be so rare that no one island of life ever encounters another, which is a sad thought.

How shall we interpret "queerer than we can suppose?" Queerer than in principle can be supposed, or just queerer than we can suppose, given the limitations of our brain's evolutionary apprenticeship in Middle World? Could we, by training and practice, emancipate ourselves from Middle World and achieve some sort of intuitive, as well as mathematical, understanding of the very small and the very large? I genuinely don't know the answer. I wonder whether we might help ourselves to understand, say, quantum theory, if we brought up children to play computer games, beginning in early childhood, which had a sort of make believe world of balls going through two slits on a screen, a world in which the strange goings on of quantum mechanics were enlarged by the computer's make believe, so that they became familiar on the Middle-World scale of the stream. And, similarly, a relativistic computer game in which objects on the screen manifest the Lorenz Contraction, and so on, to try to get ourselves into the way of thinking -- get children into the way of thinking about it.

I want to end by applying the idea of Middle World to our perceptions of each other. Most scientists today subscribe to a mechanistic view of the mind: we're the way we are because our brains are wired up as they are; our hormones are the way they are. We'd be different, our characters would be different, if our neuro-anatomy and our physiological chemistry were different. But we scientists are inconsistent. If we were consistent, our response to a misbehaving person, like a child murderer, should be something like, this unit has a faulty component; it needs repairing. That's not what we say. What we say -- and I include the most austerely mechanistic among us, which is probably me -- what we say is, "Vile monster, prison is too good for you." Or worse, we seek revenge, in all probability thereby triggering the next phase in an escalating cycle of counter-revenge, which we see, of course, all over the world today. In short, when we're thinking like academics, we regard people as elaborate and complicated machines, like computers or cars, but when we revert to being human we behave more like Basil Fawlty, who, we remember, thrashed his car to teach it a lesson when it wouldn't start on gourmet night. (Laughter)

The reason we personify things like cars and computers is that just as monkeys live in an arboreal world and moles live in an underground world and water striders live in a surface tension-dominated flatland, we live in a social world. We swim through a sea of people -- a social version of Middle World. We are evolved to second-guess the behavior of others by becoming brilliant, intuitive psychologists. Treating people as machines may be scientifically and philosophically accurate, but it's a cumbersome waste of time if you want to guess what this person is going to do next. The economically useful way to model a person is to treat him as a purposeful, goal-seeking agent with pleasures and pains, desires and intentions, guilt, blame-worthiness. Personification and the imputing of intentional purpose is such a brilliantly successful way to model humans, it's hardly surprising the same modeling software often seizes control when we're trying to think about entities for which it's not appropriate, like Basil Fawlty with his car or like millions of deluded people with the universe as a whole. (Laughter)

If the universe is queerer than we can suppose, is it just because we've been naturally selected to suppose only what we needed to suppose in order to survive in the Pleistocene of Africa? Or are our brains so versatile and expandable that we can train ourselves to break out of the box of our evolution? Or, finally, are there some things in the universe so queer that no philosophy of beings, however godlike, could dream them? Thank you very much.


2010-04-08 Comment créer et manipuler les données scientifiques : autour de Numpy

2010-04-08 08:17:13

Le tableau : l'outil de base du calcul scientifique


Manipulation fréquente d'ensembles ordonnés discrets :

  • temps discrétisé d'une expérience/simulation
  • signal enregistré par un appareil de mesure
  • pixels d'une image, ...

Le module Numpy permet de

  • créer d'un coup ces ensembles de données
  • réaliser des opérations en "batch" sur les tableaux de données (pas de boucle sur les éléments).

Tableau de données := numpy.ndarray

La création de tableaux de données Numpy

Un petit exemple pour commencer:

>>> import numpy as np
>>> a = np.array([0, 1, 2])
>>> a
array([0, 1, 2])
>>> print a
[0 1 2]
>>> b = np.array([[0., 1.], [2., 3.]])
>>> b
array([[ 0.,  1.],
       [ 2.,  3.]])

Dans la pratique, on rentre rarement les éléments un par un...

  • Valeurs espacées régulièrement:

    >>> import numpy as np
    >>> a = np.arange(10) # de 0 a n-1
    >>> a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> b = np.arange(1., 9., 2) # syntaxe : debut, fin, saut
    >>> b
    array([ 1.,  3.,  5.,  7.])

    ou encore, en spécifiant le nombre de points:

    >>> c = np.linspace(0, 1, 6)
    >>> c
    array([ 0. ,  0.2,  0.4,  0.6,  0.8,  1. ])
    >>> d = np.linspace(0, 1, 5, endpoint=False)
    >>> d
    array([ 0. ,  0.2,  0.4,  0.6,  0.8])
  • Constructeurs pour des tableaux classiques:

    >>> a = np.ones((3,3))
    >>> a
    array([[ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.]])
    >>> a.dtype
    >>> b = np.ones(5, dtype=np.int)
    >>> b
    array([1, 1, 1, 1, 1])
    >>> c = np.zeros((2,2))
    >>> c
    array([[ 0.,  0.],
           [ 0.,  0.]])
    >>> d = np.eye(3)
    >>> d
    array([[ 1.,  0.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  0.,  1.]])

La représentation graphique des données : matplotlib et mayavi

Maintenant que nous avons nos premiers tableaux de données, nous allons les visualiser. Matplotlib est un package de plot 2-D, on importe ces fonctions de la manière suivante

>>> import pylab
>>> # ou
>>> from pylab import * # pour tout importer dans le namespace

Si vous avec lancé Ipython avec python(x,y), ou avec l'option ipython -pylab (sous linux), toutes les fonctions/objets de pylab ont déjà été importées, comme si on avait fait from pylab import *. Dans la suite on suppose qu'on a fait from pylab import * ou lancé ipython -pylab: on n'écrira donc pas pylab.fonction() mais directement fonction.

Tracé de courbes 1-D

In [6]: a = np.arange(20)
In [7]: plot(a, a**2) # line plot
Out[7]: [<matplotlib.lines.Line2D object at 0x95abd0c>]
In [8]: plot(a, a**2, 'o') # symboles ronds
Out[8]: [<matplotlib.lines.Line2D object at 0x95b1c8c>]
In [9]: clf() # clear figure
In [10]: loglog(a, a**2)
Out[10]: [<matplotlib.lines.Line2D object at 0x95abf6c>]
In [11]: xlabel('x') # un peu petit
Out[11]: <matplotlib.text.Text object at 0x98923ec>
In [12]: xlabel('x', fontsize=26) # plus gros
Out[12]: <matplotlib.text.Text object at 0x98923ec>
In [13]: ylabel('y')
Out[13]: <matplotlib.text.Text object at 0x9892b8c>
In [14]: grid()
In [15]: axvline(2)
Out[15]: <matplotlib.lines.Line2D object at 0x9b633cc>

Tableaux 2-D (images par exemple)

In [48]: # Tableaux 30x30 de nombres aleatoires entre 0 et 1
In [49]: image = np.random.rand(30,30)
In [50]: imshow(image)
Out[50]: <matplotlib.image.AxesImage object at 0x9e954ac>
In [51]: gray()
In [52]: hot()
In [53]: imshow(image, cmap=cm.gray)
Out[53]: <matplotlib.image.AxesImage object at 0xa23972c>
In [54]: axis('off') # on enleve les ticks et les labels

Il y a bien d'autres fonctionnalités dans matplotlib : choix de couleurs ou des tailles de marqueurs, fontes latex, inserts à l'intérieur d'une figure, histogrammes, etc.

Pour aller plus loin :

Représentation en 3-D

Pour la visualisation 3-D, on utilise un autre package : Mayavi. Un exemple rapide : commencez par relancer ipython avec les options ipython -pylab -wthread

In [59]: from enthought.mayavi import mlab
In [60]: mlab.figure()
get fences failed: -1
param: 6, val: 0
Out[60]: <enthought.mayavi.core.scene.Scene object at 0xcb2677c>
In [61]: mlab.surf(image)
Out[61]: <enthought.mayavi.modules.surface.Surface object at 0xd0862fc>
In [62]: mlab.axes()
Out[62]: <enthought.mayavi.modules.axes.Axes object at 0xd07892c>

La fenêtre mayavi/mlab qui s'ouvre est interactive : en cliquant sur le bouton gauche de la souris vous pouvez faire tourner l'image, on peut zoomer avec la molette, etc.


Pour plus d'informations sur Mayavi : http://code.enthought.com/projects/mayavi/docs/development/html/mayavi/index.html


On peut accéder aux éléments des tableaux Numpy (indexer) d'une manière similaire que pour les autres séquences Python (list, tuple)

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[0], a[2], a[-1]
(0, 2, 9)

Attention ! L'indexage commence à partir de 0, comme pour les autres séquences Python (et comme en C/C++). En Fortran ou Matlab, l'indexage commence à 1.

Pour les tableaux multidimensionnels, l'indice d'un élément est donné par un n-uplet d'entiers

>>> a = np.diag(np.arange(5))
>>> a
array([[0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 2, 0, 0],
       [0, 0, 0, 3, 0],
       [0, 0, 0, 0, 4]])
>>> a[1,1]
>>> a[2,1] = 10 # deuxième ligne, première colonne
>>> a
array([[ 0,  0,  0,  0,  0],
       [ 0,  1,  0,  0,  0],
       [ 0, 10,  2,  0,  0],
       [ 0,  0,  0,  3,  0],
       [ 0,  0,  0,  0,  4]])
>>> a[1]
array([0, 1, 0, 0, 0])

A retenir :

  • En 2-D, la première dimension correspond aux lignes, la seconde aux colonnes.
  • Pour un tableau a à plus qu'une dimension,`a[0]` est interprété en prenant tous les éléments dans les dimensions non-spécifiés.

Slicing (parcours régulier des éléments)

Comme l'indexage, similaire au slicing des autres séquences Python:

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[2:9:3] # [début:fin:pas]
array([2, 5, 8])

Attention, le dernier indice n'est pas inclus

>>> a[:4]
array([0, 1, 2, 3])

début:fin:pas est un objet slice, qui représente l'ensemble d'indices range(début, fin, pas). On peut créer explicitement un slice

>>> sl = slice(1, 9, 2)
>>> a = np.arange(10)
>>> b = 2*a + 1
>>> a, b
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19]))
>>> a[sl], b[sl]
(array([1, 3, 5, 7]), array([ 3,  7, 11, 15]))

On n'est pas obligé de spécifier à la fois le début (indice 0 par défaut), la fin (dernier indice par défaut) et le pas (1 par défaut):

>>> a[1:3]
array([1, 2])
>>> a[::2]
array([0, 2, 4, 6, 8])
>>> a[3:]
array([3, 4, 5, 6, 7, 8, 9])

Et bien sûr, ça marche pour les tableaux à plusieurs dimensions:

>>> a = np.eye(5)
>>> a
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  1.]])
>>> a[2:4,:3] #2è et 3è lignes, trois premières colonnes
array([[ 0.,  0.,  1.],
       [ 0.,  0.,  0.]])

On peut changer la valeur de tous les éléments indexés par une slice de façon très simple

>>> a[:3,:3] = 4
>>> a
array([[ 4.,  4.,  4.,  0.,  0.],
       [ 4.,  4.,  4.,  0.,  0.],
       [ 4.,  4.,  4.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  1.]])

Une petite illustration en résumé de l'indexage et du slicing avec Numpy...


Une opération de slicing crée une vue (view) du tableau d'origine, c'est-à-dire une manière d'aller lire dans la mémoire. Le tableau d'origine n'est donc pas copié. Quand on modifie la vue, on modife aussi le tableau d'origine.:

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = a[::2]; b
array([0, 2, 4, 6, 8])
>>> b[0] = 12
>>> b
array([12,  2,  4,  6,  8])
>>> a # a a été modifié aussi !
array([12,  1,  2,  3,  4,  5,  6,  7,  8,  9])

Ce comportement peut surprendre au début... mais est bien pratique pour gérer la mémoire de façon économe.

Si on veut faire une copie différente du tableau d'origine

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = np.copy(a[::2]); b
array([0, 2, 4, 6, 8])
>>> b[0] = 12
>>> b
array([12,  2,  4,  6,  8])
>>> a # a n'a pas été modifié
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Manipuler la forme des tableaux

On obtient la forme d'un tableau grâce à la méthode ndarray.shape qui retourne un tuple des dimensions du tableau

>>> a = np.arange(10)
>>> a.shape
>>> b = np.ones((3,4))
>>> b.shape
(3, 4)
>>> b.shape[0] # on peut accéder aux élements du tuple b.shape
>>> # et on peut aussi faire
>>> np.shape(b)
(3, 4)

Par ailleurs on obtient la longueur de la première dimension avec np.alen (par analogie avec len pour une liste) et le nombre total d'éléments avec ndarray.size:

>>> np.alen(b)
>>> b.size

Il existe plusieurs fonctions Numpy qui permettent de créer un tableau de taille différente à partir d'un tableau de départ.:

>>> a = np.arange(36)
>>> b = a.reshape((6, 6))
>>> b
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])

ndarray.reshape renvoie une vue, et pas une copie

>>> b[0,0] = 10
>>> a
array([10,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
       34, 35])

On peut aussi créer un tableau avec un nombre d'éléments différents avec ndarray.resize:

>>> a = np.arange(36)
>>> a.resize((4,2))
>>> a
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7]])
>>> b = np.arange(4)
>>> b.resize(3, 2)
>>> b
array([[0, 1],
       [2, 3],
       [0, 0]])

Ou paver un grand tableau à partir d'un tableau plus petit

>>> a = np.arange(4).reshape((2,2))
>>> a
array([[0, 1],
       [2, 3]])
>>> np.tile(a, (2,3))
array([[0, 1, 0, 1, 0, 1],
       [2, 3, 2, 3, 2, 3],
       [0, 1, 0, 1, 0, 1],
       [2, 3, 2, 3, 2, 3]])

Exercices : quelques gammes avec les tableaux numpy

Grâce aux divers constructeurs, à l'indexage et au slicing, et aux opérations simples sur les tableaux (+/-/x/:), on peut facilement créer des tableaux de grande taille correspondant à des motifs variés.

Exemple : comment créer le tableau:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13  0]
 [15 16 17 18 19]
 [20 21 22 23 24]]


>>> a = np.arange(25).reshape((5,5))
>>> a[2, 4] = 0

Exercices : créer les tableaux suivants de la manière la plus simple possible (pas élément par élement)

[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  2.]
 [ 1.  6.  1.  1.]]

[[0 0 0 0 0]
 [2 0 0 0 0]
 [0 3 0 0 0]
 [0 0 4 0 0]
 [0 0 0 5 0]
 [0 0 0 0 6]]

De "vraies données" : lire et écrire des tableaux dans des fichiers

Bien souvent, nos expériences ou nos simulations écrivent leurs résultats dans des fichiers. Il faut ensuite les charger dans Python sous la forme de tableaux Numpy pour les manipuler. De même, on peut vouloir sauver les tableaux qu'on a obtenus dans des fichiers.

Aller dans le bon répertoire

Pour se déplacer dans une arborescence de fichiers :

  • utiliser les fonctionnalités d'Ipython : cd, pwd, tab-completion.

  • modules os (routines système) et os.path (gestion des chemins)

    >>> import os, os.path
    >>> current_dir = os.getcwd()
    >>> current_dir
    >>> data_dir = os.path.join(current_dir, 'data')
    >>> data_dir
    >>> if not(os.path.exists(data_dir)):
    ...     os.mkdir('data')
    ...     print "creation du repertoire 'data'"
    >>> os.chdir(data_dir) # ou dans Ipython : cd data

On peut en fait se servir de Ipython comme d'un véritable shell grâce aux fonctionnalités d'Ipython et au module os.

Ecrire un tableau de données dans un fichier

>>> a = np.arange(100)
>>> a = a.reshape((10, 10))
  • Ecriture dans un fichier texte (en ascii)

    >>> np.savetxt('data_a.txt', a)
  • Ecriture dans un fichier en binaire (extension .npy)

    >>> np.save('data_a.npy', a)

Charger un tableau de données à partir d'un fichier

  • Lecture dans un fichier texte

    >>> b = np.loadtxt('data_a.txt')
  • Lecture dans un fichier binaire

    >>> c = np.load('data_a.npy')

Pour lire les fichiers de données matlab

scipy.io.loadmat : la structure matlab d'un fichier .mat est stockée dans un dictionnaire.

Pour sélectionner un fichier dans une liste

On va sauver chaque ligne de a dans un fichier différent

>>> for i, l in enumerate(a):
...     print i, l
...     np.savetxt('ligne_'+str(i), l)
0 [0 1 2 3 4 5 6 7 8 9]
1 [10 11 12 13 14 15 16 17 18 19]
2 [20 21 22 23 24 25 26 27 28 29]
3 [30 31 32 33 34 35 36 37 38 39]
4 [40 41 42 43 44 45 46 47 48 49]
5 [50 51 52 53 54 55 56 57 58 59]
6 [60 61 62 63 64 65 66 67 68 69]
7 [70 71 72 73 74 75 76 77 78 79]
8 [80 81 82 83 84 85 86 87 88 89]
9 [90 91 92 93 94 95 96 97 98 99]

Pour obtenir une liste de tous les fichiers commençant par ligne, on fait appel au module glob qui "gobe" tous les chemins correspondant à un motif. Exemple

>>> import glob
>>> filelist = glob.glob('ligne*')
>>> filelist
['ligne_0', 'ligne_1', 'ligne_2', 'ligne_3', 'ligne_4', 'ligne_5', 'ligne_6', 'ligne_7', 'ligne_8', 'ligne_9']
>>> # attention la liste n'est pas toujours ordonnee
>>> filelist.sort()
>>> l2 = np.loadtxt(filelist[2])

Remarque : il est aussi possible de créer des tableaux à partir de fichiers Excel/Calc, de fichiers hdf5, etc. (mais à l'aide de modules supplémentaires non décrits ici : xlrd, pytables, etc.).

Opérations mathématiques et statistiques simples sur les tableaux

Un certain nombre d'opérations sur les tableaux sont codées directement dans numpy (et sont donc en général très efficaces):

>>> a = np.arange(10)
>>> a.min() # ou np.min(a)
>>> a.max() # ou np.max(a)
>>> a.sum() # ou np.sum(a)

Il est possible de réaliser l'opération le long d'un axe uniquement, plutôt que sur tous les éléments

>>> a = np.array([[1, 3], [9, 6]])
>>> a
array([[1, 3],
       [9, 6]])
>>> a.mean(axis=0) # tableau contenant la moyenne de chaque colonne
array([ 5. ,  4.5])
>>> a.mean(axis=1) # tableau contenant la moyenne de chaque ligne
array([ 2. ,  7.5])

Il y en a encore bien d'autres opérations possibles : on en découvrira quelques unes au fil de ce cours.


Les opérations arithmétiques sur les tableaux correspondent à des opérations élément par élément. En particulier, le produit n'est pas un produit matriciel (contrairement à Matlab) ! Le produit matriciel est fourni par np.dot:

>>> a = np.ones((2,2))
>>> a*a
array([[ 1.,  1.],
       [ 1.,  1.]])
>>> np.dot(a,a)
array([[ 2.,  2.],
       [ 2.,  2.]])

Exemple : simulation de diffusion avec un marcheur aléatoire


Quelle est la distance typique d'un marcheur aléatoire à l'origine, après t sauts à droite ou à gauche ?

>>> nreal = 1000 # nombre de réalisations de la marche
>>> tmax = 200 # temps sur lequel on suit le marcheur
>>> # On tire au hasard tous les pas 1 ou -1 de la marche
>>> walk = 2 * ( np.random.random_integers(0, 1, (nreal,tmax)) - 0.5 )
>>> np.unique(walk) # Vérification : tous les pas font bien 1 ou -1
array([-1.,  1.])
>>> # On construit les marches en sommant ces pas au cours du temps
>>> cumwalk = np.cumsum(walk, axis=1) # axis = 1 : dimension du temps
>>> sq_distance = cumwalk**2
>>> # On moyenne dans le sens des réalisations
>>> mean_sq_distance = np.mean(sq_distance, axis=0)
In [39]: figure()
In [40]: plot(mean_sq_distance)
In [41]: figure()
In [42]: plot(np.sqrt(mean_sq_distance))

On retrouve bien que la distance grandit comme la racine carrée du temps !

Exercice : statistiques des femmes dans la recherche (données INSEE)

  1. Récupérer les fichiers organismes.txt et pourcentage_femmes.txt (clé USB du cours ou http://www.dakarlug.org/pat/scientifique/data/).
  2. Créer un tableau data en ouvrant le fichier pourcentage_femmes.txt avec np.loadtxt. Quelle est la taille de ce tableau ?
  3. Les colonnes correspondent aux années 2006 à 2001. Créer un tableau annees (sans accent !) contenant les entiers correspondant à ces années.
  4. Les différentes lignes correspondent à différents organismes de recherche dont les noms sont stockés dans le fichier organismes.txt. Créer un tableau organisms en ouvrant ce fichier. Attention : comme np.loadtxt crée par défaut des tableaux de flottant, il faut lui préciser qu'on veut créer un tableau de strings : organisms = np.loadtxt('organismes.txt', dtype=str)
  5. Vérifier que le nombre de lignes de data est égal au nombre d'organismes.
  6. Quel est le pourcentage maximal de femmes dans tous les organismes, toutes années confondues ?
  7. Créer un tableau contenant la moyenne temporelle du pourcentage de femmes pour chaque organisme (i.e., faire la moyenne de data suivant l'axe No 1).
  8. Quel organisme avait le pourcentage de femmes le plus élevé en 2004 ? (Indice np.argmax).
  9. Représenter un histogramme du pourcentage de femmes dans les
    différents organismes en 2006 (indice : np.histogram, puis bar ou plot de matplotlib pour la visualisation).

L'indexage avancé (fancy indexing)

On peut indexer des tableaux numpy avec des slices, mais aussi par des tableaux de booléens (les masques) ou d'entiers : on appelle ces opérations plus évoluées du fancy indexing.

Les masques

>>> np.random.seed(3)
>>> a = np.random.random_integers(0, 20, 15)
>>> a
array([10,  3,  8,  0, 19, 10, 11,  9, 10,  6,  0, 20, 12,  7, 14])
>>> (a%3 == 0)
array([False,  True, False,  True, False, False, False,  True, False,
        True,  True, False,  True, False, False], dtype=bool)
>>> mask = (a%3 == 0)
>>> extract_from_a = a[mask] #on pourrait écrire directement a[a%3==0]
>>> extract_from_a #on extrait un sous-tableau grâce au masque
array([ 3,  0,  9,  6,  0, 12])

Extraire un sous-tableau avec un masque produit une copie de ce sous-tableau, et non une vue

>>> extract_from_a = -1
>>> a
array([10,  3,  8,  0, 19, 10, 11,  9, 10,  6,  0, 20, 12,  7, 14])

L'indexation grâce masques peut être très utile pour l'assignation d'une nouvelle valeur à un sous-tableau

>>> a[mask] = 0
>>> a
array([10,  0,  8,  0, 19, 10, 11,  0, 10,  0,  0, 20,  0,  7, 14])

Indexer avec un tableau d'entiers

>>> a = np.arange(10)
>>> a[::2] +=3 #pour ne pas avoir toujours le même np.arange(10)...
>>> a
array([ 3,  1,  5,  3,  7,  5,  9,  7, 11,  9])
>>> a[[2, 5, 1, 8]] # ou a[np.array([2, 5, 1, 8])]
array([ 5,  5,  1, 11])

On peut indexer avec des tableaux d'entiers où le même indice est répété plusieurs fois

>>> a[[2, 3, 2, 4, 2]]
array([5, 3, 5, 7, 5])

On peut assigner de nouvelles valeurs avec ce type d'indexation

>>> a[[9, 7]] = -10
>>> a
array([  3,   1,   5,   3,   7,   5,   9, -10,  11, -10])
>>> a[[2, 3, 2, 4, 2]] +=1
>>> a
array([  3,   1,   6,   4,   8,   5,   9, -10,  11, -10])

Quand on crée un tableau en indexant avec un tableau d'entiers, le nouveau tableau a la même forme que le tableau d'entiers

>>> a = np.arange(10)
>>> idx = np.array([[3, 4], [9, 7]])
>>> a[idx]
array([[3, 4],
       [9, 7]])
>>> b = np.arange(10)

>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> i = np.array( [ [0,1],
...              [1,2] ] )
>>> j = np.array( [ [2,1],
...              [3,3] ] )
>>> a[i,j]
array([[ 2,  5],
       [ 7, 11]])


Reprenons nos données de statistiques du pourcentage de femmes dans la recherche (tableaux data et organisms)

  1. Créer un tableau sup30 de même taille que data valant 1 si la valeur de data est supérieure à 30%, et 0 sinon.
  2. Créez un tableau contenant l'organisme avec le pourcentage de femmes le plus élévé de chaque année.

Le broadcasting

Les opérations élémentaires sur les tableaux numpy (addition, etc.) sont faites élément par élément et opèrent donc des tableaux de même taille. Il est néanmoins possible de faire des opérations sur des tableaux de taille différente si numpy` arrive à transformer les tableaux pour qu'ils aient tous la même taille : on appelle cette transformation le broadcasting (jeu de mots intraduisible en français).

L'image ci-dessous donne un exemple de


ce qui donne dans Ipython:

>>> a = np.arange(0, 40, 10)
>>> b = np.arange(0, 3)
>>> a = a.reshape((4,1)) #il faut transformer a en tableau "vertical"
>>> a + b
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

On a déjà utilisé le broadcasting sans le savoir

>>> a = np.arange(20).reshape((4,5))
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
>>> a[0] = 1 # on égale deux tableaux de dimension 1 et 0
>>> a[:3] = np.arange(1,6)
>>> a
array([[ 1,  2,  3,  4,  5],
       [ 1,  2,  3,  4,  5],
       [ 1,  2,  3,  4,  5],
       [15, 16, 17, 18, 19]])

On peut même utiliser en même temps le fancy indexing et le broadcasting : reprenons un exemple déjà utilisé plus haut

>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> i = np.array( [ [0,1],
...              [1,2] ] )
>>> a[i, 2] # même chose que a[i, 2*np.ones((2,2), dtype=int)]
array([[ 2,  6],
       [ 6, 10]])

Le broadcasting peut sembler un peu magique, mais il est en fait assez naturel de l'utiliser dès qu'on veut veut résoudre un problème où on obtient en sortie un tableau avec plus de dimensions que les données en entrée.

Exemple : construisons un tableau de distances (en miles) entre les villes de la route 66 : Chicago, Springfield, Saint-Louis, Tulsa, Oklahoma City, Amarillo, Santa Fe, Albucquerque, Flagstaff et Los Angeles.

>>> mileposts = np.array([0, 198, 303, 736, 871, 1175, 1475, 1544,
...                         1913, 2448])
>>> tableau_de_distances = np.abs(mileposts - mileposts[:,np.newaxis])
>>> tableau_de_distances
array([[   0,  198,  303,  736,  871, 1175, 1475, 1544, 1913, 2448],
       [ 198,    0,  105,  538,  673,  977, 1277, 1346, 1715, 2250],
       [ 303,  105,    0,  433,  568,  872, 1172, 1241, 1610, 2145],
       [ 736,  538,  433,    0,  135,  439,  739,  808, 1177, 1712],
       [ 871,  673,  568,  135,    0,  304,  604,  673, 1042, 1577],
       [1175,  977,  872,  439,  304,    0,  300,  369,  738, 1273],
       [1475, 1277, 1172,  739,  604,  300,    0,   69,  438,  973],
       [1544, 1346, 1241,  808,  673,  369,   69,    0,  369,  904],
       [1913, 1715, 1610, 1177, 1042,  738,  438,  369,    0,  535],
       [2448, 2250, 2145, 1712, 1577, 1273,  973,  904,  535,    0]])


Bonnes pratiques

Sur l'exemple précédent, on peut noter quelques bonnes (et mauvaises) pratiques :

  • Donner des noms de variables explicites (pas besoin d'un commentaire pour expliquer ce qu'il y a dans la variable).
  • Mettre des espaces après les virgules, autour des =, etc. Un certain nombre de règles pour écrire du "beau" code (et surtout, utiliser les mêmes conventions que tout le monde !) sont données par le Style Guide for Python Code et la page Docstring Conventions (pour organiser les messages d'aide).
  • Sauf exception (ex : cours pour francophones ?), donner des noms de variables en anglais, et écrire les commentaires en anglais (imaginez récupérer un code commenté en russe...).

Beaucoup de problèmes sur grille ou réseau peuvent aussi utiliser du broadcasting. Par exemple, si on veut calculer la distance à l'origine des points sur une grille 10x10, on peut faire

>>> x, y = np.arange(5), np.arange(5)
>>> distance = np.sqrt(x**2 + y[:, np.newaxis]**2)
>>> distance
array([[ 0.        ,  1.        ,  2.        ,  3.        ,  4.        ],
       [ 1.        ,  1.41421356,  2.23606798,  3.16227766,  4.12310563],
       [ 2.        ,  2.23606798,  2.82842712,  3.60555128,  4.47213595],
       [ 3.        ,  3.16227766,  3.60555128,  4.24264069,  5.        ],
       [ 4.        ,  4.12310563,  4.47213595,  5.        ,  5.65685425]])

On peut représenter les valeurs du tableau distance en niveau de couleurs grâce à la fonction pylab.imshow (syntaxe : pylab.imshow(distance). voir l'aide pour plus d'options).


Remarque : la fonction numpy.ogrid permet de créer directement les vecteurs x et y de l'exemple précédent avec deux "dimensions significatives" différentes

>>> x, y = np.ogrid[0:5, 0:5]
>>> x, y
       [4]]), array([[0, 1, 2, 3, 4]]))
>>> x.shape, y.shape
((5, 1), (1, 5))
>>> distance = np.sqrt(x**2 + y**2)

np.ogrid est donc très utile dès qu'on a des calculs à faire sur un réseau. np.mgrid fournit par contre directement des matrices pleines d'indices pour les cas où on ne peut/veut pas profiter du broadcasting

>>> x, y = np.mgrid[0:4, 0:4]
>>> x
array([[0, 0, 0, 0],
       [1, 1, 1, 1],
       [2, 2, 2, 2],
       [3, 3, 3, 3]])
>>> y
array([[0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3]])

Exercice de synthèse : un médaillon pour Lena

Nous allons faire quelques manipulations sur les tableaux numpy en partant de la célébre image de Lena (http://www.cs.cmu.edu/~chuck/lennapg/). scipy fournit un tableau 2D de l'image de Lena avec la fonction scipy.lena

>>> import scipy
>>> lena = scipy.lena()

Voici quelques images que nous allons obtenir grâce à nos manipulations : utiliser différentes colormaps, recadrer l'image, modifier certaines parties de l'image.

  • Utilisons la fonction imshow de pylab pour afficher l'image de Lena.
In [3]: import pylab
In [4]: lena = scipy.lena()
In [5]: pylab.imshow(lena)
  • Lena s'affiche alors en fausses couleurs, il faut spécifier une colormap pour qu'elle s'affiche en niveaux de gris.
In [6]: pylab.imshow(lena, pl.cm.gray)
In [7]: # ou
In [8]: gray()
  • Créez un tableau où le cadrage de Lena est plus serré : enlevez par exemple 30 pixels de tous les côtés de l'image. Affichez ce nouveau tableau avec imshow pour vérifier.
In [9]: crop_lena = lena[30:-30,30:-30]
  • On veut maintenant entourer le visage de Lena d'un médaillon noir. Pour cela, il faut

    • créer un masque correspondant aux pixels qu'on veut mettre en noir. Le masque est défini par la condition (y-256)**2 + (x-256)**2
In [15]: y, x = np.ogrid[0:512,0:512] # les indices x et y des pixels
In [16]: y.shape, x.shape
Out[16]: ((512, 1), (1, 512))
In [17]: centerx, centery = (256, 256) # centre de l'image
In [18]: mask = ((y - centery)**2 + (x - centerx)**2)> 230**2


  • affecter la valeur 0 aux pixels de l'image correspondant au masque. La syntaxe pour cela est extrêmement simple et intuitive :
In [19]: lena[mask]=0
In [20]: imshow(lena)
Out[20]: <matplotlib.image.AxesImage object at 0xa36534c>
  • Question subsidiaire : recopier toutes les instructions de cet exercice dans un script medaillon_lena.py puis exécuter ce script dans Ipython avec %run medaillon_lena.py.

Conclusion : que faut-il savoir faire sur les tableaux numpy pour démarrer ?

  • Savoir créer des tableaux : array, arange, ones, zeros.

  • Connaître la forme du tableau avec array.shape, puis faire du slicing pour obtenir différentes vues du tableau : array[::2], etc. Changer la forme du tableau avec reshape.

  • Obtenir une partie des éléments d'un tableau et/ou en modifier la valeur grâce aux masques

    >>> a[a<0] = 0
  • Savoir faire quelques opérations sur les tableaux comme trouver le max ou la moyenne (array.max(), array.mean()). Pas la peine de tout retenir, mais avoir le réflexe de chercher dans la doc

  • Pour une utilisation plus avancée : maîtriser l'indexation avec des tableaux d'indices entiers, et le broadcasting. Connaître plus de fonctions de numpy permettant de réaliser des opérations sur les tableaux.


2010-04-07 using grin

2010-04-07 16:01:04
  • I just discovered grin, "grep my way"

  • install:

    sudo easy_install grin
  • search recursively

    grin  expression
  • search recursively in a specific directory

    grin  expression /this/directory
  • search recursively python files

    grin -I "*.py"  expression


2010-03-15 securing the server

This page is word-editable, please edit if you find an error.

  • SSH (Secure Shell) is installed on most systems (here GnuLinuxUbuntu and MacOsX) so don't panic about compilations (try Putty on Windows). Try a simple ssh-V to check version or whichssh to locate the binary.
  • Thanks to ssh, you can transport all your data (accessing files, merging repositories, lauching remote X programs) transparently using a secure connection. Thanks to tunneling, this is also simpler thus more secure for your computer and your provider. Having all security located in one interface sure is a big advantage: once your SSH communication channel is set-up, you should only focus on what you wish to do (SVN, etc...).
  • Most documentation may be found in manssh, manssh-keygen (remember that thanks to the underlying pager system, you can search for a keyword, for instance hello, by typing \hello[ENTER]). Many other sources of help exist, such as this FAQ

Setting up SSH: spreading the good keys

  1. There are many ways to authenticate your session, but mainly password or keys. Keys are to be preferred to avoid typing your password 10 times a day. It is also most secure (you type your key's password locally and not remotely).

  2. Generate a private/public key pair. Simple command to do this:

    ssh-keygen -t rsa
  3. Copy the key to the

    ssh-copy-id -i ~/.ssh/id_rsa.pub username@host

    . this can be also be done using

    scp ~/.ssh/id_rsa.pub username@host:~/mykey.pub
    ssh username@host
    cat mykey.pub >> .ssh/authorized_keys
  4. Now try logging into the remote machine again from local

    ssh REMOTE_USERNAME@remote_host
  5. Check that your public key is in the list of authorized keys: .ssh/authorized_keys.

  6. Change password regularly:

    ssh-keygen -p

    It is not advised to put an empty pass-phrase, rather use key agent (see below).


  • it is possible to create alias of the ssh binary to hostnames... but more simply, you may put

    alias myserver='ssh -Y -p2221 myuser@myserver.domain.com'

    where 2221 is here the port used by the SSH server on myserver.domain.com

  • more cleanly, you may edit your `` .ssh/config`` file with:

    Host myserver.domain.com
            User myuser
            Port 2221

    Be careful that properties are right : chmod600~/.ssh/config

key agent

  • An agent loads your keys on the local machines:
    • it's more secure, since all passwords are typed locally, you only send encrypted authentifications
    • it's more practical, since you type your password once per session
  • http://www.sshkeychain.org/mirrors/SSH-with-Keys-HOWTO/
  • GUI interface on MacOsX : http://www.sshkeychain.org/
    • install with macports using sudoportinstallSSHKeychain, you'll find it in /Applications/MacPorts

securing the server

  • Robots usually try common name / password combinations on your SSH server. If you're the only user admin_name of your server you may use in the SSH server configuration file (usually /etc/ssh/sshd_config) the option AllowUsersadmin_name to restrict access to user admin_name and avoid brute force attacks. Since robots are most of the time dumb, they'll get an immediate accesdenied response to any connection request.
  • Robots usually sniff port 22. To change the port which is listened by the SSH server, either modify the default port in the SSH server configuration file (usually /etc/ssh/sshd_config). Another way is to use your router to redirect the outside port (for instance 2221) to the default port of your server.


2010-02-11 Neuroinformatique et neurosciences computationnelles

Le programme interdisciplinaire "Neuroinformatique et neurosciences computationnelles" lance son appel d'offres 2010 Neuroinformatique et neurosciences computationnelles - Appel d'offres:

notre proposition



    • Neurosciences et neuroinformatiquecomputationnelle Neuro-IC
    • Déclaration de candidature
      • Titre bref du Projet:(maximum 20 caractères) Émergencein computo

Titre long du Projet:(maximum 3 lignes) Collaborations multi-disciplinaires entre des équipes de neurosciences marseillaises pour une approche intégrative de l'étude de stratégies computationnelles.

Coordinateur du projet : M. Prénom : Laurent Nom :PERRINET Fonction :CR CNRS Laboratoire (nom complet et sigle, le cas échéant) : Institut de Neurosciences Cognitives de la Méditerranée (INCM – UMR 6193) Adresse complète du laboratoire : 31, chemin Joseph Aiguier 13402 Marseille cedex Courriel : Laurent.Perrinet@incm.cnrs-mrs.fr Tél :(0-33) 4 91 16 43 08 Fax :(0-33) 4 91 22 08 75

court CV du porteur du projet (1 page)

  • Chercheur (CR1) à l**'INCM,CNRS, depuis 10/2004 · Sous la conduite de Guillaume Masson à l'Institut de Neurosciences Cognitives de la Méditerranée (INCM-UMR 6193, CNRS) à Marseille, j'étudie des modèles d'inférence spatio-temporels dans des flux video. Cette étude a pour but de définir un algorithme neuro-mimétique adaptatif de représentation sur-complète d'un flux video que nous désirons appliquer à l'extraction du champ de vitesse.
  • Doctorat de Sciences cognitivesONERA/DTIM, Toulouse (France) 10/1999-2/2003 - Titre : Comment déchiffrer le code impulsionnel de la Vision? Étude du flux parallèle, asynchrone et épars dans le traitement visuel ultra-rapide. · Allocataire d'une bourse MENRT, accueil à l'ONERA/DTIM. · Cette thèse a été initiée par les résultats de la collaboration pendant le stage de DEA. Elle a été dirigée par Manuel Samuelides (professeur à Supaéro et chargé de recherche à l'ONERA/DTIM) et co-dirigée par Simon Thorpe (directeur de recherche au CerCo)
  • DEA de Sciences cognitives (Univ. Paris VII, P. Sabatier, EHESS, Polytechnique), Paris (France), mention TB. Allocataire d'une bourse de DEA. 9/1998-9/1999 · 3/1999-7/1999 Assistant de recherche, ONERA/DTIM (Département de Traitement de l'Image et de Modélisation), Toulouse (stage de DEA). · 7/1999-8/1999 Assistant de recherche, USAFB (Rome, NY) / University of San Diego in California (États-Unis).
  • Diplôme d'ingénieurSupaéro, Toulouse, France. 1993 - 1998 Spécialisation dans le traitement du signal et de l'image et plus particulièrement dans les techniques des réseaux de neurones artificiels. · 4/1998-9/1998 Assistant de recherche, CerCo (CNRS, UMR5549), Toulouse (stage de fin d'études d'ingénieur). Développement d'un réseau de neurones asynchrone appliqué à la reconnaissance de caractère. · 4/1997-9/1997 Assistant de recherche, Jet Propulsion Laboratory (Nasa), Pasadena, Californie. Département des Sciences de la Terre, Laboratoire d'imagerie radar, Interférométrie SAR · 9/1995-6/1996 Ingénieur Alcatel, Vienne (Autriche). Département du Voice Processing Systems. Budget demandé (sommairement présenté) et durée du projet: 30 k€ /2 ans Le budget sera notifié en une fois. Le programme n’attribuera aucun moyen humain. - 20 k€ : matériel computationnel (voir devis inclus), - 7k€: organisation d'un colloque et d'un atelier, - 3k€: missions, communication. Ce projet a-t-il été déjà évalué ou fait-il l’objet d’une demande en cours ? Dans quel cadre ? A quelle date ? Ce projet n'a pas été évalué précédemment. Plus précisément, ce projet fait-il partie d’une demande présentée à l’ANR dans les deux dernières années ou sera –t-il présenté dans l’année en cours ? Non. A-t-il été accepté ? Si en cours, à quelle date prévoyez-vous une réponse ? Demandez-vous un autre financement ? Précisez dans quel cadre, la somme demandée et la durée du contrat. Non.

Équipes participant au projet:

Nom de l’équipe Nom et prénom du responsable N° d’identification du laboratoire
DyVA (Anna Montagnini, Laurent Perrinet) MASSON Guillaume UMR 6193
DNA (Andrea Brovelli) BOUSSAOUD Driss UMR 6193
Neurosciences Théoriques et Système Complexes (Jean-Luc Blanc) PEZARD Laurent UMR 6149
Contrôle et apprentissage des déplacements finalisés (Emmanuel Daucé) MONTAGNE Gilles UMR 6233

Émergence'' in computo''

__'''Résumé du projet :'''__

Actuellement, une nouvelle classe de calculateurs émerge qui privilégie le parallélisme sur la vitesse de calcul du processeur central. Cette nouvelle technologie diverge de l'architecture classique de Von Neumann pour se rapprocher d'architectures neuro-mimétiques. En particulier, elle nécessite d'étudier spécifiquement comment une telle architecture peut coordonner des calculs distribués, à différentes échelles, mais aussi comment cette architecture peut devenir adaptative et apprendre en fonction de coûts fonctionnels déterminés. Elle offre donc une double chance pour la communauté des neurosciences computationnelles: elle donne des outils de calcul plus efficaces car plus proches des modèles neuro-mimétiques, mais aussi ouvrent un champ d'application pour cette nouvelle classe de calculateurs. Ce projet vise à regrouper différents acteurs marseillais venant de disciplines différentes (neuro-physiologie, psychologie, modélisation, statistique inférentielle, théorie de l'information) autour du thème de l'émergence de nouvelles stratégies computationnelles dans des circuits neuro-mimétiques.

__'''Exposé scientifique du projet:'''__

''' Contexte '''

A l'interface des études électro-physiologiques et de la modélisation, la simulation de grands réseaux de neurones a pour but de tester in silico certaines hypothèses fonctionnelles concernant l'activité et les interactions entre populations de neurones, allant de quelques centaines à quelques centaines de milliers. Ces études visent à pallier certains angles morts liés à l'absence d'outils de mesure concernant principalement les schémas de connexion. L'idée est de pouvoir tester avec un outil fiable et normalisé les hypothèses portant sur ces circuits et les patrons d'interaction de l'échelle du micron à quelques millimètres.

L'outil informatique est un complément essentiel des études électro-physiologiques et est malheureusement encore trop peu développé. Il s'agit donc avant tout d'une culture de la simulation qui est à promouvoir et développer dans les laboratoires de neurosciences. Dans le cadre du projet de regroupement de plusieurs laboratoires sur le site de la Timone à Marseille, un groupe de travail sur les neurosciences computationnelles s'est formé. Le but de ce groupe est bien sûr de favoriser les échanges scientifiques sur des problématiques propres aux neurosciences computationnelles, ainsi que d'animer la communauté par des invitation et des ateliers ponctuels. Or ce groupe possède un fort potentiel interdisciplinaire et il apparaît que son activité pourrait également se structurer autour d'un projet commun, sur lequel chacun apporterait sa pierre : une plate-forme de développement reposant sur une architecture multi-processeur massivement parallèle, utilisant des standards ouverts et actuels (python, MPI,...). L'idée est de construire un outil de simulation propre à la communauté, destiné à focaliser toute la demande en "computationnel" (c'est-à-dire non spécifiquement destinée à l'analyse de données).

Cet outil pourrait servir de base pour initialiser, populariser et structurer cette approche auprès de la communauté des neurosciences, avec comme objectif de proposer à moyenne échéance une interface intuitive sur laquelle certaines idées où des schémas computationnels pourraient être testés sans connaissance en programmation multi-tâche. Cette interface prendra en pratique la forme d'un outil de simulation et d'analyse des données piloté par une interface "web". Cet outil pourrait également servir à la formation des étudiants, avec une idée d'unification des outils et le développement d'un langage de description commun basé sur des normes de description standardisés.

'''Définition et réalisation du projet '''

Actuellement, la limite principale aux validations d'hypothèses scientifiques en neurosciences computationnelles est la capacité à traduire et valider ces idées sous la forme d'un code informatique. Le projet "Émergencein computo" vise à regrouper des acteurs marseillais autour de l'émergence de nouvelles stratégies computationnelles dans des circuits neuro-mimétiques. Si chacun des acteurs provient d'une discipline différente, l'étude de leur thématique respective montre qu'il est naturel de les regrouper autour de ce thème commun. L'approche que nous considérons la plus productive est alors de structurer la recherche menée par ces acteurs grâce à une infrastructure commune afin de stimuler la production de résultats computationnels de plus large envergure. En effet, cette mise en commun de moyens pour un groupe de travail issu d'équipes différentes permettra de développer des recherches transversales à l'interface de la théorie de l'information, du traitement du signal et de la modélisation. Aborder ces problématiques différentes sur un outil commun favorisera le rapprochement de points de vue entre disciplines séparées : utilisation de méthodes probabilistes communes à l'analyse des données et à la modélisation, utilisation de description dynamiques similaires pour les points de vue macro-, méso- et micro-scopiques, mise en commun de méthodes non biaisées pour l'estimation statistique de quantités d'information ou encore utilisation d'une formalisation et de codes inter-échangeables. Le financement de ce projet est donc essentiel pour ouvrir ces perspectives: * donner rapidement les moyens de travailler ensemble grâce à un outil de calcul puissant,

  • faire émerger des collaborations inter-disciplinaires autour d'un "langage" commun: Il permettra de dialoguer avec un langage de programmation, des librairies et une terminologie communes, en collaboration avec l'initiative NeuralEnsemble,
    • donner une tribune pour cette initiative : En particulier, l'organisation rapide d'une conférence nous permettra d'inviter des personnalités scientifiques qui nous aideront à définir les problématiques communes. L'atelier nous permettra lui de partager avec la communauté marseillaise mais aussi avec nos collaborateurs proches. Il aura lieu une fois le projet mûr et de façon pratique en partageant approches, techniques et résultats.
'''Présentation des thématiques par les acteurs du projet '''

Jean-Luc Blanc IR CNRS, équipe : Neurosciences Théoriques et Système Complexes

Codage neuronal et théorie de l'information: Un problème fondamental est de comprendre comment l’activité d’une population de neurones, observée dans la fréquence ou l’organisation temporelle des trains de potentiels d'action ou dans les potentiels de champs locaux, porte de l’information sur le monde extérieur. Il existe deux méthodes complémentaires pour étudier quantitativement comment le cerveau extrait les caractéristiques et déchiffre les informations encodées dans l’activité de la population neuronale : les algorithmes de décodage et la théorie de l’information. La première méthode prédit un stimulus ou comportement à partir d’un pattern de réponses neuronales. La deuxième précise la quantité d’information contenue dans l’activité neuronale à propos des stimuli, cette quantité est calculée en utilisant le formalisme de la théorie de l’information de Shannon. L'étude des relations statistiques entre les réponses corticales et les stimuli est souvent réalisée dans le cadre de la théorie de l'information pour quantifier l’information transmise par les réponse neuronale par rapport à un ensemble des stimuli. Cette approche a notamment l'avantage de permettre de définir un ensemble optimal de stimuli (ou de représentations neuronales) qui maximise l’information mutuelle entre les stimuli et les réponses. Une procédure adaptative permet de déterminer ces ensembles de manière itérative (Blahut-Arimoto, 1972). Indicateurs pour les systèmes complexes et dynamique de séquences symboliques:Les études expérimentales du système nerveux impliquent l'enregistrement de l'évolution temporelle de l'activité corticale, qui sont comparables à des séquences de symboles. En suivant ce point de vue, le système nerveux, qu'il soit chaotique ou non, est capable de générer des messages et peut donc être considéré comme une source d'information. En s'inspirant de l'idée de Kolmogorov de caractériser les systèmes dynamiques par des quantités comme l'entropie, il est possible d'estimer cet indicateur à partir de signaux expérimentaux provenant de différentes échelles d'observation (EEG, LFP, spikes). Cependant l'estimation d'un tel index (asymptotique) est souvent biaisé par la quantité de donnée limitée et par la structure de corrélation des données. Certaines approches algorithmiques permettent de contourner cette limitation.

** Andrea Brovelli** CR1 CNRS, équipe: Dynamique Neuronale et Apprentissage

Les humains et les singes ont une capacité remarquable à apprendre de nouvelles relations arbitraires entre un stimulus visuel, une action et la conséquence de cette action. L'apprentissage visuomoteur arbitraire est une forme de conditionnement instrumental (ou opérant) qui nous permet d'apprendre les conséquences de nos actes dans un contexte donné (par exemple, ne pas toucher une plaque électrique lorsqu'elle est allumée). Cette fonctionnalité nous assure une grande capacité d'adaptation face aux situations nouvelles et nous permet également de développer des habitudes robustes lorsque le contexte est stable. De plus, certains comportements pathologiques, tels que les désordres compulsifs obsessionnels, et, plus vraisemblablement les addictions, sont étroitement liés à cette faculté cognitive. La compréhension des principes fondamentaux et de leurs implémentations neurales représente un défi important pour les neurosciences cognitives modernes. Mon objectif est de comprendre comment le cortex frontal et les ganglions de la base régissent l'apprentissage instrumental. Plus précisément, on cherchera à identifier le rôle fonctionnel des boucles fronto-striatales et caractériser leur dynamique d'activation au cours de l'apprentissage. Les travaux sont menés à la fois chez le primate humain et non-humain, en s'attachant à intégrer les connaissances issues de ces deux espèces, grâce en particulier à l'application chez l'homme de tâches comportementales développées chez le singe. Notre approche combine les données comportementales et neurales enregistrés à différents niveaux dans le cerveau (activité unitaire, LFPs, EEG intracrânien, IRMf) avec des modèles computationnels de l'apprentissage. Le but à long-terme est d'élucider les liens entre la plasticité cérébrale au cours de l'apprentissage à différents niveaux d'analyse du neurone simple aux réseaux cérébraux.

Emmanuel Daucé Enseignant-chercheur, maître de conférences à l'école centrale de Marseille, équipe: Contrôle et apprentissage des déplacements finalisés.

Nous considérons l'étude analytique ou par simulation des comportements collectifs de populations de neurones. L'étude analytique vise à estimer les comportements attendus des grands ensembles de neurones en fonction des paramètres macroscopiques définissant les catégories de liens entre populations. Différents régimes dynamiques peuvent ainsi être définis, ainsi que des grandeurs dites de "champ moyen" fournissant une description concise de l'activité d'une population entière. Le travail de simulation vient en complément pour aborder des questions pour lesquelles il est plus difficile d'effectuer des prédictions, comme par exemple lorsque l'on considère l'effet de la plasticité synaptique. Dans ce cas, il est fait appel à des concepts et méthodes venus de l'apprentissage automatique (apprentissage de politiques sur la base de signaux de récompenses, codage par fonctions noyaux), appliquées à des dispositifs de contrôle et réseaux de neurones biologiquement inspirés. Des simulations massives servent alors à valider les schémas proposées qui doivent obéir à la double contrainte d'être efficaces (performance accrue au cours de l'apprentissage) et réalistes (en particulier respecter la contrainte de localité de l'information, ce qui exclut de nombreux schémas classiques utilisant des information "off-line" et non locales).

Anna MontagniniCR2 CNRS, équipe: Dynamique de la Perception Visuelle et de l'Action

Je m'intéresse au contrôle visuo-oculomoteur chez les sujets humains en tant que modèle idéal de prise de décision dans des conditions simplifiées et bien contrôlées au niveau expérimental. J'utilise une approche couplée entre expérimentation (psychophysique et analyse des mouvements oculaires à haute résolution) et modélisation (représentation probabiliste de l'information, inférence, théorie de la décision). En particulier, dans le cadre d'un processus simple de décision visuo-oculomotrice (c.f. poursuite oculaire d'une cible en mouvement vers une direction randomisée à chaque essai), je m'intéresse à l'étude de la représentation interne de l'information a priori et de son incertitude. Par information a priori on entend ici l'information préalable à l'observation du stimulus sensoriel qui détermine la réponse motrice correcte: il s'agit donc d'une information prédictive. Dans les expériences, l'information a priori est manipulée statistiquement, de manière à introduire un biais de probabilité dans le type de réponse requise et donc créer des attentes «asymétriques». Ces attentes (ou représentation interne du Prior) se traduisent dans une variable comportementale mesurable, les mouvements d'anticipation de Poursuite Oculaire, qui permettent d'étudier la dépendance du Prior de la statistique de l'entrée sensorielle, ainsi que l'évolution dynamique de cette représentation interne.

Laurent PerrinetCR2 CNRS, équipe: Dynamique de la Perception Visuelle et de l'Action

  • Un problème fondamental en neurosciences est de comprendre comment l'information locale représentée sur le champ récepteur des neurones peut permettre de voir l'émergence d'une perception ou d'un décision comportementale qui soit globale. Je m'intéresse à relier des méthodes de disciplines a priori éloignées (probabilités, physique statistique, informatique, neuroscience) pour proposer des solutions à ce problème. Appliqué à la vision, nous étudions en particulier des stratégies d'intégration spatio-temporelle en les confrontant à des données d'imagerie ou comportementales. Celle-ci sont comparées à des solutions utilisant des représentations distribuées probabilistes qui sont optimales au sens de la théorie de l'information. Elles permettent en particulier d'expliquer comment le système visuel peut intégrer des informations dynamiques, bruitées et souvent ambiguës en utilisant des stratégies inférentielles, comme par exemple par la propagation d'informations prédictives. Ces systèmes sont éminemment contraints par la dynamique et la connectivité des neurones qui les constituent. J'étudie en particulier comment relier la structure de ces systèmes dynamiques avec les fonctions qu'ils implantent. Pour cela, j'utilise des modèles d'apprentissage non-supervisés appliqués à des scènes naturelles. J'étudie alors l'émergence dans la connectivité neuronale de structures qui optimisent un coût fonctionnel. Ces modèles permettent d'étudier des catégories différentes de résultats en fonction de paramètres fondamentaux de l'entrée sensorielle -comme sa complexité par rapport à la taille du réseau- ou des neurones -comme la vitesse de conduction latérale maximale dans une aire corticale. Ce dernier exemple montre la généralité de l'effet de contraintes locales simples avec des effets macroscopiques importants et qui sont essentiels pour des stratégies de calculs parallèles. En effet, elle conditionne la synchronisation, même partielle, de l'information sur l'état des différents nœuds du système pris globalement.


Le projet "Émergence in computo" rassemble des acteurs de disciplines différentes mais de thématiques fortement inter-connectées. Nous pouvons identifier dans les thématiques présentées ci-dessus une approche commune centrée autour du rôle de l'apprentissage et des représentations internes. En particulier, nous voyons émerger les thèmes suivants:

  1. Modélisation des populations neuronales: codage et plasticité (Andrea Brovelli, Emmanuel Daucé, Laurent Perrinet),
  2. Analyse de l'activité neuronales à différents échelles: codage neuronal et plasticité, apprentissage supervisé (Jean-Luc Blanc, Andrea Brovelli, Emmanuel Daucé),
  3. Modélisation comportementale et représentations internes (Jean-Luc Blanc, Anna Montagnini, Laurent Perrinet).

Ce projet vise à financer les moyens computationnels et scientifiques nécessaires à la réalisation de telles perspectives. C'est pourquoi le support de Neuro-IC est essentiel à la réalisation du projet "Émergencein computo". Ces moyens sont de trois ordres:

  • une plateforme commune de calcul sous forme d'un "cluster" (voir devis inclus) : 20k€,
  • de l'animation scientifique, par l'organisation d'un conférence et d'un atelier : 7k€,
  • des moyens de fonctionnement : 3k€.
    • Le budget total de ce projet est donc de 30k€.

Neuroinformatique et neurosciences computationnelles

  • Contexte
  • Objectifs et plus-value attendue
  • Descriptif du programme
  • Enjeu scientifique interdisciplinaire


Comprendre le cerveau reste encore à l’heure actuelle un défi majeur pour les scientifiques de toutes disciplines. Le cerveau représente la structure la plus complexe jamais construite par la nature: cent milliards (1011) de neurones connectés par un réseau d'une complexité inimaginable (1014 à 1015 connections), et qui est capable de traiter des informations très complexes en un temps record, comme l'analyse instantanée d'une scène visuelle. Ce traitement d'information se fait au travers de la mise en action simultanée de groupes de neurones qui forment des patrons d'activité spécifiques. La grande complexité du cerveau lui permet non seulement de traiter des informations complexes, mais aussi elle rend le cerveau d'autant plus vulnérable à divers dysfonctionnements, qui résultent en pathologies telles que la schizophrénie, l'épilepsie, les troubles de la mémoire, du language, etc.

La compréhension des mécanismes cérébraux dépasse donc largement la recherche fondamentale: elle possède des implications directes dans la compréhension et le traitement de pathologies. Elle possède aussi des implications directes au niveau technologique, dans la construction de machines capables de traiter l'information de façon « intelligente », tel que le traitement d'informations du monde réel, scènes visuelles, auditives, etc.

Les neurosciences computationnelles représentent une discipline relativement récente et dynamique, et dont le but affiché est de comprendre le cerveau par des moyens théoriques et informatiques. Cette discipline combine l'expérimentation avec la théorie et les simulations numériques, ce qui permet d'ouvrir toute une série de possibilités nouvelles au niveau scientifique et d'applications technologiques. La neuroinformatique concerne plus spécifiquement les aspects informatiques, tels que la conception et la réalision de méthodes d’analyse mathématiques, la constitution de bases de données en neurosciences et les outils qui s’y rapportent. Les neurosciences computationnelles et la neuroinformatique combinent donc des spécialistes d'horizons différents, tels que les biologistes, physiciens, mathématiciens, informaticiens, ingénieurs, et médecins. Ces spécialistes identifient les principes du fonctionnement cérébral, et ils formalisent ces principes sous forme de modèles théoriques qui sont ensuite testés par la simulation numérique. Ces modèles peuvent également être implémentés directement sur des circuits électroniques, dans le but de créer de nouvelles générations de calculateurs. Ils peuvent aussi être utilisés comme outil pour investiguer les dysfonctionnements du cerveau, en particulier dans le cas où les pathologies résultent d’interactions multiples.

haut de page

Mais plutôt que de représenter des domaines séparés, les neurosciences théoriques et expérimentales fonctionnent souvent ensemble, de façon synergique. Aux USA et en Europe, il existe de nombreux centres où les laboratoires expérimentaux et théoriques se côtoient, comme les centres Bernstein allemands ou Gatsby anglais, le Brain & Mind Institute et l’Institute for Neuroinformatics en Suisse, le RIKEN Institute au Japon, et les nombreux centres américains (Keck, Sloan, Swartz centers, etc) [Pour une liste des centres de neurosciences computationnelles, et leurs coordonnées sur Internet, voir : http://home.earthlink.net/~perlewitz/centers.html]. La France est plus timide à ce niveau, avec plusieurs unités INSERM ou CNRS qui combinent les expertises théoriques et expérimentales, mais aucun institut ou centre plus ambitieux n’a encore pu voir le jour (cfr. Faugeras, Samuelides & Frégnac, A future for systems and computational neuroscience in France ? J. Physiol. Paris 101 : 1-3, 2007).

À l’image de cette interaction théorie/expérience, de nombreux projets Européens ont vu le jour, et certains de ces projets ont une renommée internationale. Il faut noter l’existence de programmes spécifiquement inter-disciplinaires, comme le programme Future and Emerging Technologies (FET) de la Communauté Européenne, et qui vise à subventionner des projets pluri-disciplinaires, ambitieux et innovants. De nombreux projets de neurosciences, alliant la théorie et l’expérimentation, avec des nouvelles technologies, ont été subventionnés par ce programme. En particulier, des projets récents tels que FACETS, DAISY et SECO consistent à allier l’expérimentation biologique, pour caractériser les neurones et les circuits neuronaux, avec des approches théoriques pour formaliser ces principes biologiques, et ensuite l’ingénierie pour implémenter ces modèles sur des circuits intégrés. Il en résultera de nouvelles générations de circuits intégrés qui fonctionneront de façon analogue aux circuits neuronaux réels. Ces circuits pourront être utilisés pour tester des principes biologiques, et aider à l’exploration des propriétés des circuits neuronaux, suggérer de nouvelles expériences, etc, la boucle est bouclée. Une des réalisation de ces projets a été la conception de circuits intégrés contenant un grand nombre de neurones de type intègre-et-tire, qui permettront la simulation (analogique) de réseaux de centaines de milliers de neurones, avec une vitesse de calcul de 100,000 fois plus rapide que le temps réel, une performance qui dépasse celle des plus gros calculateurs parallèles !

Même si des groupes Français occupent une place importante dans des projets tels que FACETS et DAISY, il faut déplorer l’absence de programmes ambitieux à l’échelle nationale. Plusieurs actions ont vu le jour (ACI neurosciences computationnelles, programmes CTI et neuroinformatique, par exemple), et elles ont mené à des projets intéressants, mais leur budget limité n’a pas permis de vraiment structurer la communauté théorique et computationnelle en neurosciences. Réaliser une telle structuration, et la stabiliser, nécessiterait de mettre sur pied un réseau d’excellence avec un budget important et des postes pour les nombreux jeunes chercheurs du domaine. Par exemple, l’inititative récente des Bernstein Centers en Allemagne a permis de structurer le domaine de façon très significative en créant plusieurs centres, et de nombreux postes de chercheurs. Aucune initiative de cette envergure n'a encore pu voir le jour en France.

Objectifs et plus-value attendue

L'objectif du programme Neuro-IC est double :

  • de soutenir des actions fortement interdisciplinaires comme exposé ci-dessous. Le but de ce soutien est de jouer un rôle de tremplin vers la réalisation et l'élaboration de projets ambitieux qui combinent différentes disciplines, comme la biologie, la physique, l'ingénierie et l'informatique;
  • d'identifier différentes équipes fortes dans le domaine et qui formeraient le noyau d'un éventuel futur réseau d'excellence dans le domaine des neurosciences computationnelles et de la neuroinformatique.

Descriptif du programme

Le programme Neuro-IC soutiendra des projets de recherche fondamentale et de recherche appliquée sur des problématiques liées aux Neurosciences, abordées de manière interdisciplinaire avec la participation significative de chercheurs de disciplines telles que les Mathématiques, la Physique, l’Informatique, la Robotique ou le Traitement du signal. Une attention particulière sera donnée aux projets à l'interface neurosciences/sciences humaines. Le but du programme est en particulier de soutenir des actions interdisciplinaires qui constituent des projets aux idées radicalement nouvelles, de préférence entre partenaires qui n’ont jamais collaboré, et/ou jamais contribué à ce champ de recherche. Les projets qui comportent un facteur de risque substantiel sont particulièrement encouragés. Typiquement, le programme soutiendra des actions à caractère exploratoire et dont le niveau de risque (et l’absence de données préliminaires) interdisent l’écriture d’un projet de type ANR ou européen. Le programme servira donc de tremplin vers l’élaboration de projets plus ambitieux – cet aspect fondateur sera particulièrement important dans l’évaluation des projets.

Il n’y a pas de restriction thématique pour autant que les projets allient clairement les neurosciences avec au moins une autre discipline, dans le cadre d'un projet de nature théorique, numérique ou d’ingénierie. A titre d'exemples de thèmes, on peut mentionner l’étude de la relation structure-fonction dans les réseaux neuronaux (lien entre connectivité et comportement), l’étude de la dynamique d’émergence d’états pathologiques, l’étude du codage neuronal, de l’attention ou de la cognition, ainsi que la conception de nouveaux types de calculateurs inspirés de l’architecture du cerveau, des projets de robotique bio-inspirée, ou encore des projets alliant expérimentation et modélisation sur des thèmes issus des sciences humaines et sociales. Le programme soutiendra les thèmes traditionnels de la neuroinformatique, tels que la constitution de bases de données en neuroscience, ou la conception de nouvelles méthodes d’analyse de données. L’aide à la conception et/ou l’étude de faisabilité de nouvelles techniques expérimentales en neuroscience (par exemple nouvelles techniques d’imagerie) sera également soutenue, pour autant que ce type d’étude soit exploratoire et fondateur. Enfin, l'application de nouvelles méthodes de la physique théorique aux neurosciences est encouragée.

Les budgets demandés seront typiquement du fonctionnement, de l’équipement et des missions, de l’ordre de 30,000 Eur. Le programme ne pourra pas financer de salaire. Il est important qu’il y ait une adéquation entre le projet demandé et le budget (les « recyclages » de projets antérieurs ne seront pas évalués). L'usage envisagé de la somme demandée doit faire l'objet d'un budget détaillé et clairement motivé (une page maximum).

Les demandes devront faire l'objet d'une présentation scientifique courte, 5 pages maximum (sans annexe, références incluses), complétée d'un CV bref des partenaires principaux (une page maximum). Les aspects exploratoires et interdisciplinaires doivent être explicités (ils constituent les critères principaux d’acceptation, en plus de l’excellence scientifique du projet). Chaque projet sera examiné par 2 ou 3 rapporteurs de disciplines différentes.

L’appel à projet sera publié début janvier, avec une date limite de soumission début février. Ceci permettra de financer les projets retenus en mars de l’année d’acceptation. Les subventions accordées, utilisables pour toute dépense à l'exception de salaires ou vacations, seront à dépenser avant le 31 décembre de la même année.

À l’issue du projet, il sera demandé aux auteurs de rédiger un rapport court (de l'ordre de 5 pages) sur les résultats obtenus au cours du projet et les développements qu’il a contribué à réaliser (publications, soumission de projet ANR ou Européen, démarrage d’autres projets plus ambitieux, etc).

Enjeu scientifique interdisciplinaire

Le rôle majeur de ce programme est de favoriser, par le rapprochement Neurosciences-Neuroinformatique, une meilleure dynamique dans l’approche de la complexité du système nerveux. Déjà opérationnelle dans quelques grands centres (Bernstein, Gatsby, Brain & Mind Institute, Institute for Neuroinformatics, RIKEN Institute, Keck, Sloan, Swartz centers, etc), cette approche contribue au développement de la recherche fondamentale mais aussi, dans des pathologies chroniques, graves et fréquentes (maladies neurodégénératives, paraplégie, douleur, maladies mentales) à la définition de nouvelles stratégies thérapeutiques (prothèse, robot, nanotechnologie et neurostimulation, réalité virtuelle et troubles de la représentation du corps dans l’autisme…). Cette approche est également indispensable dans la conception de nouvelles architectures de calcul, inspirées du cerveau.

Le programme Neuroinformatique et Neurosciences Computationnelles peut aussi être vu comme une étape préliminaire et nécessaire à un plan d’action structurant plus ambitieux à venir, et dont la mise en place dépendra de l’ambition scientifique des institutions concernées).


2010-02-03 quelques blogs français de science


2010-01-27 The original eve

2010-01-27 09:06:15
  • one common statement in popular science when speaking about evolution is that we all derive from a common ancestor, the "original eve". while a posteriori, it is true that mitochodrondrial DNA allows to trace back common ancestors in our heredity, it is certainly overstated. When thinking evolution, our focus is to look back from the present to our origins, but a the time of these "few" original eves, many different eves coexisted and acted -as parts of the whole population- in the evolution.
  • Evolution is more like a Banyan tree than a graph written on a board where species evolve from primitive forms into more and more complex forms, including an idealistic vision of our position on this tree.
  • even worse for the gap between reality and popular preconceptions about evolution: evolution is also lateral. More on this subject @ Horizontal and vertical: The evolution of evolution



2009-12-19 contributing to the python community


2009-12-11 which or that?

2009-12-11 16:48:35

From http://www.businesswritingblog.com/business_writing/2006/01/that_or_which.html

That usually introduces essential information in what is called a "restrictive clause." Which introduces extra information in a "nonrestrictive clause."
  1. Example from a recent email:
    • "I am offering a new class, Email Intelligence, that/which may be an excellent fit for your training needs and budget."
    • Does the clause (in red) introduce information that is essential to knowing which Email Intelligence class?
    • No. The clause provides extra information, so which is correct.
  2. Revised example:
    • "Among my new programs, I am offering a class that/which may be an excellent fit for your training needs and budget."
    • Does the clause (in red) introduce information that is essential to knowing which class?
    • Yes. The clause tells which class--a class that may be an excellent fit. Therefore, that is correct.