Machine Learning: una rete neurale minimale per XOR

Del perchè il problema XOR non è risolvibile con un singolo perceptron abbiamo già parlato qui. Adesso non ci resta che trovare la soluzione al problema creando una semplice rete neurale in 2 livelli che sia in grado di fornirci la giusta soluzione.

Per ogni livello verrà calcolato il gradiente che va a correggere il peso calcolato nell’elaborazione del livello superiore. Questa retroazione permette di affinare il risultato ad ogni iterazione per ottenere la classificazione che cerchiamo.

 

Lo schema logico che utilizzeremo per la rete è il seguente

Questo è il codice completo, commentato per essere facilmente comprensibile in ogni sua fase:

 

Il codice è anche disponibile nel repository GitHub dedicato al Machine Learning.

Machine Learning: perceptron, XOR e rete neurale

In questo articolo ho mostrato come simulare il funzionamento di un neurone con python. Questo tipo di applicazione del machine learning è in grado di imparare a dividere i risultati nel piano con una linea retta. Questo non è sufficiente per risolvere problemi appena più complessi di una funzione logica di base. Ad esempio il perceptron descritto non è in grado di prevedere correttamente il funzionamento di una funzione XOR.

Il perchè è davvero semplice da spiegare. Questa è la tabella XOR:

Questo invece è il grafico della stessa funzione logica:

 

Da questa immagine è evidente che è impossibile dividere i risultati utilizzando un’unica retta quindi il nostro perceptron non è in grado di arrivare al risultato corretto dopo la solita elaborazione. Soluzioni? Te ne viene in mente qualcuna?

C’è n’è una molto intuitiva che è anche la più interessante: perché non utilizzare diversi perceptron per elaborare i dati? Con una rete di perceptron possiamo essere in grado di disegnare due linee e dividere l’area in tre porzioni.

Questo è il concetto alla base di una rete neurale. Nel prossimo articolo ne implementeremo una in Python e la testeremo con la funzione XOR.

Machine Learning: emuliamo un neurone in Python

Una delle prime forme di machine learning comparsa nella letteratura di settore, e anche una delle più semplici da implementare è il Perceptron (in italiano possiamo chiamarlo percettrone ma la forma inglese è la più diffusa). Si tratta di una sorta di schematizzazione del funzionamento di un neurone che prevede una serie di ingressi che vengono elaborati per dare in uscita un valore che ne rappresenta la somma pesata. Nello step successivo questo valore viene normalizzato secondo uno schema preciso.

Schematizziamo il concetto con una formula, la prima operazione è la seguente:

Il risultato finale sarà invece elaborato secondo questa funzione (a cui ci riferiremo con step function):

 

Passiamo immediatamente alla pratica per capire come tradurre questo concetto matematico in codice. Creiamo un perceptron in grado di “imparare” ad eseguire la funzione logica AND.  La scelta del linguaggio per queste applicazioni ricade molto spesso su python considerata la sua semplicità, leggibilità ed eleganza. Per prima cosa stabiliamo il set di dati in ingresso, che negli articoli teorici abbiamo sempre definito training data.

Ora c’è da definire la step function.

Serviranno anche alcuni valori di riferimento. Per prima cosa un vettore dei pesi scelti inizializzato con numeri casuali. Inoltre abbiamo bisogno anche di un tasso di apprendimento e del numero di interazioni necessarie al perceptron per “imparare” dai training data.

Adesso passiamo al ciclo di apprendimento.

Dopo le cento iterazioni il percettrone dovrebbe essere sufficientemente istruito per replicare in autonomia la funzione AND. Per testarne il funzionamento bastano poche righe di codice.

Mettendo tutto insieme hai un’algoritmo di machine learning già funzionante. Semplice vero?

Questo è il risultato finale:

Trovi il file sorgente nel nuovo repository :#/ promezio che ho creato su GitHub per riunire tutti i test relativi al machine learning che ritengo possano essere utili da studiare.

JavaScript Subclass

JavaScript non nasce per rispettare nativamente i paradigmi dell’OOP e questo significa che alcune cose che portebbero essere molto semplici in realta’ non lo sono.

Per creare una sottoclasse che eredita proprieta’ e metodi di una superclasse e’ bene seguire le linee guida di ECMAScript 5.

 

 

Ci sono delle alternative a questo approccio strutturato ma anche se dovessere funzionare con tutta probabilita’ dara’ problemi quando ci sara’ da estendere/modificare il codice.

 

Qui trovi il LIVE CODE su CodePen.

JavaScript Navigator: informazioni sul browser.

Gran parte di quello che conosci di chi usa la tua WebApp o naviga il tuo sito è codificato nell’oggetto Navigator di JavaScript. Tra le tante proprietà ho scelto quelle che ritengo più importanti. Sono tutte elencate, spiegate e illustrate in questo pezzo di codice.

 

Il contenuto di UserAgent è molto completo ma diventa ostico da interpretare. Quando hai bisogno di questi dati utilizza UAParser (faisalman) e diventerà tutto più semplice. Naturalmente è open source.

Per quanto riguarda invece la geolocalizzazione bisogna tener presente il fatto che i browser necessitano dell’autorizzazione dell’utente per permettere ad un determinato sito di accedere ad informazioni sensibili come la posizione geografica. Questo significa che quando proverai la Live Demo CodePen linkata a fine articolo devi attivare questa funzionalità altrimenti vedrai in console soltanto un errore.

 

Trovi il codice con la LIVE DEMO anche su CodePen.

Timers in JavaScript

Due funzioni e mille ambiti applicativi. Per invocare una funzione dopo un intervallo di tempo impostando un timer con JavaScript puoi usare setTimeout() e setInterval(). Vediamo di cosa si tratta.

In buona sostanza entrambe le funzioni fanno la stessa cosa anche se con una leggera differenza. La prima, setTimeout() dopo un ritardo (impostato come parametro) lancia la funzione desiderata e può far partire ricorsivamente un altro setTimeout(). Con setInterval() invece si affida all’interprete il compito di avviare la funzione in loop ad ogni intervallo di tempo.

Nella pratica questo significa che setInterval() è più accurata quando si tratta di ripetere la stesa operazione più volte mentre setTimeout() è la scelta giusta per eseguire la funzione una sola volta dopo un intervallo di tempo predefinito.

Questo è un esempio di utilizzo di setTimeout()

 

Questo è un esempio di utilizzo di setInterval()

 

Mostrare invece come usare setTimeout() con la ricorsività per imitare la funzionalità di setInterval() mi sembra inutile perchè è un artificio poco efficiente e quindi sconsigliato nella quasi totalità dei casi.

chart.js – Grafici personalizzato con poche righe di codice

Tante varianti disponibili, animazioni automatizzate e personalizzazione a 360°. Queste caratteristiche rendono chart.js una delle soluzioni migliori per mostrare graficamente un set di dati. Proviamo a creare qualcosa con il set minimo di personalizzazioni necessarie, massimo risultato con poche righe di codice.

Procurarsi i sorgenti è semplice, con i CDN che trovi qui basta importare i file. Su GitHub puoi scaricare la versione completa o puoi integrarlo in un progetto che utilizza bower (bower install chart.js –save) o npm (npm install chart.js –save).

Iniziamo inserendo una canvas con tag “” in una pagina html base

Per far funzionare il grafico basta definire i dati e la scala in un documento JavaScript

E assemblare il tutto

 

Con qualche riga di CSS rendiamo tutto più presentabile

 

Questo è il risultato.

SU CODEPEN LA DEMO LIVE

JavaScript – SET

set JavaScript

 

I SET sono collezioni di valori semplici da utilizzare e iterare ma molto potenti quando si elaborano grandi quantità di informazioni. In realtà questo tipo predefinito è spesso sottovalutato in favore dei comunissimi Array.

Giochiamo un po con i set? Per prima cosa creiamone uno e aggiungiamo qualche elemento

Adesso possiamo eliminare un elemento e subito dopo testare la sua presenza nel set (naturalmente il risultato sarà un false)

I set possono facilmente essere trasformati in un Array

Anche iterare un set è roba da poche righe di codice

 

Qui trovi la live demo di tutto il codice su CodePen.

Duck Typing: comparare oggetti in JavaScript

Con il Duck Typing gli oggetti vengono attraverso l’insieme dei metodi e delle proprietà che lo compongono. Perchè questo nome curioso? Per via di una simpatica citazione che descrive efficacemente la filosofia di questo approccio:

When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.

Che tradotto in italiano suona più o meno così:

Quando io vedo un uccello che cammina come un’anatra, nuota come un’anatra e starnazza come un’anatra, io chiamo quell’uccello anatra.

Cosa significa tutto questo in pratica?  Vediamolo subito con un esempio pratico in JavaScript, iniziamo dichiarando due oggetti qualsiasi per il test di comparazione:

Questo è invece il codice che si occupa della comparazione:

 

Per testare il tutto questa è la demo live su Code Pen:

See the Pen Duck Typing by Gioele Fierro (@gioeleslfierro) on CodePen.

JSUtils: il progetto si evolve

JSUtils continua ad evolversi con nuovi strumenti disponibili e una documentazione più chiara da consultare e più curata sotto il profilo grafico. Queste sono le migliorie introdotte con JSUtils 0.1.3 alpha, trovi la nuova versione già online su GitHub.

Una novità interessante sono le nuove sezioni vars ed extended primitives, la prima contiene una serie di valori predefiniti riutilizzabili mentre la seconda è un upgrade a tre delle strutture principali di JavaScript. Al momento è disponibile solo la struttura base, i contenuti saranno aggiunti via via con le prossime Alpha.

La libreria completa andrà inesorabilmente ad appesantirsi viste le nuove sezioni, per questo la nuova versione è stata scomposta in vari moduli, il developer potrà così decidere cosa importare scaricando solo il codice che utilizzerà. Naturalmente è ancora disponibile il modulo integrale che contiene tutte le utilities, sia in forma completa che compressa.

Questi sono tutti i sorgenti disponibili (src):

array.jsu.js
function.jsu.js
jsu.js J
number.jsu.js
string.jsu.js
vars.jsu.js

 

Questi sono tutti i sorgenti compressi disponibili (min-src):

array.jsu.min.js
function.jsu.min.js
jsu.js J
number.jsu.min.js
string.jsu.min.js
vars.jsu.min.js

 

Oltre a queste modifiche tecniche c’è anche una nuova veste grafica che ti aspetta nella documentazione che diventa più semplice da consultare. Trovi la documentazione online QUI. Aggiungendo complessità al codice è ovvio che anche la documentazione era da migliorare e questo è il lavoro che ha occupato principalmente la release 0.1.3. Dalle prossime si tornà alle novità fuzionali.