[ML] Tipologie di Machine Learning

machine Learning - promezio

Tra uno snippet di codice e l’altro un po’ di teoria non può far male quindi oltre ai soliti articoli iniziamo con qualche nozione e qualche esempio pratico in tema machine learning e artificial intelligence; ovvero i temi caldi del momento.

Insegnare ad una macchina ad esaminare dati e trarne conclusioni è uno degli obiettivi più ardui che l’uomo si è proposto. La cognizione/coscienza  nell’intelligenza artificiale può essere considerata marginale (ed è ancora lontana dall’essere realizzata) ma gli algoritmi di analisi analitica degli input con previsioni statistiche sui possibili output è alla base della maggior parte delle tecnologie di intelligenza artificiale oggi in uso.

Machine learning è sinonimo di apprendimento automatico, ovvero si tenta di dare alla macchina la capacità di osservare una serie di dati allo scopo di individuare relazioni e collegamenti utili all’interpretazione degli stessi. In altre parole questo significa che con il giusto algoritmo un computer sarà in grado di analizzare un flusso di dati grezzi e utilizzarli per prendere delle decisionipredire risultati o per estrapolarene informazioni rilevanti.

Qualche applicazione pratica? Riconoscimento della voce, riconoscimento di soggetti o pattern nelle immagini, videogame con personaggi autonomi, sistemi di sicurezza che analizzano grandi quantità di machine data, statistiche in grado di anticipare risultati (sportivi, finanziari, metereologici, ecc.) . . . praticamente campi applicativi infiniti.

Fondamentalmente possiamo distinguere tre diverse tipologie di machine learning che proverò a catalogare nel seguito. Parliamo del supervised learning, dell’unsupervised learning e del reinforcement learning.

 

SUPERVISED LEARNING

L’algoritmo esamina una serie di training data ovvero un vettore di dati in input con relativi output generando una funziona in grado di metterli in relazione e quindi di prevedere i futuri valori di output per input compatibili. Per fare un’esempio pratico proviamo ad immagine uno scenario nel quale bisogna valutare la tipologia di un prodotto. Per semplificare i training case sono soltanto due:

  • Colore uniforme -> prodotto A
  • Colore disomogeneo ->prodotto B

Analizzando i training data l’algoritmo genererà una funzione in grado di riconoscere sia il prodotto A che il prodotto B da un’analisi visiva del colore.

 

UNSUPERVISED LEARNING

L’algoritmo tenta di individuare anomalie, incongruenze o altre strutture statisticamente rilevabili. In questo caso si utilizzano queste rilevazioni come trigger per generare eventi prestabiliti. Come scenario di test immaginiamo un sistema di rilevazione minacce per la sicurezza informatica che analizza il flusso di accessi ad un server. In questo caso su migliaia di dati possono essere individuati anomalie che corrispondono a tentativi di accessi indesiderati o di attacchi mirati a minare la stabilità del servizio.

 

REINFORCEMENT LEARNING

In questo caso l’algoritmo si interfaccia con un sistema in grado di fornire stimoli a seconda delle scelte e delle decisioni che verranno prese nel corso delle elaborazioni. In questo caso non sono necessari training data perché è lo stesso algoritmo a generare i dati che userà per le scelte successive. Anche in questo caso un esempio pratico chiarirà meglio il concetto. Immaginiamo un’aspirapolvere robotizzata che deve orientarsi all’interno della stanza da spazzare. In questo caso l’input proverrà dai sensori di prossimità di cui è dotata mentre l’output atteso è una mappa completa degli ostacoli da evitare e del perimetro della stanza stessa. Ad ogni ostacolo segnalato il robot avrà un’elemento in più per mappare i perimetri dell’ambiente e di conseguenza dopo una serie di ispezioni casuali riuscirà ad ottenere un numero di informazioni utili sufficiente allo scopo.

Sembrano concetti semplici? Spero di si perché questo significa che sono riuscito a fornire una descrizione valida. Naturalmente in ambito applicativo le cose sono più complesse ma . . . questo è un ottimo punto di partenza.

Al TEDxSSC 2016 con GLOBSIT

tedxssc

Tanta pioggia e parecchio freddo a far da cornice ad un TEDx splendidamente organizzato da @NasoLuca e dal suo team alla Scuola Superiore di Catania. Un’esempio di eccellenze tutte siciliane che dimostrano cosa significa davvero innovare per “migliorare” e non soltanto “cambiare” il mondo.

Non voglio fare un riepilogo di tutti gli interventi anche perché riuscire ad essere esaustivi è un’impresa impossibile vista la mole di idee e spunti che l’evento è riuscito a fornire. Comunque ci sono state alcune cose che ho apprezzato più di altre e voglio condividerne tre in particolare

 

#machinelearning
Considerando i progetti ai quali lavoro al momento non potevo non citare per primo l’intervento sulle implicazioni etiche nel #machinelearning. Con il le macchine scelgono e apprendono in un modo che non comprendiamo e controlliamo a pieno. Questo tipo di intelligenza artificiale può fallire in modi che non possiamo prevedere e quindi non possiamo e non dobbiamo affidargli le nostre responsabilità morali.

E se dovesse essere un’algoritmo a decidere chi assumere e chi no? Le macchine possono conoscerci a fondo, catalogando le persone secondo parametri non umani, una catalogazione  crudele. Siamo sicuri di volere un mondo dove una persona valutata da un algoritmo come “a rischio depressione” non venga assunta da nessuna azienda?

E se dovesse essere un’algoritmo a decidere chi muore o chi vive? E’ questo il dilemma etico nell’applicazione del #machinelearning alle armi automatiche sempre più utilizzate anche in scenari con un alta densità di civili. E non è il solo campo applicativo problematico, anche l’algoritmo che controlla un veicolo automatizzato potrebbe trovarsi a decidere se salvare il conducente o investire il pedone. Chi stabilisce cosa dovrà fare?

 

#wikimafia
Mi vergognavo ad essere antimafioso solo una volta l’anno, ogni 23 Maggio. Inizia così l’intervento di @PierpaoloFarina: scrittore, sociologo e fondatore tra le altre di @WikiMafia. Un’altro intervento denso di coraggio, coerenza,  idee e spunti pratici.

Cosa può fare ogni uno di noi per combattere le mafie? Un ragazzino di 17 in 3 mesi ha realizzato la più grande voce al mondo su Maxiprocesso di Palermo. E’ la conoscenza l’arma principale che abbiamo, per fare la differenza basterà fare il proprio dovere e vivere la propria vita alla luce di questa conoscenza.

Ho avuto il piacere di scambiare qualche parola con Pierpaolo subito dopo il suo intervento ed è stato bello vedere che il suo impegno va molto oltre il semplice speak e la sua determinazione traspare da ogni parola e gesto. Chi lotta non può arrendersi se conosce quello che sta lottando e Pierpaolo è riuscito a coinvolgerci nella sua battaglia; anzi, nella nostra battaglia.

 

#bufale
Il 35% degli italiani si informa su facebook e tu . . . pensi prima di cliccare sul tasto condividi? Un viaggio nel mondo delle bufale e dell’informazione farlocca che chiude alla grande il #TEDxSSC. Daniele Virgillito con un’oratoria eccellente ci fa da guida in una giungla sterminata fatta di bufale davvero difficili da distinguere dalla verità.

La responsabilità di verificare le fonti prima di “condividere” è di tutti ma grava soprattutto su chi ha fatto dell’informazione il proprio mestiere. Se a cadere nella trappola delle bufale è anche il giornalista si crea uno scenario nel quale diventa impossibile identificare la realtà, una situazione nella quale gli animi si scaldano per qualcosa che non è mai successo e le opinioni si formano basandosi sul nulla.

 

 

Difficile trovare altrove tanta forza innovatrice e tanta ispirazione . . . il TEDxSSC è promosso quindi speriamo di rivederci alla prossima!

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.

Nuovo Sticker: Vintage Computer

La prima new entry degli stickers :#/promezio mi piace da matti. Vintage Computer è un vero sticker geek appena nato nella fucina c01n e finito immediatamente qui tra le nuove proposte . . . guardalo e capirai perchè ho deciso di inserirlo.

:#/ promezio sticker #954
:#/ promezio sticker #954

Un pezzo storico realizzato da uno dei Nerd più noti di sempre che ha stregato un’intera generazione sia per il suo design squadrato che per le sue funzionalità all’avanguardia che portavano nel futuro il mondo dei Computer.

Credo non sia necessario essere #AppleFans per apprezzarlo.

Lo trovi nella sezione stickers!

Usabilità: Instagram case study

La nuova veste grafica di Instagram per iOS è già su AppStore da diversi giorni e tutte le volte che l’ho utilizzata ho sempre pensato all’usabilità. Dopo la rivoluzione delle icone é stata la volta dei pulsanti, ed ecco il dilemma: l’app adesso “teoricamente” é più usabile ma “praticamente” è l’esatto opposto!

Il pulsante follow/unfollow porta inevitabilmente all’errore gli utenti abituali, eccoli entrambi:
Instagram buttons
Instagram buttons

Come noti adesso sono teoricamente più corretti perché sia nei colori che nelle immagini rendono chiaramente l’idea di un’azione da compiere (il follow) e di un’azione già’ compiuta (unfollow di un utente seguito).

Nella pratica però le cose si complicano perché entra in gioco l’abitudine e la versione precedente che usiamo oramai da anni ha assuefatto gli utenti ad uno schema differente. Adesso usando l’app senza particolare attenzione si sbaglia spesso, soprattutto nella pagina delle notifiche. Scorrendo le attività si confondono continuamente gli utenti da seguire con gli utenti che già fanno parte della nostra lista.

L’usabilità è una questione complessa proprio per questo: i principi fondamentali sono sempre validi ma le regole specifiche vanno adattate al software che si progetta, alla sua storia, ai suoi utenti e alle loro abitudini. Utilizzare un colore più attivo per un tasto già selezionato o per un’azione passiva in fin dei conti non confonde i nuovi users più di tanto, era un errore teorico che comunque poteva essere ignorato nella pratica . Uno stravolgimento dello schema dei colori attivi/passivi porta invece gli utenti abituali a sbagliare fino a che non ci si abituerà di nuovo e ti posso assicurare che ci vuole parecchio.

Basta un tasto, anzi il suo colore, per cambiare l’esperienza d’uso di un app. Qual’é il segreto per creare una GUI che non necessita di spiegazioni per essere usata correttamente?

Progettarla, testarla ed usarla con gli occhi degli utenti senza slegare concettualmente il contenitore dal contenuto, l’attuatore dal comando attuato, il frontend dal codice che lo governa.

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

Geek Stickers

Geek Stickers è una nuova pagina ma anche un nuovo side-project per :#/promezio nato grazie ad una chiacchierata che ha portato alla collaborazione con una tipografia specializzata in stickers di qualità.

Ho sempre amato le cose fatte bene e ho visto passione e cura artigianale nelle produzioni di c01n . . . è vero, si tratta di una realtà giovane che ha ancora bisogno di tempo per crescere e maturare ma parte talmente bene che è già il partner ideale per trasformare le idee di un nerd doc (io?) in stickers divertenti e originali.

Geek stickers è una piccola collezione di adesivi originale pensati per mettere in mostra con orgoglio la nostra attitudine geek – nerd. Immagini e frasi che raccontano un mondo fatto di tecnologia ma sopratutto di persone che amano conoscere e smontare qualsiasi cosa per scoprire come funziona.

La collezione sarà dinamica, questo significa che tutte le produzioni sono a tiratura limitata e finito uno stock si passa al design successivo, avrai sempre qualcosa di nuovo per personalizzare i tuoi device e i mezzi che usi tutti i giorni rendendoli davvero tuoi.

I costi? Ridotti al minimo, considerando le spese di spedizione incluse e la qualità della carta e degli inchiostri scelti per le realizzazioni. Ricorda . . . tutti i Geek Stickers targati :#/promezio sono prodotti artigianali e rigorosamente #madeInItaly!

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.