Tutorial > Introduzione a Python per L'intelligenza Artificiale

Introduzione a Python per L'intelligenza Artificiale

L’Intelligenza Artificiale e Python

Cos'è l'IA

L'intelligenza artificiale (IA) è un approccio per la costruzione di sistemi autonomi che possano operare in maniera intelligente e improvvisare le proprie azioni, proprio come esseri umani.

Apprendere dai dati

Attualmente gli algoritmi di IA più avanzati sono incentrati sui dati. L’idea alla base di questa innovazione consiste nel fornire al programma abbastanza informazioni in modo che lo stesso possa far emergere dei pattern, noti anche come “modelli”, o “schemi”. Apprendendo tali schemi gli algoritmi di data science possono inferire teorie future su caratteristiche simili ai dati usati nell’addestramento.

Utilizzare l'Intelligenza Artificiale

Cosa intendiamo in questo contesto per intelligenza? La capacità di un sistema informatico di valutare, comprendere relazioni e confronti tra oggetti, di apprendere da una base di conoscenza, di memorizzare e recuperare dati, esprimere problemi, comprendere idee complesse, utilizzare fluentemente il linguaggio naturale, classificare, generalizzare e adattarsi a situazioni nuove. Includere queste funzionalità all’interno di un software è un modo per rendere le macchine intelligenti.

Connettere l’IA al mondo reale

È evidente che quando sentiamo parlare di IA, pensiamo a questa come a un qualcosa per noi estraneo.  Sorprendentemente facciamo uso di IA nella maggior parte delle nostre attività quotidiane. Molte persone interagiscono con l’IA spesso, dall’inizio alla fine della propria giornata;

  • sbloccando un telefono: quando adoperiamo uno scanner di impronte digitali, uno scanner retinico o uno sistema basato sul riconoscimento facciale, la parte per noi nascosta di questo processo adopera l’intelligenza artificiale che memorizza i nostri dati e determina se corrispondono a una specifica identità;
  • utilizzando social media e acquistando online: tutti i siti social e le agenzie di pubblicità internet attualmente sfruttano l’intelligenza artificiale per consigliare prodotti e servizi personalizzati;
  • inviando un’email o un messaggio: le principali aziende di IT hanno automatizzato il trasferimento di informazioni testuali e il loro sistemi di criptaggio grazie all’IA;
  • adoperando il navigatore: l' intelligenza artificiale è utilizzata massicciamente da Apple, Bing o Google Maps per guidarci verso la nostra destinazione sfruttando il percorso migliore e più rapido possibile;
  • utilizzando la banca online: il trasferimento di denaro, il brokeraggio di azioni e la predizione dei mercati sono tutti processi gestiti da algoritmi di Machine Learning (ML) adoperati per individuare le prospettive del mercato.

Il linguaggio Python – caratteristiche

In questa sezione vedremo come è possibile sviluppare programmi di intelligenza artificiale con Python. Diversi linguaggi di programmazione come C++, C#, Java, Prolog e Python possono essere adoperati per sviluppare applicazioni IA. Python è il linguaggio più popolare nello sviluppo dell'IA e degli algoritmi a essa correlati per varie ragioni, che descriveremo a seguire.

Sintassi e semantica leggibili

Python è un linguaggio estremamente efficiente nel senso che i programmi Python, rispetto ad altri linguaggi, permettono di eseguire una singola funzionalità in poche linee di codice. Inoltre il codice è generalmente più leggibile e facile da debuggare per la sua semantica e per l’uso della tabulazione. Ad esempio, nel codice mostrato subito a seguire, verifichiamo se un numero è primo o meno. Il sorgente per far ciò risulta facilmente leggibile per chiunque anche qualora sia un neofita della programmazione.


number_test = 103
# I numeri primi sono maggiori di 1 
if number_test > 1:
       # controllo dei fattori
       number_list = range (2, number_test) 
       for number in number_list:
             number_of_parts = number_test / each_number
             print (f” {number_test} non è un numero primo") 
             print(f"{number} * {number_of_parts} = {number_test}") 
             break
       else:
       print(f"{test_number} è un numero primo") 
else:
print(f"{test_number} non è un numero primo")


>>> 103 non è un numero primo
>>> 2 * 51.5 = 103

Ampio supporto di librerie integrate per l’IA

La disponibilità di numerose funzioni e librerie dedicate per l’implementazione di algoritmi è uno dei motivi alla base della popolarità di Python nell'IA e nel Machine Learning. Ad esempio NumPy, SciPy, Matplotlib, NLTK e SimpleAI sono librerie Python molto importanti. Riportiamo a seguire un sommario elenco delle librerie più comuni per l'IA supportate da Python.

  • TensorFlow: libreria sviluppata da Google popolare tra chi sviluppa algoritmi di Machine Learning e per chi ha necessità di calcoli impegnativi che generalmente richiedono reti neurali.
  • Scikit-Learn: libreria Python collegata a NumPy e SciPy. Ritienuta una delle migliori librerie è utilizzata principalmente per lavorare con quantità significative di dati strutturati e non strutturati.
  • NumPy: libreria che viene adoperata per l’elaborazione di dati scientifici e matematici.
  • Pandas: Adoperata per implementare strutture dati ad alto livello e per le rispettive analisi. Pandas permette di unire e filtrare dati raccogliendoli da diverse fonti esterne come file CSV, TSV, pagine web, Excel, e altro.
  • Theano: è un archivio di funzioni adoperato essenzialmente per calcolare e processare espressioni matematiche contenenti vettori multi-dimensionali.
  • Keras: libreria che semplifica l’uso di reti neurali. Possiede anche le migliori funzionalità per calcolare modelli, valutare dataset di grandi dimensioni o visualizzare grafi.

Software Open-source e una valida community di sviluppatori

Python, dopo anni e anni di innovazioni open-source, è divenuto un linguaggio di programmazione solido e può vantare una vasta community.  Questo è un vantaggio significativo perché quando sono rilasciate nuove funzionalità oppure si fronteggiano problemi di implementazione, è possibile avvalersi di forum e community molto attive per ottenere aiuto.

Eseguire codice Python

Python è un linguaggio platform-independent e può essere quindi eseguito su diverse piattaforme, inclusi i principali sistemi operativi. Tutto ciò che serve è scaricare il codice binario e installare Python. Anche durante il trasferimento di codice da una piattaforma di sviluppo a un’altra, pacchetti come PyInstaller possono risolvere ogni dipendenza e assicurare che il codice sia perfettamente eseguibile.

Esaminiamo l’installazione in locale di Python su macchine Windows, Ubuntu Linux e Mac.

Andiamo all'indirizzo https://www.python.org/downloads/.

Installazione su Windows

  • Subito sotto l’intestazione principale che recita “Python Release for Windows”, in alto, facciamo click sul link per una delle ultime versioni di Python – Python 3.x.x.
  • Scorrendo verso il basso, in base alle configurazioni di sistema, selezionamo il file eseguibile corretto (scegliendo tra Windows x86 e x64).
  • Avviamo l’installer e clicchiamo su “Esegui”.

Installazione su Ubuntu Linux

Usiamo l’installer grafico per installare Python. Seguiamo i seguenti passi:

  1. Apriamo la cartella di Ubuntu Software Center
  2. Selezioniamo Strumenti per gli sviluppatori (o Sviluppo) dalla lista a scorrimento dei software.
  3. Facciamo doppio click su Python 3.x.x. e clicchiamo su "Installa".

Installazione su MacOs

  1. Prima di procedere con l’installazione di Python, avremo bisogno di GCC. Può essere ottenuto scaricando XCode o il pacchetto OSX-GCC-Installer che ha dimensioni inferiori.
  2. Anche se Mac OS è fornito di utilità di Unix preinstallate manca un gestore di pacchetti. Homebrew per Mac risolve questo problema.
  3. Al termine dell’installazione di Homebrew, inseriamo la directory di Homebrew nella nostra variabile di ambiente PATH. Per farlo, aggiungiamo la seguente dichiarazione nel profile file:
    export PATH="/usr/local/opt/python/libexec/bin:$PATH"
  4. Ora possiamo installare Python 3:
    $brew install python

Python per l’Intelligenza Artificiale

Oltre alle modalità di installazione e utilizzo di Python citate in precedenza, gli strumenti più usati e più facilmente reperibili per scrivere codice di IA e ML in Python sono Jupyter Notebook e Google Colab. In questa sezione vedremo come usare ognuno di questi strumenti per scrivere codice Python.

Jupyter Notebook

Jupyter Notebook è un’applicazione web open-source che consente di realizzare e condividere documenti contenenti codice live, equazioni, visualizzazioni e testo. Gli utilizzi dell’ambiente Jupyter includono la manipolazione dei dati, la simulazione di dati numerici, la modellazione e programmazione statistica, la visualizzazione dei dati, il Machine Learning e molto altro.

Google Colab

Colaboratory, abbreviato in “Colab”, è un prodotto di Google Research. Colab consente a chiunque di scrivere ed eseguire codice Python su un browser. È particolarmente efficace per il machine learning, l’analisi dei dati e l’apprendimento. 

Matematica per programmare l’IA in Python

La matematica è la lingua con cui Dio ha scritto l’universo.

Galileo Galilei

L’idea dietro la creazione di macchine intelligenti ha cominciato a svilupparsi quando gli informatici hanno esplorato i concetti matematici nel regno delle scienze computazionali. L'opportunità di simulare il comportamento umano viene resa possibile proprio grazie all’ausilio di concetti matematici.

L’intelligenza artificiale e l’aritmetica sono due rami dello stesso albero, pertanto, per intraprendere questo percorso nell’apprendimento della programmazione Python concentrandoci sull’intelligenza artificiale, inizieremo con alcuni concetti di matematica relativi al mondo della programmazione. Ciò si rivelerà utile nei casi di studio che esamineremo poiché la maggior parte dell’IA ruota intorno all’utilizzo di costrutti di questo tipo.

Dopotutto l’IA non è magia è, appunto, matematica. Iniziamo.

Immergersi nei numeri attraverso Python

Prima di entrare nel vivo di questo capitolo, diamo un’occhiata a uno dei moduli Python più importanti che useremo ampiamente per programmare applicazioni di IA, il modulo Math.

Per i calcoli fondamentali di matematica in Python vengono adoperati gli operatori matematici come la sottrazione (-), l’addizione (+), la divisione (/) e la moltiplicazione (*). Tuttavia operazioni più avanzate come i logaritmi, gli esponenziali, le trigonometriche o le funzioni di potenza non sono integrate. Il modulo Math di Python è stato progettato per gestire queste operazioni complesse. È sempre disponibile poiché viene rilasciato con la versione standard di Python.

Costanti del modulo Math

Attraverso Math viene fornita una vasta gamma di costanti predefinite che possono portare numerosi vantaggi nel calcolo e nell’elaborazione dei dati consentendo allo sviluppatore di non codificarle manualmente. Queste, inoltre, forniscono uniformità al sorgente. Di seguito sono menzionate alcune costanti e il loro utilizzo:

  • Pi: un numero irrazionale che non può essere espresso come una semplice frazione. Infatti Pi ha un numero infinito di cifre decimali, sebbene possa essere approssimato a 22/7, o 3.141.
  • Tau: Tau (𝜏) è definito come il rapporto tra la circonferenza del cerchio e il suo raggio. Il suo valore è 2π, approssimativamente 6.28. Come Pi, anche Tau è un numero irrazionale in quanto multiplo di un altro numero irrazionale.
  • Numero di Eulero: il numero di Eulero (e) è una costante importante quando trattiamo funzioni logaritmiche, in quando è la base del logaritmo naturale, ed è frequentemente adoperato per analizzare tassi di crescita/decadimento. Anche il numero di Eulero è un numero irrazionale e contiene infinite cifre decimali.
  • Infinito: l’infinito non può essere indicato con un numero. È piuttosto un concetto che sta a indicare che qualcosa non ha fine. L’infinito può essere inteso in entrambe le direzioni, positiva e negativa. Viene generalmente usato negli algoritmi per confrontare un valore fornito con un massimo o un minimo assoluto.
  • NaN (Not a Number): NaN non è un concetto matematico. È nato nel campo dell’informatica e definisce un valore non numerico. Viene spesso usato per confrontare input con numeri e per stabilire se un input originariamente assunto come numero è stato distorto con qualche altro carattere. Il tipo NaN è stato introdotto in Python 3.5.


# importiamo il modulo nel programma
import math
print (math.pi)
>>> 3.141592653589793

# codice per calcolare la circonferenza del cerchio
r=3
circumference = 2 * math.pi * r
print (f" Circonferenza del cerchio = 2 * {math.pi:.4} * {r} = {circumference:.4}")
>>> Circonferenza del cerchio = 2 * 3.142 * 3 = 18.85'
Print (math.tau)
>>> 6.283185307179586

# codice per calcolare la circonferenza del cerchio con l’uso di Tau
r=3
circumference = math.tau * r
print (f" Circonferenza del cerchio = {math.tau:.4} * {r} = {circumference:.4}")
>>> Circonferenza del cerchio = 6.283 * 3 = 18.85'

# Numero di Eulero
Print(math.e)
>>> 2.718281828459045

# Infinito
Print (f"Positive Infinity = {math.inf}")
>>> 'Positive Infinity = inf'
Print (f"Negative Infinity = {-math.inf}")
>>> 'Negative Infinity = -inf'
float("inf") == math.inf
>>>True

# NaN Print(math.nan)
Nan

Funzioni aritmetiche nel Math Module

Lo studio dei numeri naturali (Teoria dei numeri) solitamente ha a che fare con numeri interi positivi. Il modulo Math fornisce funzioni che sono di aiuto nell’implementazione della teoria numerica e della teoria della rappresentazione, un’altra area associata alla matematica. Queste funzioni consentono il calcolo di una gamma di valori importanti, che includono i fattoriali, i logaritmi e molto altro.

Tutte le funzioni di Python, come factorial() o pow(), hanno un tempo di esecuzione più veloce rispetto a un’implementazione che userebbe un ciclo o una ricorsione. La ragione di ciò è l’implementazione “sottostante” in C. Le funzioni integrate sono anche più stabili poiché tutti i casi di fallimento e di boundary sono già implementati. È quindi considerata una buona pratica utilizzare tali funzioni quando ciò sia possibile.

Trovare numeri simili con Python

  • La tolleranza relativa, o rel_tol, è definita come la differenza massima per un numero al fine di essere giudicato "vicino" all'ampiezza di un certo input. Si tratta di una percentuale di tolleranza. Il valore di default è 1e-09 o 0,000000001.
  • La tolleranza assoluta, o abs_tol, è la differenza massima tra due valori per poter essere considerati "vicini", indipendentemente dall'ampiezza dell'input. Il valore predefinito è 0,0.
    La funzione isclose() restituisce un valore booleano basato sul seguente calcolo:
    
    abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol).

La tolleranza relativa può essere passata alla funzione isclose() come argomento e può assumere qualsiasi valore definito. Ad esempio, se rel_tol è impostato su 0,2, 6 e 7 sono considerati vicini. Come rel_tol, anche il valore abs_tol può essere “regolato” secondo le nostre necessità. I valori sono considerati vicini quando la differenza tra i valori di input è minore o uguale al valore di tolleranza assoluta. Esaminiamo l'implementazione dei concetti menzionati:


# Implementazione del Fattoriale usando il ciclo For
def fact_loop(num):
       if num < 0:
              return 0
       if num == 0:
              return 1
       factorial = 1

          for i in range(1, num + 1):
             factorial = factorial * i
       return factorial

fact_loop(7)
>>> 5040

# Fattoriale usando il modulo di Python
math.factorial(7)
>>> 5040

# Implementazione della funzione isclose()
math.isclose(6, 7)
>>> False
math.isclose(6.999999999, 7)
>>> True

# Implementazione della funzione isclose() con tolleranza relativa
math.isclose(6, 7, rel_tol=0.2) >>> True

# Implementazione della funzione isclose() con tolleranza assoluta
math.isclose(6, 7, abs_tol=1.0) >>> True
math.isclose(6, 7, abs_tol=0.2) >>> False

Funzioni logaritmo in Python

La programmazione matematica e statistica spesso ruota intorno al calcolo di crescite, decadimenti o deviazioni. Questi andamenti vengono tipicamente calcolati adoperando le funzioni Logaritmo.

  • Calcolo del logaritmo naturale in Python: la funzione log() calcola il logaritmo di un numero sulla base del numero di Eulero, cioè la costante matematica e. Come la funzione esponenziale, anche il logaritmo naturale utilizza la costante e, che abbiamo discusso nella sezione precedente.
  • log2() e log10(): il modulo Math di Python fornisce anche due funzioni separate che consentono di calcolare i logaritmi in base 2 e 10. log2() viene utilizzato per calcolare il logaritmo in base 2. log10() viene utilizzato per calcolare il logaritmo in base 10.


# Implementazione del logaritmo naturale
math.log(4)
>>> 1.3862943611198906
math.log(3.4)
>>>1.2237754316221157

# Check del logaritmo per un numero negativo
math.log(-3)
>>> Traceback (most recent call last):
>>> File “<stdin>”, line 1, in <module>
>>> ValueError: math domain error

# Implementazione del logaritmo con diverse basi (la base è il secondo argomento):
math.log(math.pi, 2)
>>> 1.651496129472319
math.log(math.pi, 5)
>>> 0.711260668712669

# Implementazione dei logaritmi in base 2 e base 10
math.log2(math.pi)
>>> 1.6514961294723187
math.log(math.pi, 2)
>>> 1.651496129472319
math.log10(math.pi)
>>> 0.4971498726941338
math.log(math.pi, 10)
>>> 0.4971498726941338

Altre funzioni matematiche in Python

  • Funzioni trigonometriche: la relazione tra gli angoli e i lati di un triangolo, e più comunemente i triangoli rettangoli, sono studiati in trigonometria. Il modulo Math fornisce funzioni molto utili per eseguire calcoli trigonometrici.
  • Si può calcolare il valore del seno di un angolo con math.sin(), il coseno con math.cos(), e la tangente con math.tan(). Il modulo Math fornisce anche funzioni per calcolare l’arcoseno con math.asin(), l’arcocoseno con math.acos() e l’arcotangente con math.atan(). Infine, si può calcolare l’ipotenusa di un triangolo usando math.hypot().
  • La funzione comb(n, k) restituisce il numero di modi in cui è possibile scegliere k elementi da n elementi senza ripetizione e in ordine casuale.
  • La funzione perm(n, k) restituisce il numero di permutazioni per selezionare k elementi da n elementi senza ripetizione in uno specifico ordine.
  • La funzione isqrt() restituisce il valore della radice quadrata di un valore intero non negativo.
  • La funzione prod() calcola il prodotto di tutti gli elementi di un tipo dati in input. Questo metodo può ricevere in input anche tipi iterabili come array, liste o tuple.
  • La funzione dist() restituisce la distanza euclidea tra due punti p e q, ciascuno dato come successione di coordinate. Nota: i due punti indicati devono avere la stessa dimensione.
  • La funzione hypot() può gestire più di due dimensioni.

# Funzioni trigonometriche in Python

a = math.pi/8
b =3<
c= 4
# stampa valore del seno di pi/8
print (math.sin(a))
>>> 0.382683432365

# stampa valore del coseno di pi/8
print (math.cos(a))
>>> 0.923879532511

# ritorna il valore della tangente di pi/8
print (math.tan(a))
>>> 0.414213562373

# calcolo ipotenusa di 3 e 4
print (math.hypot(b,c))
>>> 5.0

# Permutazioni e combinazioni
n =7
k=5
print (math.comb(n, k))
>>> 21
n = 10
k=2
print (math.perm(n, k))
>>> 90

# Radici quadrate e funzioni prodotto
print(math.sqrt(4))
>>> 2
arr = [1, 2, 3, 4, 5]
print (math.prod(arr))
>>> 120

# Calcolo distanza euclidea
p = [3]
q = [1]
print (math.dist(p, q))
>>> 2.0

# Calcolo ipotenusa
perpendicular = 10
base = 5
print(math.hypot(perpendicular, base))
>>> 11.180339887498949

I prossimi passi

Python è cresciuto fino a diventare popolare tra gli sviluppatori di IA per vantaggi garantiti dall’adozione di questo linguaggio. La tendenza ad adottare l’IA e a implementarla per il miglioramento dell’industria del software è in forte crescita, il nostro obiettivo è continuare a lavorare in questo ambito.

Nei prossimi capitoli di questa serie di tutorial esamineremo i costrutti Python e le tecniche di programmazione funzionale che costituiscono la base dello sviluppo IA. Ci immergeremo anche nella statistica e nelle tecniche di programmazione per la modellazione statistica in Python.

Ogni programmatore vorrebbe padroneggiare l’Intelligenza Artificiale. Noi abbiamo scelto Python come strumento per raggiungere le invidiabili vette della creazione di applicazioni intelligenti.

In arrivo

  1. Costrutti, cicli e programmazione funzionale;
  2. Programmazione orientata agli oggetti in Python;
  3. Statistica con Python.