Machine Learning e riproducibilità

Code_data

La stessa sequenza di azioni in condizioni variabili devono portare a risultati concordanti. Questa è la chiave del concetto di riproducibilità, un caposaldo per la valutazione dei risultati scientifici. Quando si parla di ricerca e machine learning qualsiasi risultato dichiarato deve risultare riproducibile.

Riproducibilità vs Replicabilità. Prima di correlare questo concetto al machine learning bisogna chiarire che la riproducibilità non coincide con la replicabilità. In questo caso i risultati devono essere coerenti nel caso in cui la computazione viene ripetuta in condizioni simili e nel breve periodo, la riproducibilità invece è cosa molto più articolata.

Cosa Comporta. Per essere riproducibile un risultato ottenuto da una  computazione deve corrispondere a quello elaborato da un’altra macchine con hardware differente dallo stesso algoritmo e con lo stesso training set. Sembra ovvio e semplice ma lo è solo a patto di seguire una serie di linee guida che evitano di perdere tempo alla ricerca dei problemi.

Come ottenerla. Seguendo una serie di linee guida in fase di sviluppo ottenere dei risultati riproducibili è semplica.

  • Il preprocessing dei dati dev’essere in ogni caso un processo automatizzato.
  • Registra anche i risultati intermedi dell’elaborazione. I log sono in grado di svelare molti misteri.
  • Per ogni test conserva non solo i risultati ma anche dati in input e training set.
  • Se qualcuno ha già scritto qualcosa che funziona bene non reinventare la ruota. Esistono centinaia di librerie Open Source già mature e ampiamente testate che oltre a farti risparmiare tempo renderanno più stabili i tuoi test
  • Comunque c’è anche il risvolto della medaglia per il punto precedente. E’ importante tenere d’occhio aggiornamenti e versioni delle librerie in uso, le novità nel codice possono comportare cambiamenti nei risultati.
  • Documenta accuratamente test e risultati con una procedura batch, avrai a disposizione uno storico completo di tutte le fasi dello sviluppo e della ricerca.
  • Un server per l’integrazione continua semplifica le cose perchè i developers si dovranno occupare solo di trasformare le idee in codice, il resto delle operazioni saranno automatizzate.

Per approfondire la questione riproducibilità/replicabilità consiglio questo breve ma “intenso” paper che può risultare illuminante. Inoltre qualche altro spunto interessante sull’argomento puoi trovarlo in questa presentazione.

Pagamenti online sicuri e senza costi fissi con myPOS

Scegliere il servizio giusto per i pagamenti online significa perdersi tra commissioni elevate, API traballanti e tempi di attesa lunghi per l’accredito del denaro. #myPOS è una soluzione di pagamento integrata semplice da utilizzare e senza canoni mensili o annuali. Per iniziare ad accettare pagamenti basta registrarsi per uno dei servizi di pagamento online o acquistare un dispositivo POS.

INTEGRAZIONE – Ci sono diverse soluzioni per integrare un sistema di pagamento in un negozio virtuale. myPOS mette a disposizione un SDK in PHP, Java (Android compreso) e Swift (per iOS) che semplifica il processo.
Inoltre sono disponibili Plugin gratuiti per la maggior parte dei CMS dedicati all’e-commerce. Prestashop, Magento, Woocommerce, ZenCart, OpenCart, OSCommerce e diversi altri fanno parte della lista dei CMS supportati.
La documentazione [link] è sufficientemente estesa e la curva di apprendimento per prendere confidenza con lo strumento è rapida. Questo è lo schema del processo di pagamento:

the_process_mechanism

SICUREZZA – Tutte le chiamate al server sono firmate con una chiave crittata con SHA-256 e codificata. Non è necessario salvare nessuna informazione sensibile relativa ai pagamenti sul server che ospita il negozio. Questo significa che la gestione tecnica è più semplice e il livello di sicurezza è superiore.

 

HARDWARE – Per i negozi fisici e i professionisti myPOS mette a disposizione anche 4 dispositivi hardware differenti che si adattano a qualsiasi esigenza con prezzi che partono da 189€. L’app myPOS (disponibile per Android e iOS) può trasformare qualsiasi smartphone in uno strumento per gestire in semplicità pagamenti e fondi.

Se pensi che myPOS fa per te fai subito un giro sul sito ufficiale.

Buzzoole

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: un neurone (perceptron) 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.