12/14/2015

Neural Network

Ein neuronales Netz? Ja, nein, vielleicht jein.
Natürlich handelt es sich bei diesem Experiment nicht um ein echtes neuronales Netz. Höchstens um einen kleinen Ausschnitt. Wenn überhaupt. Von der Anzahl an Nervenzellen  bewegen wir uns hier ungefähr auf dem Niveau eines Fadenwurms. Dessen Nervensystem besteht aus rund 300 Nervenzellen und das kommt der Anzahl der hier darstellbaren Neuronen sehr nah.
Das Ziel des Ganzen ist nicht die korrekte Darstellung von Abläufen in Nervensystemen, sondern eine einfache Visualisierung wie einzelne Neuronen miteinander Verknüpfungen eingehen können. Vielleicht könnte man hier von einer sehr vereinfachten Visualisierung von „Computational Neuroscience“ sprechen.
Die Partikel sind hierbei die Neuronen und die Verbindungslinien deren Verknüpfungen. Verknüpfungen kommen dann zustande, wenn sich zwei Neuronen soweit angenähert haben, dass eine bestimme Distanz (Kann vom User unter „Controls“ selbst festgelegt werden) unterschritten worden ist.  Je näher sich 2 Neuronen kommen, desto intensiver wird deren Verbindung und die Verbindungslinie dementsprechend stärker gezeichnet. Auf diese Weise können neuronale Netze entstehen. Natürlich funktioniert das auch umgekehrt und die gerade eben erst entstandenen neuronalen Netze können sich wieder auflösen, wenn die Entfernungen untereinander zu groß werden.
Klickt man mit der Maus auf die Darstellung und hält die Maustaste dabei gedrückt, bewegen sich die einzelnen Neuronen nach der brownschen Molekularbewegung. Auf diesem Weg kann man betrachten wie neue Verbindungen entstehen und alte Verbindungen sich auflösen. Das neuronale Netz ist bei gedrückter Maustaste also in einem stetigen Wandel. Um die Darstellung zu vereinfachen können sich die Neuronen nur innerhalb eines Würfels bewegen. Bei gedrückter Maustaste wird dieser ebenfalls sichtbar.
Ihr könnt die Anwendung direkt hier starten oder wechselt die Seite für eine bessere Performance.

Für die Darstellung kommt auch hier wieder meine kleine PixPart Engine zum Einsatz. Diese entwickelt sich munter weiter, aber ist noch immer lange nicht fertig. Daher für Interessierte nur ein paar wenige Codeschnipsel die eher allgemein, bzw. losgelöst von der PixPart Engine selbst sind. So schaut z.B. der Code aus für die brownsche Molekularbewegung eines Neurons:
particle.vectorDirection.x += Math.random() * .4 - .2;  
particle.vectorDirection.y += Math.random() * .4 - .2;  
particle.vectorDirection.z += Math.random() * .4 - .2;  

particle.vectorDirection.x *= 0.9;
particle.vectorDirection.y *= 0.9;
particle.vectorDirection.z *= 0.9;

particle.vectorPosition.x += particle.vectorDirection.x;
particle.vectorPosition.y += particle.vectorDirection.y;
particle.vectorPosition.z += particle.vectorDirection.z;
Die Verbindunglinien zeichne ich wie folgt nach dem Bresenham-Algorithmus:
function drawLine( v1, v2, c ) {

    var dx = Math.abs( v2.x - v1.x );
    var dy = Math.abs( v2.y - v1.y );

    var sx = ( v1.x < v2.x ) ? 1 : -1;
    var sy = ( v1.y < v2.y ) ? 1 : -1;

    var err = dx - dy;
    
    while( true ) {

        setPixel( v1.x, v1.y, c );

        if ( ( v1.x === v2.x ) && ( v1.y === v2.y ) )
            break;

        var e2 = 2 * err;

        if ( e2 > -dx ) { 

            err -= dy; 
            v1.x += sx; 

        }

        if ( e2 <  dy ) { 

            err += dx; 
            v1.y += sy; 

        }

    }

};
Bei Fragen, Kritik oder Anregungen würde ich mich über einen Kommentar sehr freuen.

Keine Kommentare: