<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ai &#8211; paologironi blog</title>
	<atom:link href="https://www.gironi.it/blog/category/ai-it/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.gironi.it/blog</link>
	<description>Appunti sparsi di (retro) informatica, analisi dei dati, statistica, seo, e cose che cambiano</description>
	<lastBuildDate>Mon, 12 Oct 2026 08:32:07 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>L&#8217;algoritmo di Discesa del Gradiente spiegato in modo chiaro: dall&#8217;intuizione alla pratica</title>
		<link>https://www.gironi.it/blog/lalgoritmo-di-discesa-del-gradiente-gradient-descent-spiegato-semplice/</link>
					<comments>https://www.gironi.it/blog/lalgoritmo-di-discesa-del-gradiente-gradient-descent-spiegato-semplice/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Mon, 21 Aug 2023 07:44:37 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[discesa gradiente]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3046</guid>

					<description><![CDATA[Una persona bendata su una montagna Immagina di trovarti su un terreno montagnoso, completamente bendato. Il tuo obiettivo: raggiungere il punto più basso della valle. Non puoi vedere nulla, ma puoi sentire la pendenza del terreno sotto i piedi. Cosa fai? Ti muovi nella direzione in cui il terreno scende, un passo alla volta. Se &#8230; <a href="https://www.gironi.it/blog/lalgoritmo-di-discesa-del-gradiente-gradient-descent-spiegato-semplice/" class="more-link">Leggi tutto<span class="screen-reader-text"> "L&#8217;algoritmo di Discesa del Gradiente spiegato in modo chiaro: dall&#8217;intuizione alla pratica"</span></a>]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Una persona bendata su una montagna</h2>



<p class="wp-block-paragraph">Immagina di trovarti su un terreno montagnoso, completamente bendato. Il tuo obiettivo: raggiungere il punto più basso della valle. Non puoi vedere nulla, ma puoi sentire la pendenza del terreno sotto i piedi. Cosa fai? Ti muovi nella direzione in cui il terreno scende, un passo alla volta. Se scende più ripidamente a sinistra, vai a sinistra. Se scende di più a destra, vai a destra. Ad ogni passo, senti di nuovo la pendenza e cambi direzione.</p>



<p class="wp-block-paragraph">Questa strategia, così semplice e naturale, è esattamente quella che le reti neurali usano per imparare. Ogni volta che un modello di intelligenza artificiale migliora &mdash; che impari a riconoscere un volto, tradurre una frase, o generare un testo &mdash; lo fa scendendo lungo un paesaggio matematico, un passo alla volta, seguendo la pendenza.</p>



<p class="wp-block-paragraph">Si chiama <strong>discesa del gradiente</strong> (<em>gradient descent</em>), ed è probabilmente l&#8217;algoritmo più importante del machine learning moderno.</p>



<figure style="margin: 1.5em 0;text-align: center"><img decoding="async" src="https://www.gironi.it/blog/wp-content/uploads/2026/03/slide-esploratore-bendato.jpg" alt="Infografica: la metafora dell'esploratore bendato che cerca il fondo della valle, con i tre passaggi Sensore, Azione, Ciclo" style="max-width: 100%;border: 1px solid #e0e0e0;border-radius: 6px" /></figure>



<span id="more-3046"></span>



<h2 class="wp-block-heading" id="storia">Da Cauchy alle reti neurali: una breve storia</h2>



<p class="wp-block-paragraph">L&#8217;idea di seguire la pendenza per trovare un minimo ha radici sorprendentemente antiche. Nel <strong>1847</strong>, il matematico francese Augustin-Louis Cauchy pubblica un metodo per risolvere sistemi di equazioni che, nella sostanza, è già la discesa del gradiente: calcolare la direzione di massima crescita di una funzione e muoversi nella direzione opposta. Cauchy non pensava alle reti neurali &mdash; mancava più di un secolo alla loro comparsa &mdash; ma aveva formalizzato il principio che ancora oggi alimenta l&#8217;intelligenza artificiale.</p>



<p class="wp-block-paragraph">Per oltre un secolo l&#8217;idea resta confinata alla matematica pura. La svolta arriva nel <strong>1951</strong>, quando Herbert Robbins e Sutton Monro propongono una versione <strong>stocastica</strong> del metodo: invece di calcolare il gradiente sull&#8217;intero problema, lo si stima su un campione casuale. È il seme di quello che oggi chiamiamo <em>Stochastic Gradient Descent</em> (SGD) &mdash; ne parleremo nella sezione finale. Pochi anni dopo, nel <strong>1958</strong>, Frank Rosenblatt costruisce il <strong>perceptron</strong>, il primo modello di apprendimento automatico che usa la discesa del gradiente per imparare dai dati. L&#8217;entusiasmo è enorme, ma dura poco: nel 1969 Minsky e Papert dimostrano i limiti del perceptron, e l&#8217;interesse per le reti neurali crolla. È il cosiddetto <em>inverno dell&#8217;intelligenza artificiale</em>.</p>



<p class="wp-block-paragraph">La rinascita arriva nel <strong>1986</strong>, quando David Rumelhart, Geoffrey Hinton e Ronald Williams pubblicano l&#8217;algoritmo di <strong>backpropagation</strong>: un modo efficiente per calcolare il gradiente in reti neurali con molti strati. È la chiave che sblocca il deep learning. Da quel momento, la discesa del gradiente non è più un esercizio teorico ma lo strumento pratico con cui si addestrano le reti neurali. L&#8217;ultimo tassello di questa storia lo pongono Diederik Kingma e Jimmy Ba nel <strong>2014</strong>, con l&#8217;ottimizzatore <strong>Adam</strong> &mdash; che ritroveremo nella sezione finale di questo articolo. Quasi due secoli separano Cauchy da Adam, eppure il principio è rimasto lo stesso: senti la pendenza, fai un passo nella direzione opposta.</p>



<div style="border: 1px solid #ccc;padding: 1.2em 1.5em;margin: 1.5em 0;border-radius: 6px">
<h3 style="margin-top: 0">Di cosa parleremo</h3>
<ul>
<li><a href="#storia">Da Cauchy alle reti neurali: una breve storia</a></li>
<li><a href="#matematica">La matematica, spiegata geometricamente</a></li>
<li><a href="#learning-rate">Il learning rate e la convergenza</a></li>
<li><a href="#problemi">Cosa può andare storto: l&#8217;intuizione geometrica</a></li>
<li><a href="#scala">Da una parabola a ChatGPT</a></li>
<li><a href="#evoluzioni">Le evoluzioni: scarpe migliori per il nostro esploratore</a></li>
</ul>
</div>



<h2 class="wp-block-heading" id="matematica">La matematica, spiegata geometricamente</h2>



<h3 class="wp-block-heading">La funzione di costo: misurare quanto sbaglia il modello</h3>



<p class="wp-block-paragraph">Prima di scendere, dobbiamo sapere <strong>cosa</strong> stiamo minimizzando. La persona bendata cerca il punto più basso della valle &mdash; ma nel machine learning, cos&#8217;è esattamente quella valle?</p>



<p class="wp-block-paragraph">Facciamo un esempio concreto. Supponiamo di voler prevedere il prezzo di una casa conoscendo solo la sua superficie. Abbiamo cinque case di cui conosciamo superficie e prezzo reale, e il nostro modello è il più semplice possibile: una retta che passa per l&#8217;origine, <strong>prezzo = m &times; superficie</strong>, dove <em>m</em> è l&#8217;unico parametro da regolare.</p>



<p class="wp-block-paragraph">Per ogni valore di <em>m</em>, il modello fa una previsione. Se <em>m</em> è troppo basso, le previsioni sottostimano i prezzi reali; se è troppo alto, li sovrastimano. Abbiamo bisogno di un numero che ci dica <em>quanto</em> il modello sta sbagliando: è la <strong>funzione di costo</strong> (o <em>loss function</em>, come dicono gli anglosassoni).</p>



<p class="wp-block-paragraph">La funzione di costo più usata è l&#8217;<strong>errore quadratico medio</strong> (MSE, <em>Mean Squared Error</em>): per ogni casa, calcoliamo la differenza tra il prezzo previsto e quello reale, la eleviamo al quadrato, e facciamo la media di tutti questi errori. In formula:</p>



<p class="wp-block-paragraph"><strong>MSE(m) = (1/n) &sum;<sub>i</sub> (prezzo<sub>i</sub> &minus; m &times; superficie<sub>i</sub>)&sup2;</strong></p>



<p class="wp-block-paragraph">Se plottiamo MSE(m) al variare di <em>m</em>, otteniamo una curva a forma di parabola: la stessa parabola che useremo tra poco come esempio della discesa del gradiente. Non è una coincidenza &mdash; <strong>la parabola è la funzione di costo</strong>, e il suo punto più basso è il valore di <em>m</em> che rende il modello migliore possibile.</p>



<p class="wp-block-paragraph">Gli esempi che seguono sono disponibili sia in R che in Python &mdash; ognuno segua il linguaggio con cui ha più familiarità.</p>



<p class="wp-block-paragraph">Calcoliamo in R la funzione di costo per il nostro esempio delle case:</p>



<pre><code class="language-r"># Funzione di costo: prevedere il prezzo di una casa
superficie &lt;- c(50, 70, 90, 120, 150)
prezzo &lt;- c(150, 200, 260, 340, 400)  # migliaia di euro

# Modello: prezzo = m * superficie
# Funzione di costo MSE al variare di m
m_valori &lt;- seq(1, 4, by = 0.01)
mse &lt;- sapply(m_valori, function(m) mean((prezzo - m * superficie)^2))

plot(m_valori, mse, type = "l", lwd = 2, col = "steelblue",
     xlab = "m (pendenza)", ylab = "MSE",
     main = "Funzione di costo al variare di m")
m_ottimo &lt;- m_valori[which.min(mse)]
abline(v = m_ottimo, col = "red", lty = 2)
cat("Il valore di m che minimizza l'errore:", round(m_ottimo, 2), "\n")</code></pre>



<p class="wp-block-paragraph">Verifichiamo in Python:</p>



<pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt

# Funzione di costo: prevedere il prezzo di una casa
superficie = np.array([50, 70, 90, 120, 150])
prezzo = np.array([150, 200, 260, 340, 400])  # migliaia di euro

# Modello: prezzo = m * superficie
# Funzione di costo MSE al variare di m
m_valori = np.linspace(1, 4, 301)  # equivalente a seq(1, 4, by=0.01) in R
mse = np.array([np.mean((prezzo - m * superficie)**2) for m in m_valori])

plt.plot(m_valori, mse, lw=2, color="steelblue")
plt.xlabel("m (pendenza)")
plt.ylabel("MSE")
plt.title("Funzione di costo al variare di m")
m_ottimo = m_valori[np.argmin(mse)]
plt.axvline(m_ottimo, color="red", linestyle="--")
plt.show()
print(f"Il valore di m che minimizza l'errore: {m_ottimo:.2f}")</code></pre>



<p class="wp-block-paragraph">Ora sappiamo cosa minimizzare: la funzione di costo. Il gradiente ci dice <em>come</em>.</p>



<h3 class="wp-block-heading">Derivata: la pendenza sotto i piedi</h3>



<p class="wp-block-paragraph">Quando hai una funzione di una sola variabile &mdash; pensala come un sentiero che sale e scende &mdash; la <strong>derivata</strong> in un punto ti dice quanto è ripido il sentiero in quel punto. Se la derivata è positiva, stai salendo. Se è negativa, stai scendendo. Se è zero, sei su un tratto piatto: forse una cima, forse un avvallamento.</p>



<p class="wp-block-paragraph">Esempio concreto: la funzione f(x) = x&sup2; descrive una parabola. La sua derivata è f'(x) = 2x. Se sei nel punto x = 3, la derivata vale 6: stai salendo ripidamente. Se sei in x = -1, la derivata vale -2: stai scendendo. In x = 0, la derivata è zero: sei nel punto più basso.</p>



<figure style="margin: 1.5em 0;text-align: center"><img decoding="async" src="https://www.gironi.it/blog/wp-content/uploads/2026/03/slide-derivata-pendenza.jpg" alt="Grafico della parabola f(x)=x² con tre punti annotati: A (x=3, derivata=6, pendenza ripida), B (x=-1, derivata=-2, pendenza dolce), C (x=0, derivata=0, minimo)" style="max-width: 100%;border: 1px solid #e0e0e0;border-radius: 6px" /></figure>



<h3 class="wp-block-heading">Il gradiente: una bussola multidimensionale</h3>



<p class="wp-block-paragraph">Nella realtà, le funzioni che ci interessano non dipendono da una sola variabile. Un modello di machine learning può avere centinaia, migliaia, o miliardi di parametri. Il paesaggio non è più un sentiero, ma una superficie in uno spazio a molte dimensioni &mdash; impossibile da visualizzare, ma perfettamente gestibile dalla matematica.</p>



<p class="wp-block-paragraph">Il <strong>gradiente</strong> è il vettore che raccoglie tutte le derivate parziali della funzione rispetto a ciascun parametro. Se la funzione dipende da due variabili (x, y), il gradiente è:</p>



<p class="wp-block-paragraph"><strong>&nabla;f = (&#8706;f/&#8706;x, &#8706;f/&#8706;y)</strong></p>



<p class="wp-block-paragraph">Se dipende da mille variabili, il gradiente è un vettore con mille componenti. In ogni caso, il gradiente punta nella direzione di massima salita. Per trovare il minimo, basta andare nella direzione opposta: <strong>meno il gradiente</strong>.</p>



<p class="wp-block-paragraph">Ecco la formula fondamentale della discesa del gradiente:</p>



<p class="wp-block-paragraph"><strong>&theta;<sub>nuovo</sub> = &theta;<sub>vecchio</sub> &minus; &alpha; &middot; &nabla;f(&theta;)</strong></p>



<p class="wp-block-paragraph">Smontiamola pezzo per pezzo:</p>



<ul class="wp-block-list">
<li><strong>&theta;</strong> rappresenta i parametri del modello &mdash; le &#8220;manopole&#8221; che l&#8217;algoritmo regola per migliorare</li>
<li><strong>&nabla;f(&theta;)</strong> è il gradiente: indica la direzione di massima salita nel punto attuale</li>
<li><strong>&alpha;</strong> (alpha) è il <em>learning rate</em>: la dimensione del passo che facciamo ad ogni iterazione</li>
<li>Il segno <strong>meno</strong> ci fa andare nella direzione opposta al gradiente, cioè in discesa</li>
</ul>



<p class="wp-block-paragraph">È tutto qui. Calcola dove stai salendo, fai un passo nella direzione opposta, ripeti.</p>



<figure style="margin: 1.5em 0;text-align: center"><img decoding="async" src="https://www.gironi.it/blog/wp-content/uploads/2026/03/slide-anatomia-passo.jpg" alt="Schema visuale della formula del gradient descent: theta (manopole del modello), alpha (learning rate come calibro), nabla f (gradiente come bussola), segno meno (direzione opposta)" style="max-width: 100%;border: 1px solid #e0e0e0;border-radius: 6px" /></figure>



<h3 class="wp-block-heading">Un esempio numerico in R</h3>



<p class="wp-block-paragraph">Vediamo la discesa del gradiente in azione sulla funzione f(x) = x&sup2;. Sappiamo che il minimo è in x = 0. L&#8217;algoritmo riesce a trovarlo partendo da un punto casuale?</p>



<pre><code class="language-r"># Discesa del gradiente su f(x) = x^2
# La derivata e' f'(x) = 2x

f &lt;- function(x) x^2         # funzione obiettivo
grad_f &lt;- function(x) 2 * x  # derivata (gradiente in 1D)

x &lt;- 10              # punto di partenza
alpha &lt;- 0.1          # learning rate
n_iter &lt;- 50          # numero di iterazioni
percorso &lt;- numeric(n_iter)

for (i in 1:n_iter) {
  percorso[i] &lt;- x
  x &lt;- x - alpha * grad_f(x)  # la regola fondamentale
}

cat("Punto di partenza: 10\n")
cat("Dopo 50 iterazioni: x =", round(x, 8), "\n")
cat("Valore della funzione:", round(f(x), 10), "\n")

# Visualizzazione del percorso
curve(x^2, from = -11, to = 11, lwd = 2, col = "steelblue",
      main = "Discesa del gradiente su f(x) = x^2",
      xlab = "x", ylab = "f(x)")
points(percorso, percorso^2, col = "red", pch = 19, cex = 0.7)
lines(percorso, percorso^2, col = "red", lty = 2)</code></pre>



<p class="wp-block-paragraph">Verifichiamo in Python:</p>



<pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt

# Discesa del gradiente su f(x) = x^2
f = lambda x: x**2           # funzione obiettivo
grad_f = lambda x: 2 * x     # derivata (gradiente in 1D)

x = 10.0            # punto di partenza
alpha = 0.1          # learning rate
n_iter = 50          # numero di iterazioni
percorso = np.zeros(n_iter)

for i in range(n_iter):
    percorso[i] = x
    x = x - alpha * grad_f(x)  # la regola fondamentale

print(f"Punto di partenza: 10")
print(f"Dopo 50 iterazioni: x = {x:.8f}")
print(f"Valore della funzione: {f(x):.10f}")

# Visualizzazione del percorso
xs = np.linspace(-11, 11, 200)
plt.plot(xs, xs**2, lw=2, color="steelblue")
plt.plot(percorso, percorso**2, "ro--", markersize=4)
plt.title("Discesa del gradiente su f(x) = x²")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.show()</code></pre>



<p class="wp-block-paragraph">Eseguendo questo codice, si vede l&#8217;algoritmo partire da x = 10 e convergere rapidamente verso x = 0. I primi passi sono grandi (la pendenza è ripida), poi si accorciano man mano che ci avviciniamo al fondo della parabola. Dopo 50 iterazioni, x è praticamente zero.</p>



<h2 class="wp-block-heading" id="learning-rate">Il learning rate: passi grandi o passi piccoli?</h2>



<p class="wp-block-paragraph">Torniamo alla nostra persona bendata. Quant&#8217;è grande il passo che fa ad ogni iterazione? Questa è esattamente la domanda del <strong>learning rate</strong> (&alpha;), e la risposta è meno banale di quanto sembri.</p>



<p class="wp-block-paragraph"><strong>Passi troppo piccoli</strong> (&alpha; molto basso): la persona si muove con cautela estrema, spostando un piede di pochi centimetri alla volta. Alla fine arriverà in fondo alla valle, ma potrebbe impiegare un&#8217;eternità. Nel machine learning, questo significa tempi di addestramento lunghissimi e costi computazionali elevati.</p>



<p class="wp-block-paragraph"><strong>Passi troppo grandi</strong> (&alpha; troppo alto): la persona fa balzi enormi. Invece di scendere dolcemente nella valle, la scavalca, finisce dall&#8217;altra parte, rimbalza indietro, e continua a oscillare senza mai stabilizzarsi. In casi estremi, i salti diventano sempre più grandi e la persona finisce più in alto di dove era partita. Nel machine learning, questo si chiama <em>divergenza</em>: il modello peggiora invece di migliorare.</p>



<p class="wp-block-paragraph"><strong>Passi giusti</strong>: un buon learning rate permette di scendere velocemente senza oscillare. Nella pratica, trovare il valore giusto richiede sperimentazione. È uno degli aspetti più artigianali del machine learning.</p>



<figure style="margin: 1.5em 0;text-align: center"><img decoding="async" src="https://www.gironi.it/blog/wp-content/uploads/2026/03/slide-learning-rate.jpg" alt="Confronto visuale di tre learning rate sulla parabola: alpha=0.01 troppo lento con passi pigri, alpha=0.1 convergenza efficiente, alpha=0.9 oscillazione caotica" style="max-width: 100%;border: 1px solid #e0e0e0;border-radius: 6px" /></figure>



<h3 class="wp-block-heading">Convergenza: sapere quando fermarsi</h3>



<p class="wp-block-paragraph">Come sa la persona bendata di essere arrivata? Sente che il terreno è piatto in tutte le direzioni: il gradiente è (quasi) zero. In pratica, l&#8217;algoritmo si ferma quando il miglioramento tra un&#8217;iterazione e l&#8217;altra diventa trascurabile, o quando ha raggiunto un numero massimo di iterazioni.</p>



<p class="wp-block-paragraph">I criteri di arresto più comuni sono:</p>



<ul class="wp-block-list">
<li>La norma del gradiente scende sotto una soglia minima (il terreno è quasi piatto)</li>
<li>La differenza tra f(&theta;) di due iterazioni consecutive è minore di una tolleranza fissata</li>
<li>Si è raggiunto il numero massimo di iterazioni (budget computazionale esaurito)</li>
</ul>



<h3 class="wp-block-heading">L&#8217;effetto del learning rate: un confronto visuale</h3>



<p class="wp-block-paragraph">Questo codice R mostra l&#8217;effetto di tre diversi valori di learning rate sulla stessa funzione:</p>



<pre><code class="language-r"># Confronto di tre learning rate sulla funzione f(x) = x^2
gradient_descent &lt;- function(x0, alpha, n_iter = 30) {
  x &lt;- x0
  percorso &lt;- numeric(n_iter)
  for (i in 1:n_iter) {
    percorso[i] &lt;- x
    x &lt;- x - alpha * 2 * x  # theta_new = theta_old - alpha * grad
  }
  return(percorso)
}

x0 &lt;- 8  # stesso punto di partenza per tutti

# Tre learning rate diversi
lento    &lt;- gradient_descent(x0, alpha = 0.01)   # troppo piccolo
giusto   &lt;- gradient_descent(x0, alpha = 0.1)    # buon compromesso
veloce   &lt;- gradient_descent(x0, alpha = 0.9)    # quasi instabile

# Visualizzazione
par(mfrow = c(1, 3))

# alpha = 0.01 (troppo lento)
curve(x^2, from = -10, to = 10, lwd = 2, col = "steelblue",
      main = expression(paste(alpha, " = 0.01 (troppo lento)")))
points(lento, lento^2, col = "red", pch = 19, cex = 0.6)
lines(lento, lento^2, col = "red", lty = 2)

# alpha = 0.1 (giusto)
curve(x^2, from = -10, to = 10, lwd = 2, col = "steelblue",
      main = expression(paste(alpha, " = 0.1 (buon compromesso)")))
points(giusto, giusto^2, col = "darkgreen", pch = 19, cex = 0.6)
lines(giusto, giusto^2, col = "darkgreen", lty = 2)

# alpha = 0.9 (quasi instabile)
curve(x^2, from = -10, to = 10, lwd = 2, col = "steelblue",
      main = expression(paste(alpha, " = 0.9 (quasi instabile)")))
points(veloce, veloce^2, col = "orange", pch = 19, cex = 0.6)
lines(veloce, veloce^2, col = "orange", lty = 2)

par(mfrow = c(1, 1))</code></pre>



<p class="wp-block-paragraph">Confrontiamo in Python:</p>



<pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt

def gradient_descent(x0, alpha, n_iter=30):
    x = x0
    percorso = np.zeros(n_iter)
    for i in range(n_iter):
        percorso[i] = x
        x = x - alpha * 2 * x  # theta_new = theta_old - alpha * grad
    return percorso

x0 = 8.0  # stesso punto di partenza per tutti
lento  = gradient_descent(x0, alpha=0.01)   # troppo piccolo
giusto = gradient_descent(x0, alpha=0.1)    # buon compromesso
veloce = gradient_descent(x0, alpha=0.9)    # quasi instabile

fig, axes = plt.subplots(1, 3, figsize=(14, 4))
xs = np.linspace(-10, 10, 200)
for ax, dati, colore, titolo in zip(axes,
        [lento, giusto, veloce],
        ["red", "darkgreen", "orange"],
        ["\u03b1 = 0.01 (troppo lento)", "\u03b1 = 0.1 (buon compromesso)",
         "\u03b1 = 0.9 (quasi instabile)"]):
    ax.plot(xs, xs**2, lw=2, color="steelblue")
    ax.plot(dati, dati**2, "o--", color=colore, markersize=4)
    ax.set_title(titolo)
plt.tight_layout()
plt.show()</code></pre>



<p class="wp-block-paragraph">Con &alpha; = 0.01 i punti rossi si muovono pigramente: dopo 30 iterazioni siamo ancora lontani dal minimo. Con &alpha; = 0.1 la convergenza è rapida e pulita. Con &alpha; = 0.9 l&#8217;algoritmo oscilla vistosamente a ogni passo, rimbalzando da un lato all&#8217;altro della parabola prima di stabilizzarsi &mdash; un learning rate appena più alto e divergerebbe del tutto.</p>



<h2 class="wp-block-heading" id="problemi">Cosa può andare storto: l&#8217;intuizione geometrica</h2>



<p class="wp-block-paragraph">Il paesaggio matematico di un modello reale non è una bella parabola simmetrica. È un terreno selvaggio, con valli secondarie, creste, altipiani e forme che sfidano l&#8217;immaginazione. Ecco i problemi classici, spiegati con l&#8217;analogia del paesaggio.</p>



<figure style="margin: 1.5em 0;text-align: center"><img decoding="async" src="https://www.gironi.it/blog/wp-content/uploads/2026/03/slide-insidie-topografiche.jpg" alt="Tre insidie della discesa del gradiente visualizzate in 3D: minimo locale (valle secondaria), punto di sella (gradiente zero ma non minimo), valle stretta (zigzag inefficiente)" style="max-width: 100%;border: 1px solid #e0e0e0;border-radius: 6px" /></figure>



<h3 class="wp-block-heading">Minimi locali: le valli secondarie</h3>



<p class="wp-block-paragraph">Immagina un terreno con più avvallamenti: una valle profonda (il minimo globale) e diverse vallette meno profonde (i minimi locali). La persona bendata non ha modo di sapere se la valle in cui si trova è quella più profonda. Sente il terreno piatto sotto i piedi e si ferma, convinta di essere arrivata. Ma potrebbe trovarsi in una valletta poco profonda, mentre il vero minimo è da tutt&#8217;altra parte.</p>



<p class="wp-block-paragraph">Nella pratica, questo è un problema meno grave di quanto si pensasse. Le reti neurali moderne hanno così tanti parametri che i minimi locali tendono ad avere valori della funzione obiettivo simili al minimo globale. È come un terreno con molte valli, ma tutte più o meno alla stessa altitudine: finire in una qualsiasi va bene.</p>



<h3 class="wp-block-heading">Punti di sella: la sella di cavallo</h3>



<p class="wp-block-paragraph">Un problema più insidioso sono i <strong>punti di sella</strong> (<em>saddle points</em>). Immagina di essere seduto su una sella di cavallo: se ti muovi avanti o indietro, scendi; se ti muovi a destra o sinistra, sali. In quel punto il gradiente è zero &mdash; il terreno sembra piatto &mdash; ma non sei in un minimo. Sei su un punto che è minimo in alcune direzioni e massimo in altre.</p>



<p class="wp-block-paragraph">In spazi ad alta dimensionalità, i punti di sella sono molto più comuni dei minimi locali. Fortunatamente, le varianti moderne della discesa del gradiente (con un po&#8217; di rumore o di momentum, come vedremo) riescono generalmente a sfuggire ai punti di sella.</p>



<h3 class="wp-block-heading">Valli strette: lo zigzag</h3>



<p class="wp-block-paragraph">Immagina una valle molto stretta e allungata, come un canyon. Il gradiente punta quasi perpendicolarmente alle pareti del canyon, non lungo il canyon verso il fondo. La persona bendata finisce per rimbalzare da una parete all&#8217;altra, facendo uno zigzag inefficiente invece di camminare dritta verso il fondo.</p>



<p class="wp-block-paragraph">Questo accade quando le variabili del problema hanno scale molto diverse: alcune cambiano rapidamente, altre lentamente. È un problema comune nella pratica, e una delle motivazioni principali per gli ottimizzatori avanzati come Adam, che vedremo nella sezione finale.</p>



<h2 class="wp-block-heading" id="scala">Da una parabola a ChatGPT</h2>



<p class="wp-block-paragraph">Finora abbiamo visto la discesa del gradiente su una parabola: un problema con una sola variabile. È il caso più semplice possibile. Ma il bello di questo algoritmo è che funziona esattamente allo stesso modo a qualsiasi scala.</p>



<h3 class="wp-block-heading">La scala dei parametri</h3>



<p class="wp-block-paragraph">Ecco come cresce il numero di parametri man mano che i modelli diventano più complessi:</p>



<ul class="wp-block-list">
<li><strong>Regressione lineare semplice</strong>: 2 parametri (pendenza e intercetta). Il paesaggio è una superficie 3D facile da visualizzare.</li>
<li><strong>Rete neurale per riconoscere cifre scritte a mano</strong>: ~100.000 parametri. Il paesaggio ha 100.000 dimensioni.</li>
<li><strong>ResNet-50</strong> (classificazione immagini, 2015): ~25 milioni di parametri.</li>
<li><strong>GPT-3</strong> (il predecessore di ChatGPT): 175 miliardi di parametri.</li>
<li><strong>GPT-4</strong> e modelli di frontiera (2023-2025): si stima oltre un trilione di parametri.</li>
</ul>



<p class="wp-block-paragraph">Il principio è identico: calcola il gradiente, fai un passo nella direzione opposta, ripeti. Quello che cambia è la scala del calcolo. Il gradiente di GPT-4 è un vettore con più di mille miliardi di componenti, calcolato su miliardi di frammenti di testo, usando migliaia di processori in parallelo. Ma la formula è la stessa che abbiamo visto sulla parabola.</p>



<h3 class="wp-block-heading">Dove lo vedi in azione (senza saperlo)</h3>



<p class="wp-block-paragraph">Ogni volta che interagisci con un sistema di intelligenza artificiale, la discesa del gradiente ha lavorato dietro le quinte:</p>



<ul class="wp-block-list">
<li><strong>Netflix e Spotify</strong> che ti consigliano cosa guardare o ascoltare: i modelli di raccomandazione sono addestrati con gradient descent su miliardi di interazioni utente</li>
<li><strong>Google Translate</strong> e i traduttori automatici: reti neurali con centinaia di milioni di parametri, ottimizzate con discesa del gradiente su enormi corpora di testi paralleli</li>
<li><strong>Assistenti vocali</strong> (Siri, Alexa): il riconoscimento vocale usa reti neurali profonde, addestrate con lo stesso algoritmo</li>
<li><strong>Guida autonoma</strong>: le reti che riconoscono pedoni, semafori e corsie stradali sono addestrate con varianti della discesa del gradiente</li>
<li><strong>ChatGPT, Claude, Gemini</strong>: i Large Language Model sono il caso più estremo &mdash; la discesa del gradiente applicata a miliardi di parametri su trilioni di token di testo</li>
</ul>



<p class="wp-block-paragraph">Il messaggio chiave è questo: <strong>la potenza dell&#8217;AI moderna non sta nella complessità dell&#8217;algoritmo di ottimizzazione, ma nella scala</strong>. La discesa del gradiente è concettualmente semplice. Quello che ha reso possibile la rivoluzione dell&#8217;intelligenza artificiale è la capacità di applicarlo a modelli enormi su quantità enormi di dati, grazie a hardware sempre più potente.</p>



<h2 class="wp-block-heading" id="evoluzioni">Le evoluzioni: scarpe migliori per il nostro esploratore</h2>



<p class="wp-block-paragraph">La discesa del gradiente &#8220;vanilla&#8221; &mdash; quella che abbiamo visto finora &mdash; funziona, ma ha i limiti che abbiamo descritto: può essere lenta, può oscillare, può restare bloccata. Nel corso degli anni, i ricercatori hanno sviluppato varianti che risolvono questi problemi. Senza entrare nelle formule, ecco le idee chiave.</p>



<h3 class="wp-block-heading">Stochastic Gradient Descent (SGD)</h3>



<p class="wp-block-paragraph">Invece di calcolare il gradiente sull&#8217;intero dataset ad ogni passo (computazionalmente costosissimo), SGD lo calcola su un piccolo campione casuale (<em>mini-batch</em>). È come se la persona bendata, invece di tastare l&#8217;intero terreno intorno a sé, tastasse solo qualche punto a caso. La stima della pendenza è rumorosa, ma mediamente corretta, e la velocità di calcolo è enormemente maggiore. Il rumore, paradossalmente, è anche utile: aiuta a sfuggire ai minimi locali e ai punti di sella.</p>



<h3 class="wp-block-heading">Momentum</h3>



<p class="wp-block-paragraph">Immagina una palla che rotola giù per la collina invece di una persona che cammina. La palla accumula velocità: se la pendenza continua nella stessa direzione, accelera. Se la pendenza cambia direzione, la palla rallenta prima di invertire. Questo è il momentum: l&#8217;algoritmo &#8220;ricorda&#8221; la direzione in cui si stava muovendo e ci aggiunge il gradiente attuale. Il risultato è che attraversa più velocemente le zone piatte e oscilla meno nelle valli strette.</p>



<h3 class="wp-block-heading">Adam: il coltellino svizzero</h3>



<p class="wp-block-paragraph"><strong>Adam</strong> (<em>Adaptive Moment Estimation</em>) combina l&#8217;idea del momentum con un learning rate che si adatta automaticamente per ogni parametro. I parametri che cambiano poco ottengono passi più grandi; quelli che cambiano molto ottengono passi più piccoli. È come se la persona bendata avesse scarpe intelligenti che regolano la lunghezza del passo in base al terreno sotto ogni piede.</p>



<p class="wp-block-paragraph">Adam è diventato lo standard de facto per addestrare la maggior parte delle reti neurali moderne. È robusto, richiede poca regolazione manuale, e funziona bene in una vasta gamma di problemi. Quasi tutti i modelli che usi quotidianamente &mdash; da Spotify a ChatGPT &mdash; sono stati addestrati con Adam o con una sua variante.</p>



<h2 class="wp-block-heading">Ritorno alla montagna</h2>



<p class="wp-block-paragraph">La persona bendata da cui siamo partiti ora ha scarpe migliori. Ha una palla che accumula velocità invece di gambe che fanno passi rigidi. Ha suole che si adattano automaticamente al terreno. E soprattutto, non cammina su una montagna con due o tre dimensioni: cammina su un paesaggio con miliardi di dimensioni.</p>



<p class="wp-block-paragraph">Ma il principio è esattamente lo stesso. Senti la pendenza. Fai un passo nella direzione in cui scende. Ripeti.</p>



<p class="wp-block-paragraph">La discesa del gradiente non è un algoritmo spettacolare. Non ha la complessità elegante di un algoritmo genetico o il fascino narrativo delle reti adversariali. È una procedura meccanica, quasi banale. Ma è la procedura meccanica su cui si regge l&#8217;intera rivoluzione dell&#8217;intelligenza artificiale. Dai suggerimenti di Netflix ai modelli che generano immagini, dalla guida autonoma alla traduzione simultanea, tutto si riduce a questo: una funzione da minimizzare, un gradiente da calcolare, un passo da fare.</p>



<p class="wp-block-paragraph">La prossima volta che un assistente vocale capisce la tua domanda, o che un traduttore automatico indovina una sfumatura, ricorda: dietro le quinte, una versione molto sofisticata della nostra persona bendata ha camminato per miliardi di passi su un paesaggio con miliardi di dimensioni. E ha trovato una valle abbastanza profonda da essere utile.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Per approfondire</h3>



<p class="wp-block-paragraph">Per inquadrare la discesa del gradiente nel contesto pi&ugrave; ampio dell&#8217;apprendimento statistico, <a href="https://www.amazon.it/dp/1461471370?tag=consulenzeinf-21&#038;ascsubtag=lalgoritmo-di-discesa-del-gradiente-gradient-descent-spiegato-semplice" rel="nofollow sponsored noopener" target="_blank"><em>An Introduction to Statistical Learning</em></a> di James, Witten, Hastie e Tibshirani &egrave; la lettura che consigliamo: rigorosa ma sempre orientata alla pratica.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/lalgoritmo-di-discesa-del-gradiente-gradient-descent-spiegato-semplice/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>La Discesa del Gradiente: un nuovo studio mette in discussione un assunto base sull&#8217;ottimizzazione</title>
		<link>https://www.gironi.it/blog/la-discesa-del-gradiente-un-nuovo-studio-mette-in-discussione-un-assunto-base-sullottimizzazione/</link>
					<comments>https://www.gironi.it/blog/la-discesa-del-gradiente-un-nuovo-studio-mette-in-discussione-un-assunto-base-sullottimizzazione/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Sun, 20 Aug 2023 13:45:44 +0000</pubDate>
				<category><![CDATA[ai]]></category>
		<category><![CDATA[statistica]]></category>
		<category><![CDATA[algoritmi]]></category>
		<category><![CDATA[discesa del gradiente]]></category>
		<category><![CDATA[machine learning]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3031</guid>

					<description><![CDATA[Nel 1847, il matematico francese Augustin-Louis Cauchy stava lavorando su calcoli astronomici, quando ideò un metodo comune di ottimizzazione ora noto come discesa del gradiente. Oggi la maggior parte dei programmi di machine learning si basa su questa tecnica, e anche altri campi la usano per analizzare dati e risolvere problemi ingegneristici. I ricercatori hanno &#8230; <a href="https://www.gironi.it/blog/la-discesa-del-gradiente-un-nuovo-studio-mette-in-discussione-un-assunto-base-sullottimizzazione/" class="more-link">Leggi tutto<span class="screen-reader-text"> "La Discesa del Gradiente: un nuovo studio mette in discussione un assunto base sull&#8217;ottimizzazione"</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nel 1847, il matematico francese Augustin-Louis Cauchy stava lavorando su calcoli astronomici, quando ideò un metodo comune di ottimizzazione ora noto come <strong><em>discesa del gradiente</em></strong>. Oggi la maggior parte dei programmi di <em>machine learning</em> si basa su questa tecnica, e anche altri campi la usano per analizzare dati e risolvere problemi ingegneristici.</p>



<span id="more-3031"></span>



<p class="wp-block-paragraph">I ricercatori hanno perfezionato la discesa del gradiente per oltre 150 anni, ma un recente studio ha dimostrato che un suo presupposto di base potrebbe essere sbagliato. Il lavoro ha mostrato che <strong>la tecnica può funzionare quasi 3 volte più velocemente se infrange una regola accettata da tempo su come trovare la soluzione ottimale</strong>.</p>



<p class="wp-block-paragraph">La discesa del gradiente usa una &#8220;<em>funzione di costo</em><sup data-fn="72f4e4ff-094b-4fbe-bb32-129bd1819921" class="fn"><a href="#72f4e4ff-094b-4fbe-bb32-129bd1819921" id="72f4e4ff-094b-4fbe-bb32-129bd1819921-link">1</a></sup>&#8221; per capire dove si trova il punto ottimo. Gli algoritmi si muovono seguendo il gradiente più ripido della curva per raggiungere il minimo della funzione.</p>



<p class="wp-block-paragraph">La saggezza consolidata è che l&#8217;algoritmo debba muoversi con piccoli passi per non &#8220;oltrepassare&#8221; la soluzione. Ma il nuovo studio ha scoperto che <strong>una sequenza con un grande passo al centro converge più velocemente</strong>. Questo approccio ciclico con un &#8220;salto gigante&#8221; può arrivare al punto ottimo 3 volte più rapidamente.</p>



<p class="wp-block-paragraph">La ricerca rimette in discussione l&#8217;intuizione su come funziona al meglio la discesa del gradiente. Anche se difficilmente cambierà l&#8217;uso pratico della tecnica, costringe a riconsiderare la teoria che vi è dietro.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Fonte: <a href="https://www.quantamagazine.org/risky-giant-steps-can-solve-optimization-problems-faster-20230811/" target="_blank" rel="noreferrer noopener">Quanta Magazine</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<ol class="wp-block-footnotes"><li id="72f4e4ff-094b-4fbe-bb32-129bd1819921">Una &#8220;funzione di costo&#8221; è una misura quantitativa che valuta l&#8217;adeguatezza delle previsioni generate da un modello rispetto ai dati di addestramento. In termini più precisi, una funzione di costo assegna un valore numerico a ciascuna previsione del modello in base alla discrepanza tra la previsione e il valore reale associato. L&#8217;obiettivo della funzione di costo è minimizzare questo valore numerico, indicando una migliore aderenza del modello ai dati di addestramento. In molti algoritmi di apprendimento automatico, la scelta della funzione di costo influisce sulla capacità del modello di apprendere e generalizzare correttamente dai dati. <a href="#72f4e4ff-094b-4fbe-bb32-129bd1819921-link" aria-label="Salta al riferimento nella nota a piè di pagina 1">↩︎</a></li></ol>]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/la-discesa-del-gradiente-un-nuovo-studio-mette-in-discussione-un-assunto-base-sullottimizzazione/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Regressione logistica: cos&#8217;è, come leggere gli odds ratio e un esempio in R</title>
		<link>https://www.gironi.it/blog/la-regressione-logistica/</link>
					<comments>https://www.gironi.it/blog/la-regressione-logistica/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Thu, 12 Jan 2023 14:47:03 +0000</pubDate>
				<category><![CDATA[ai]]></category>
		<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=2631</guid>

					<description><![CDATA[Prima o poi, ogni analisi del traffico arriva alla domanda che conta davvero: questa visita si è trasformata in un cliente, sì o no? Non ci interessa quanto ha convertito una sessione, ci interessa se l&#8217;ha fatto. E subito dopo viene la domanda successiva: quali sessioni hanno più probabilità di farlo? Quelle che arrivano da &#8230; <a href="https://www.gironi.it/blog/la-regressione-logistica/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Regressione logistica: cos&#8217;è, come leggere gli odds ratio e un esempio in R"</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Prima o poi, ogni analisi del traffico arriva alla domanda che conta davvero: questa visita si è trasformata in un cliente, sì o no? Non ci interessa <em>quanto</em> ha convertito una sessione, ci interessa <em>se</em> l&#8217;ha fatto. E subito dopo viene la domanda successiva: quali sessioni hanno più probabilità di farlo? Quelle che arrivano da una ricerca col nome del brand? Quelle che sfogliano più pagine? Quelle da desktop?</p>



<p class="wp-block-paragraph">Con la <a href="https://www.gironi.it/blog/regressione-lineare-semplice/">regressione lineare</a> abbiamo imparato a prevedere un numero. Qui però il risultato è un interruttore, acceso o spento, e la retta non è lo strumento giusto: vedremo che arriva perfino a prevedere probabilità negative. Lo strumento giusto è la <strong>regressione logistica</strong>, uno dei modelli più usati in assoluto, dal marketing alla medicina. Costruiamola insieme, partendo proprio da un esempio di conversioni.</p>



<span id="more-2631"></span>



<p class="wp-block-paragraph"><strong>In sintesi:</strong> la <strong>regressione logistica</strong> è il modello statistico che stima la <strong>probabilità di un esito binario</strong> (converte o no, clicca o no) in base a una o più variabili. Invece di una retta usa la <strong>funzione logistica</strong>, una curva a S che resta sempre fra 0 e 1. I coefficienti sono espressi in <em>log-odds</em>: elevati a esponente diventano <strong>odds ratio</strong>, cioè di quante volte si moltiplicano gli odds dell&#8217;evento quando una variabile aumenta di un&#8217;unità. In R si stima con <code>glm(..., family = binomial)</code> e si ottengono le probabilità con <code>predict(..., type = "response")</code>. Per classificare serve poi una <strong>soglia</strong>, che con eventi rari va scelta con cura: 0,5 non è quasi mai quella giusta.</p>



<p class="wp-block-paragraph"><strong>Di cosa parleremo</strong>:</p>



<ul class="wp-block-list"><li><a href="#perche-non-la-retta">Perché una retta non basta?</a></li><li><a href="#equazione-logistica">Da probabilità a odds a logit: l&#8217;equazione logistica</a></li><li><a href="#esempio-r">Come si stima una regressione logistica in R?</a></li><li><a href="#odds-ratio">Come si leggono i coefficienti? Gli odds ratio</a></li><li><a href="#soglia">Dalle probabilità alle decisioni: dove mettere la soglia?</a></li><li><a href="#assunzioni">Le condizioni per usarla</a></li><li><a href="#domande-frequenti">Domande frequenti</a></li><li><a href="#prova-tu">Prova tu</a></li><li><a href="#per-approfondire">Per approfondire</a></li></ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="perche-non-la-retta">Perché una retta non basta?</h2>



<p class="wp-block-paragraph">Prendiamo 5.000 sessioni organiche di un e-commerce. Per ciascuna conosciamo tre cose: quante pagine ha visto, se arrivava da smartphone o da desktop, e se la query di partenza conteneva il nome del brand. E sappiamo se la sessione si è chiusa con un acquisto: hanno convertito in 271, il 5,4%. I dati sono simulati, così conosciamo la verità e possiamo controllare se il modello la ritrova.</p>



<p class="wp-block-paragraph">L&#8217;idea più immediata è trattare la conversione come un numero, 1 se c&#8217;è stata e 0 se no, e farci passare sopra una retta coi minimi quadrati. Ha perfino un nome, <em>modello lineare di probabilità</em>, e in qualche caso funziona in modo accettabile. Ma guardiamo cosa succede ai nostri dati.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.gironi.it/blog/wp-content/uploads/2026/10/regressione-logistica-retta-curva.png" alt="Tasso di conversione osservato per numero di pagine viste (le bolle, la cui area indica quante sessioni ci sono) con la retta dei minimi quadrati e la curva logistica. La retta aggiunge sempre 1,9 punti per pagina e resta sotto i dati a destra; la curva sale piano e poi accelera, seguendo le bolle."/><figcaption class="wp-element-caption">Tasso di conversione osservato per numero di pagine viste (le bolle, la cui area indica quante sessioni ci sono) con la retta dei minimi quadrati e la curva logistica. La retta aggiunge sempre 1,9 punti per pagina e resta sotto i dati a destra; la curva sale piano e poi accelera, seguendo le bolle.</figcaption></figure>



<p class="wp-block-paragraph">La retta dice che ogni pagina in più vale sempre 1,9 punti percentuali di conversione, sia che si passi da 1 a 2 pagine sia che si passi da 8 a 9. I dati raccontano un&#8217;altra storia: chi vede poche pagine converte pochissimo e quasi a prescindere, poi la probabilità accelera. E quando aggiungiamo anche dispositivo e brand le cose peggiorano: <strong>il modello lineare assegna a 654 sessioni su 5.000 una probabilità di conversione negativa</strong>, fino a −2,2%. Una probabilità sotto zero non ha alcun significato. Dall&#8217;altra parte, al profilo migliore (12 pagine, desktop, query brand) assegna il 28,8% quando la logistica, come vedremo, stima il 72,9%.</p>



<p class="wp-block-paragraph">Il problema è di forma. Una probabilità vive fra 0 e 1, e vicino ai bordi deve per forza «frenare»: non si può salire oltre il 100% né scendere sotto lo zero. Una retta, invece, prosegue all&#8217;infinito. Serve una curva che abbia i freni incorporati.</p>



<h2 class="wp-block-heading" id="equazione-logistica">Da probabilità a odds a logit: l&#8217;equazione logistica</h2>



<p class="wp-block-paragraph">La regressione logistica risolve il problema con un cambio di scala in due passi. Il primo passo sono gli <strong>odds</strong>, una parola che chi frequenta le scommesse conosce bene: invece della probabilità che un evento accada, si guarda il rapporto fra la probabilità che accada e quella che non accada.</p>



<p class="wp-block-paragraph">\(\text{odds} = \frac{p}{1-p}\)</p>



<p class="wp-block-paragraph">Con una probabilità del 20%, gli odds sono 0,2 / 0,8 = 0,25: «uno a quattro», un successo ogni quattro insuccessi. Con il 50% gli odds valgono 1, e con l&#8217;80% salgono a 4. Gli odds non hanno il tetto dell&#8217;1: vanno da zero a infinito.</p>



<p class="wp-block-paragraph">Il secondo passo è prenderne il logaritmo. Il <strong>logaritmo degli odds</strong>, chiamato <em>logit</em>, toglie anche il pavimento dello zero e può assumere qualunque valore, da meno infinito a più infinito. Ed è proprio su questa scala libera che la regressione logistica mette la sua equazione lineare, identica nella forma a quella della <a href="https://www.gironi.it/blog/regressione-multipla-spiegata-semplice/">regressione multipla</a>:</p>



<p class="wp-block-paragraph">\(\ln\left(\frac{p}{1-p}\right) = b_0 + b_1 x_1 + b_2 x_2 + \dots + b_k x_k\)</p>



<p class="wp-block-paragraph">dove p è la probabilità dell&#8217;evento, le x sono le variabili (i <em>predittori</em>) e le b i coefficienti da stimare. Per tornare alla probabilità basta invertire il percorso, e si ottiene la <strong>funzione logistica</strong>, detta anche <em>sigmoide</em> per la sua forma a S:</p>



<p class="wp-block-paragraph">\(p = \frac{1}{1 + e^{-(b_0 + b_1 x_1 + \dots + b_k x_k)}}\)</p>



<p class="wp-block-paragraph">Qualunque valore assuma l&#8217;espressione fra parentesi, il risultato resta sempre compreso fra 0 e 1. Ecco i freni incorporati: <strong>la logistica è una retta sulla scala dei log-odds, che diventa una curva a S sulla scala delle probabilità</strong>.</p>



<p class="wp-block-paragraph">I coefficienti non si trovano coi minimi quadrati ma con il metodo della <em>massima verosimiglianza</em>: fra tutte le curve possibili, si sceglie quella che rende più probabili i dati che abbiamo effettivamente osservato. Il calcolo è iterativo e lo lasciamo volentieri al software.</p>



<h2 class="wp-block-heading" id="esempio-r">Come si stima una regressione logistica in R?</h2>



<p class="wp-block-paragraph">Simuliamo le 5.000 sessioni. Nella realtà i dati arriverebbero da Google Analytics o dal CRM; qui li costruiamo noi, con effetti noti, per poter verificare il risultato:</p>



<pre class="wp-block-code"><code>set.seed(7)
n &lt;- 5000
sessioni &lt;- data.frame(
  pagine = 1 + rpois(n, 2.5),    # pagine viste nella sessione
  mobile = rbinom(n, 1, 0.6),    # 1 = smartphone, 0 = desktop
  brand  = rbinom(n, 1, 0.25)    # 1 = arrivata da una query col nome del brand
)
logit_vero &lt;- -4.4 + 0.35 * sessioni$pagine - 0.5 * sessioni$mobile + 1.2 * sessioni$brand
sessioni$converte &lt;- rbinom(n, 1, plogis(logit_vero))

mean(sessioni$converte)
# [1] 0.0542</code></pre>



<p class="wp-block-paragraph">La funzione <code>plogis()</code> è proprio la funzione logistica: trasforma il logit vero in una probabilità, e <code>rbinom()</code> lancia per ogni sessione una moneta truccata con quella probabilità. È il motivo per cui nel modello compare <code>family = binomial</code>: ogni sessione è una prova di Bernoulli, il mattone della <a href="https://www.gironi.it/blog/distribuzioni-di-probabilita-distribuzioni-discrete-la-binomiale/">distribuzione binomiale</a>.</p>



<p class="wp-block-paragraph">Stimiamo il modello:</p>



<pre class="wp-block-code"><code>modello &lt;- glm(converte ~ pagine + mobile + brand, data = sessioni, family = binomial)
summary(modello)
# Coefficients:
#             Estimate Std. Error z value Pr(&gt;|z|)
# (Intercept) -4.37566    0.18872 -23.187  &lt; 2e-16 ***
# pagine       0.34742    0.03584   9.693  &lt; 2e-16 ***
# mobile      -0.50057    0.12834  -3.900 9.61e-05 ***
# brand        1.19691    0.12868   9.302  &lt; 2e-16 ***
#
#     Null deviance: 2107.0  on 4999  degrees of freedom
# Residual deviance: 1923.8  on 4996  degrees of freedom
# AIC: 1931.8</code></pre>



<p class="wp-block-paragraph">Il modello ritrova quasi alla perfezione i valori con cui abbiamo costruito i dati: 0,347 contro 0,35 per le pagine, −0,501 contro −0,5 per il mobile, 1,197 contro 1,2 per il brand. Le colonne si leggono come nella regressione lineare: stima, errore standard, la statistica z (qui al posto della t) e il <a href="https://www.gironi.it/blog/p-value/">p-value</a>. La <em>devianza</em> è l&#8217;equivalente logistico della somma dei quadrati dei residui: scende da 2107 (il modello senza predittori) a 1924, segno che le tre variabili spiegano qualcosa.</p>



<p class="wp-block-paragraph">Già il segno dei coefficienti dice molto: più pagine e query brand fanno salire la probabilità di conversione, lo smartphone la fa scendere. Ma quanto? Qui la logistica chiede un passo in più.</p>



<h2 class="wp-block-heading" id="odds-ratio">Come si leggono i coefficienti? Gli odds ratio</h2>



<p class="wp-block-paragraph">I coefficienti sono sulla scala dei log-odds, che nessuno ha l&#8217;abitudine di pensare. Il trucco è elevarli a esponente: <strong>e elevato al coefficiente è l&#8217;odds ratio</strong>, il numero per cui si moltiplicano gli odds della conversione quando la variabile aumenta di un&#8217;unità, a parità delle altre. Calcoliamoli insieme ai loro <a href="https://www.gironi.it/blog/intervalli-di-confidenza/">intervalli di confidenza</a>:</p>



<pre class="wp-block-code"><code>round(exp(cbind(OR = coef(modello), confint(modello))), 3)
#                OR 2.5 % 97.5 %
# (Intercept) 0.013 0.009  0.018
# pagine      1.415 1.319  1.519
# mobile      0.606 0.471  0.780
# brand       3.310 2.572  4.261</code></pre>



<p class="wp-block-paragraph">Traduciamo riga per riga:</p>



<ul class="wp-block-list"><li><strong>pagine</strong>: ogni pagina vista in più moltiplica gli odds di conversione per 1,415, cioè li fa crescere del 41,5% circa (con un intervallo fra +32% e +52%);</li><li><strong>mobile</strong>: da smartphone gli odds sono il 60,6% di quelli da desktop, circa il 40% in meno;</li><li><strong>brand</strong>: una sessione arrivata da una query col nome del brand ha odds 3,3 volte quelli di una sessione non brand.</li></ul>



<p class="wp-block-paragraph">Nessuno degli intervalli contiene l&#8217;1, il valore che significherebbe «nessun effetto».</p>



<div class="wp-block-group has-background" style="background-color:#f5f7f9;margin-top:2.5rem;margin-bottom:2.5rem;padding-top:1.5rem;padding-right:1.5rem;padding-bottom:1.5rem;padding-left:1.5rem"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p><strong>Attenzione: l&#8217;odds ratio non è un rapporto fra probabilità.</strong> «Odds 3,3 volte più alti» non vuol dire «3,3 volte più probabile». Le due cose quasi coincidono solo quando l&#8217;evento è raro, come le nostre conversioni al 5%. Con eventi frequenti si allontanano parecchio: passare da odds 1 a odds 3,3 significa passare dal 50% al 77% di probabilità, che non è certo il triplo. E soprattutto, <strong>lo stesso odds ratio produce salti diversi in punti percentuali</strong>, a seconda di dove ci troviamo sulla curva.</p>
</div></div>



<p class="wp-block-paragraph">Quest&#8217;ultimo punto merita un grafico. Calcoliamo le probabilità previste per quattro profili di sessione, con <code>type = "response"</code>, che restituisce probabilità invece di log-odds:</p>



<pre class="wp-block-code"><code>profili &lt;- data.frame(pagine = c(3, 3, 8, 8),
                      mobile = c(1, 0, 1, 0),
                      brand  = c(0, 1, 0, 1))
round(predict(modello, newdata = profili, type = "response"), 3)
#     1     2     3     4
# 0.021 0.106 0.109 0.401</code></pre>



<p class="wp-block-paragraph">Una sessione da smartphone, non brand, con 3 pagine viste converte col 2,1% di probabilità. Lo stesso numero di pagine da desktop e da query brand vale il 10,6%. Con 8 pagine, desktop e brand, si arriva al 40,1%.</p>



<p class="wp-block-paragraph">Verifichiamo il primo valore a mano, per vedere che non c&#8217;è magia. Il logit vale −4,376 + 0,347 × 3 − 0,501 × 1 + 1,197 × 0 = −3,834. La probabilità è 1 / (1 + e^3,834) = 1 / (1 + 46,2) = <strong>0,021</strong>.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.gironi.it/blog/wp-content/uploads/2026/10/regressione-logistica-profili.png" alt="Probabilità di conversione prevista dal modello in funzione delle pagine viste, per quattro tipi di sessione: query brand o non brand, desktop o mobile. Le curve hanno la stessa forma ma partono da livelli diversi, e più sono alte più si allontanano fra loro."/><figcaption class="wp-element-caption">Probabilità di conversione prevista dal modello in funzione delle pagine viste, per quattro tipi di sessione: query brand o non brand, desktop o mobile. Le curve hanno la stessa forma ma partono da livelli diversi, e più sono alte più si allontanano fra loro.</figcaption></figure>



<p class="wp-block-paragraph">Le quattro curve condividono lo stesso odds ratio per pagina, 1,415. Eppure <strong>in punti percentuali l&#8217;effetto di una pagina in più cambia moltissimo</strong>: per una sessione mobile non brand, passare da 2 a 3 pagine aggiunge 0,6 punti (dall&#8217;1,5% al 2,1%); per una sessione mobile da query brand, passare da 8 a 9 ne aggiunge 7,6 (dal 28,9% al 36,5%). È la curva a S al lavoro, ed è il motivo per cui nei report conviene riportare sia l&#8217;odds ratio sia qualche probabilità prevista per profili concreti.</p>



<h2 class="wp-block-heading" id="soglia">Dalle probabilità alle decisioni: dove mettere la soglia?</h2>



<p class="wp-block-paragraph">Spesso dal modello vogliamo una decisione: a quali sessioni mostrare un&#8217;offerta, quali utenti inserire in una campagna di remarketing. Per trasformare una probabilità in un sì o un no serve una <strong>soglia</strong>, e la scelta istintiva è 0,5: se la probabilità supera il 50%, prevediamo una conversione.</p>



<p class="wp-block-paragraph">Per giudicare il modello in modo onesto, però, non possiamo valutarlo sugli stessi dati con cui l&#8217;abbiamo stimato. Dividiamo le sessioni: stimiamo su 3.500 e misuriamo le previsioni sulle altre 1.500, che il modello non ha mai visto.</p>



<pre class="wp-block-code"><code>set.seed(11)
righe &lt;- sample(n, 3500)
addestramento &lt;- sessioni[righe, ]
test &lt;- sessioni[-righe, ]
modello_add &lt;- glm(converte ~ pagine + mobile + brand, data = addestramento, family = binomial)
p_test &lt;- predict(modello_add, newdata = test, type = "response")

table(previsto = p_test &gt; 0.5, reale = test$converte)
#         reale
# previsto    0    1
#    FALSE 1410   89
#    TRUE     1    0
mean((p_test &gt; 0.5) == test$converte)
# [1] 0.94</code></pre>



<p class="wp-block-paragraph">Accuratezza del 94%: sembra un ottimo risultato. Ma guardiamo la tabella: delle 89 sessioni che hanno convertito davvero, il modello non ne ha individuata <strong>nessuna</strong>. Ha semplicemente risposto «no» quasi sempre. E con un tasso di conversione del 5,9%, chi risponde sempre «no» senza nessun modello ottiene un&#8217;accuratezza del 94,1%, meglio di noi.</p>



<p class="wp-block-paragraph"><strong>Con eventi rari, l&#8217;accuratezza è una metrica che inganna.</strong> Il modello non è inutile: è la soglia a essere sbagliata. Nei nostri dati quasi nessuna sessione supera il 50% di probabilità, quindi una soglia a 0,5 equivale a non segnalare mai niente. Abbassiamola a 0,1:</p>



<pre class="wp-block-code"><code>table(previsto = p_test &gt; 0.1, reale = test$converte)
#         reale
# previsto    0    1
#    FALSE 1292   62
#    TRUE   119   27</code></pre>



<p class="wp-block-paragraph">Ora il modello segnala 146 sessioni e ne prende 27 che convertono davvero: il 30% delle conversioni (la <em>sensibilità</em>, o <em>recall</em>). Fra le sessioni segnalate, il 18,5% converte (la <em>precisione</em>), più del triplo del 5,9% di partenza. L&#8217;accuratezza scende all&#8217;88%, ma il modello è diventato utile.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.gironi.it/blog/wp-content/uploads/2026/10/regressione-logistica-soglia.png" alt="Probabilità di conversione previste dal modello per le 1.500 sessioni di test, separate fra quelle che non hanno convertito (sopra) e quelle che hanno convertito (sotto). Quasi tutto sta sotto il 30%: la soglia a 0,5 non intercetta nessuna conversione, quella a 0,1 ne prende 27 al prezzo di 119 falsi allarmi."/><figcaption class="wp-element-caption">Probabilità di conversione previste dal modello per le 1.500 sessioni di test, separate fra quelle che non hanno convertito (sopra) e quelle che hanno convertito (sotto). Quasi tutto sta sotto il 30%: la soglia a 0,5 non intercetta nessuna conversione, quella a 0,1 ne prende 27 al prezzo di 119 falsi allarmi.</figcaption></figure>



<p class="wp-block-paragraph">Il grafico mostra il compromesso. Le sessioni che convertono stanno in media più a destra, ma le due distribuzioni si sovrappongono molto: ogni soglia è uno scambio fra conversioni prese e falsi allarmi. La soglia giusta non la decide la statistica, la decide il costo degli errori: se mostrare un&#8217;offerta a chi non comprerà costa poco, conviene una soglia bassa.</p>



<p class="wp-block-paragraph">Per giudicare il modello indipendentemente dalla soglia si usa spesso l&#8217;<strong>AUC</strong>, l&#8217;area sotto la curva ROC: è la probabilità che, presa a caso una sessione che converte e una che non converte, il modello assegni alla prima una probabilità più alta. Vale 0,5 per un modello che tira a indovinare e 1 per uno perfetto. Calcoliamola con i ranghi, la stessa idea del <a href="https://www.gironi.it/blog/il-test-di-wilcoxon/">test di Wilcoxon</a>:</p>



<pre class="wp-block-code"><code>r &lt;- rank(p_test)
n1 &lt;- sum(test$converte); n0 &lt;- sum(1 - test$converte)
round((sum(r[test$converte == 1]) - n1 * (n1 + 1) / 2) / (n1 * n0), 3)
# [1] 0.749</code></pre>



<p class="wp-block-paragraph">Un&#8217;AUC di 0,75 è un risultato discreto: con solo tre variabili, il modello ordina correttamente tre coppie su quattro.</p>



<h2 class="wp-block-heading" id="assunzioni">Le condizioni per usarla</h2>



<p class="wp-block-paragraph">La regressione logistica chiede meno della regressione lineare (niente normalità dei residui, niente varianza costante), ma qualche condizione resta:</p>



<ul class="wp-block-list"><li><strong>l&#8217;esito è binario</strong>: due sole categorie (per tre o più ne parliamo nelle domande frequenti);</li><li><strong>le osservazioni sono indipendenti</strong>: dieci sessioni dello stesso utente non sono dieci informazioni indipendenti;</li><li><strong>la relazione è lineare sulla scala del logit</strong>: se l&#8217;effetto delle pagine cresce fino a un certo punto e poi si appiattisce, va modellato (per esempio con classi di pagine viste);</li><li><strong>i predittori non sono troppo correlati fra loro</strong>, il problema della multicollinearità di cui parleremo nel prossimo articolo;</li><li><strong>ci sono abbastanza eventi</strong>: una regola pratica diffusa chiede almeno una decina di eventi (nel nostro caso, conversioni) per ogni predittore. Noi ne abbiamo 271 per 3 variabili, ampiamente sopra.</li></ul>



<p class="wp-block-paragraph">C&#8217;è infine una condizione meno nota, e capita di leggere l&#8217;esatto contrario: che la regressione logistica si usi «quando i dati sono linearmente separabili». <strong>È vero l&#8217;opposto: se una variabile separa perfettamente i sì dai no, la logistica va in crisi.</strong> La massima verosimiglianza spinge il coefficiente verso l&#8217;infinito per rendere la curva un gradino perfetto, e l&#8217;errore standard esplode. Succede più spesso di quanto si pensi, anche con dataset famosi.</p>



<div class="wp-block-group has-background" style="background-color:#f5f7f9;margin-top:2.5rem;margin-bottom:2.5rem;padding-top:1.5rem;padding-right:1.5rem;padding-bottom:1.5rem;padding-left:1.5rem"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p><strong>Il caso del Titanic: quando un coefficiente esplode.</strong> Il dataset dei passeggeri del Titanic è l&#8217;esempio di regressione logistica più usato al mondo. Stimiamo la sopravvivenza in funzione di classe, sesso, età, familiari a bordo, tariffa e porto d&#8217;imbarco, e nel <code>summary()</code> compare una riga strana: l&#8217;intercetta vale 17,9 con un errore standard di 607, e i tre porti hanno coefficienti attorno a −12, anche loro con errori enormi.<br><br>Il motivo sono due passeggere, Amelie Icard e Martha Stone, che nel file hanno il porto d&#8217;imbarco vuoto. R tratta il vuoto come una quarta categoria, e la usa come riferimento. Tutte e due sono sopravvissute: per quella «categoria» il tasso di sopravvivenza è del 100%, una separazione perfetta. Dalle fonti storiche risulta che entrambe si imbarcarono a Southampton: assegnando loro la «S», l&#8217;intercetta torna a 5,64 con errore standard 0,64, e i porti diventano leggibili.<br><br>Due lezioni. La prima: un errore standard di centinaia di unità è quasi sempre un segnale di separazione, non un risultato. La seconda: lo stesso <code>glm()</code> ha scartato in silenzio 177 passeggeri su 891, quelli senza età. Prima di guardare i coefficienti conviene sempre controllare con <code>nobs(modello)</code> su quante righe ha lavorato davvero.</p>
</div></div>



<h2 class="wp-block-heading" id="domande-frequenti">Domande frequenti</h2>



<h3 class="wp-block-heading">Che differenza c&#8217;è fra regressione lineare e regressione logistica?</h3>



<p class="wp-block-paragraph">La regressione lineare prevede una variabile numerica continua, come il traffico o il fatturato. La regressione logistica prevede la probabilità di un esito binario, come converte o non converte. Per farlo modella in modo lineare il logaritmo degli odds e restituisce probabilità sempre comprese fra 0 e 1.</p>



<h3 class="wp-block-heading">Cos&#8217;è l&#8217;odds ratio nella regressione logistica?</h3>



<p class="wp-block-paragraph">È l&#8217;esponenziale di un coefficiente: indica per quanto si moltiplicano gli odds dell&#8217;evento quando la variabile aumenta di un&#8217;unità, a parità delle altre. Un odds ratio di 1,4 significa odds più alti del 40%, uno di 0,6 odds più bassi del 40%, uno pari a 1 nessun effetto.</p>



<h3 class="wp-block-heading">Regressione logistica e regressione logaritmica sono la stessa cosa?</h3>



<p class="wp-block-paragraph">No. Nella regressione logaritmica la variabile da prevedere resta numerica e continua, e la relazione con il predittore passa per un logaritmo (per esempio y = a + b·ln x). Nella regressione logistica la variabile da prevedere è binaria, e il logaritmo riguarda gli odds dell&#8217;evento.</p>



<h3 class="wp-block-heading">Cosa si usa se le categorie sono più di due?</h3>



<p class="wp-block-paragraph">Se le categorie non hanno un ordine (per esempio desktop, mobile e tablet) si usa la regressione logistica multinomiale, in R con <code>multinom()</code> del pacchetto nnet. Se hanno un ordine naturale (basso, medio, alto) si usa la regressione logistica ordinale, in R con <code>polr()</code> del pacchetto MASS.</p>



<h3 class="wp-block-heading">Qual è la soglia giusta per classificare?</h3>



<p class="wp-block-paragraph">Dipende dal costo dei due tipi di errore e da quanto è frequente l&#8217;evento. Con eventi rari, come le conversioni, la soglia di 0,5 porta spesso a non segnalare mai niente. Conviene guardare la tabella delle previsioni per più soglie, oppure l&#8217;AUC per valutare il modello indipendentemente dalla soglia.</p>



<h3 class="wp-block-heading">Quanti dati servono per una regressione logistica?</h3>



<p class="wp-block-paragraph">Conta soprattutto il numero di eventi, cioè dei casi nella categoria meno frequente. Una regola pratica diffusa ne chiede almeno una decina per ogni predittore: con 50 conversioni, meglio non andare oltre quattro o cinque variabili.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Che differenza c'è fra regressione lineare e regressione logistica?", "acceptedAnswer": {"@type": "Answer", "text": "La regressione lineare prevede una variabile numerica continua, come il traffico o il fatturato. La regressione logistica prevede la probabilità di un esito binario, come converte o non converte. Per farlo modella in modo lineare il logaritmo degli odds e restituisce probabilità sempre comprese fra 0 e 1."}}, {"@type": "Question", "name": "Cos'è l'odds ratio nella regressione logistica?", "acceptedAnswer": {"@type": "Answer", "text": "È l'esponenziale di un coefficiente: indica per quanto si moltiplicano gli odds dell'evento quando la variabile aumenta di un'unità, a parità delle altre. Un odds ratio di 1,4 significa odds più alti del 40%, uno di 0,6 odds più bassi del 40%, uno pari a 1 nessun effetto."}}, {"@type": "Question", "name": "Regressione logistica e regressione logaritmica sono la stessa cosa?", "acceptedAnswer": {"@type": "Answer", "text": "No. Nella regressione logaritmica la variabile da prevedere resta numerica e continua, e la relazione con il predittore passa per un logaritmo (per esempio y = a + b·ln x). Nella regressione logistica la variabile da prevedere è binaria, e il logaritmo riguarda gli odds dell'evento."}}, {"@type": "Question", "name": "Cosa si usa se le categorie sono più di due?", "acceptedAnswer": {"@type": "Answer", "text": "Se le categorie non hanno un ordine (per esempio desktop, mobile e tablet) si usa la regressione logistica multinomiale, in R con multinom() del pacchetto nnet. Se hanno un ordine naturale (basso, medio, alto) si usa la regressione logistica ordinale, in R con polr() del pacchetto MASS."}}, {"@type": "Question", "name": "Qual è la soglia giusta per classificare?", "acceptedAnswer": {"@type": "Answer", "text": "Dipende dal costo dei due tipi di errore e da quanto è frequente l'evento. Con eventi rari, come le conversioni, la soglia di 0,5 porta spesso a non segnalare mai niente. Conviene guardare la tabella delle previsioni per più soglie, oppure l'AUC per valutare il modello indipendentemente dalla soglia."}}, {"@type": "Question", "name": "Quanti dati servono per una regressione logistica?", "acceptedAnswer": {"@type": "Answer", "text": "Conta soprattutto il numero di eventi, cioè dei casi nella categoria meno frequente. Una regola pratica diffusa ne chiede almeno una decina per ogni predittore: con 50 conversioni, meglio non andare oltre quattro o cinque variabili."}}]}</script>



<h2 class="wp-block-heading" id="prova-tu">Prova tu</h2>



<p class="wp-block-paragraph">Il codice dell&#8217;articolo si presta a qualche esperimento.</p>



<ul class="wp-block-list"><li>Si prova la soglia 0,2 al posto di 0,1: quante conversioni prende il modello, e con quanti falsi allarmi? Si confronta la precisione con quella a 0,1.</li><li>Si toglie il brand dal modello (<code>converte ~ pagine + mobile</code>) e si guarda l&#8217;AUC sul test: quanto vale, da sola, l&#8217;informazione sulla query di partenza?</li><li>Si porta il coefficiente vero delle pagine da 0,35 a 0,7 nella simulazione: come cambia la forma della curva, e cosa succede alla soglia di 0,5?</li></ul>



<p class="wp-block-paragraph">L&#8217;ultimo esercizio mostra bene il legame fra la forza dei predittori e la difficoltà della classificazione: un modello con effetti forti spinge le probabilità verso i bordi, e lì una soglia vale l&#8217;altra.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Nel nostro esempio le tre variabili sono indipendenti per costruzione: le pagine viste non dipendono dal dispositivo, il brand non dipende dalle pagine. Nella realtà non è quasi mai così. Chi arriva da una ricerca col nome del brand tende anche a sfogliare più pagine, e quando i predittori si sovrappongono i coefficienti diventano instabili e difficili da separare. È la <em>multicollinearità</em>, e insieme ad altri due nomi che spaventano più di quanto meritino, l&#8217;<a href="https://www.gironi.it/blog/multicollinearita-eteroschedasticita-autocorrelazione/">eteroschedasticità e l&#8217;autocorrelazione</a>, è la prossima tappa del nostro viaggio nella regressione.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="per-approfondire">Per approfondire</h3>



<p class="wp-block-paragraph">Per vedere la regressione logistica nel suo contesto più ampio consiglio <a href="https://www.amazon.it/dp/8891906190?tag=consulenzeinf-21&amp;ascsubtag=la-regressione-logistica" rel="nofollow sponsored noopener" target="_blank"><em>Introduzione all&#8217;econometria</em></a> di Stock e Watson: dedica un capitolo intero alla regressione con variabile dipendente binaria, parte proprio dal modello lineare di probabilità e dai suoi limiti, e mostra con esempi concreti perché logit e probit li superano.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/la-regressione-logistica/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Capire i concetti di base del Machine Learning: una guida per principianti</title>
		<link>https://www.gironi.it/blog/machine-learning-una-guida-per-i-principianti/</link>
					<comments>https://www.gironi.it/blog/machine-learning-una-guida-per-i-principianti/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Tue, 10 Jan 2023 14:34:20 +0000</pubDate>
				<category><![CDATA[ai]]></category>
		<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=2594</guid>

					<description><![CDATA[Introduzione Il Machine Learning sta cambiando il modo in cui vediamo il mondo intorno a noi.Dalla previsione del tempo alla diagnosi medica, dalla raccomandazione di contenuti su una piattaforma di streaming all&#8217;identificazione di frodi finanziarie, il Machine Learning è sempre più presente nella nostra vita quotidiana. Ma cos&#8217;è esattamente e come funziona? In questo post &#8230; <a href="https://www.gironi.it/blog/machine-learning-una-guida-per-i-principianti/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Capire i concetti di base del Machine Learning: una guida per principianti"</span></a>]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Introduzione</h2>



<p class="wp-block-paragraph">Il Machine Learning sta cambiando il modo in cui vediamo il mondo intorno a noi.<br>Dalla previsione del tempo alla diagnosi medica, dalla raccomandazione di contenuti su una piattaforma di streaming all&#8217;identificazione di frodi finanziarie, il Machine Learning è sempre più presente nella nostra vita quotidiana.</p>



<p class="wp-block-paragraph">Ma cos&#8217;è esattamente e come funziona? In questo post ti <strong>guiderò attraverso i concetti fondamentali del Machine Learning e ti mostrerò come può essere utilizzato per risolvere problemi reali</strong>. Ti mostrerò anche come iniziare ad apprendere il Machine Learning, quali sono le risorse disponibili e come utilizzare questa tecnologia per migliorare la tua vita e il tuo lavoro.</p>



<span id="more-2594"></span>



<p class="has-light-gray-background-color has-background wp-block-paragraph"><strong><em>Caveat</em></strong>: Questo articolo è una semplice introduzione a un argomento vastissimo. E&#8217; stato scritto per chi vuole comprendere i concetti di base del Machine Learning, senza necessità di conoscenze tecniche o matematiche avanzate. Al termine del post fornirò una serie di risorse utili a chiunque volesse approfondire l&#8217;argomento e continuare un percorso straordinariamente affascinante…</p>


				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-aee46d0d      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							Di cosa parleremo						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#introduzione" class="uagb-toc-link__trigger">Introduzione</a><li class="uagb-toc__list"><a href="#cosè-il-machine-learning" class="uagb-toc-link__trigger">Cos&#039;è il Machine Learning</a><li class="uagb-toc__list"><a href="#tipi-di-machine-learning-machine-learning-supervisionato-e-non-supervisionato" class="uagb-toc-link__trigger">Tipi di Machine Learning: Machine Learning supervisionato e non supervisionato</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#i-principali-algoritmi-di-machine-learning-supervisionato" class="uagb-toc-link__trigger">I principali algoritmi di Machine Learning supervisionato</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#i-principali-algoritmi-di-machine-learning-non-supervisionato" class="uagb-toc-link__trigger">I principali algoritmi di Machine Learning non supervisionato</a></li></ul></li><li class="uagb-toc__list"><a href="#le-fasi-principali-del-processo-di-utilizzo-del-machine-learning" class="uagb-toc-link__trigger">Le fasi principali del processo di utilizzo del Machine Learning</a><li class="uagb-toc__list"><a href="#come-iniziare-ad-apprendere-il-machine-learning-tutorial-e-risorse" class="uagb-toc-link__trigger">Come iniziare ad apprendere il Machine Learning: tutorial e risorse</a><li class="uagb-toc__list"><a href="#sperimentare-con-il-codice-jupyter-lab-e-google-colab" class="uagb-toc-link__trigger">Sperimentare con il codice: Jupyter Lab e Google Colab</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#per-approfondire" class="uagb-toc-link__trigger">Per approfondire</a></ul></ul></ol>					</div>
									</div>
				</div>
			


<h2 class="wp-block-heading">Cos&#8217;è il Machine Learning</h2>



<p class="wp-block-paragraph">Il Machine Learning, o apprendimento automatico, è una tecnologia che permette alle macchine di &#8220;imparare&#8221; dai dati e migliorare le proprie prestazioni senza essere esplicitamente programmate. In altre parole, il Machine Learning consente alle macchine di &#8220;imparare&#8221; dall&#8217;esperienza, proprio come fanno gli esseri umani.</p>



<pre class="wp-block-verse">Esistono due tipi principali di Machine Learning: il <strong>Machine Learning supervisionato</strong> e il <strong>Machine Learning non supervisionato</strong>.</pre>



<p class="wp-block-paragraph">Nel Machine Learning supervisionato, il modello è &#8220;allenato&#8221; su un insieme di dati che include esempi di input e output desiderati. Il modello utilizza quindi questi esempi per fare previsioni sui nuovi dati.<br>Nel Machine Learning non supervisionato, invece, il modello deve &#8220;scoprire&#8221; da solo le strutture e le relazioni all&#8217;interno dei dati senza essere guidato da esempi pre-definiti.</p>



<p class="wp-block-paragraph">Il Machine Learning è utilizzato in una vasta gamma di applicazioni, dalla previsione del tempo alla diagnosi medica, dalla raccomandazione di contenuti alla identificazione di frodi finanziarie. In generale, l&#8217;obiettivo del Machine Learning è quello di automatizzare decisioni e previsioni basate sui dati, migliorando l&#8217;efficienza e la precisione del processo.</p>



<h2 class="wp-block-heading">Tipi di Machine Learning: Machine Learning supervisionato e non supervisionato</h2>



<p class="wp-block-paragraph">Come abbiamo già visto, il Machine Learning può essere suddiviso in due categorie principali: il Machine Learning supervisionato e il Machine Learning non supervisionato.</p>



<p class="wp-block-paragraph">Il <strong>Machine Learning supervisionato è il tipo più comune di apprendimento automatico</strong> e si basa su un<strong> insieme di dati già etichettati</strong>. In altre parole, il modello di apprendimento automatico è &#8220;allenato&#8221; su un insieme di dati che include esempi di input e output desiderati. Il modello utilizza quindi questi esempi per imparare a fare inferenze su nuovi dati. Ad esempio, un classificatore di posta indesiderata potrebbe essere allenato su un insieme di e-mail etichettate come &#8220;<em>spam</em>&#8221; o &#8220;<em>non spam</em>&#8220;, e quindi utilizzato per classificare nuove e-mail in arrivo.</p>



<p class="wp-block-paragraph"><strong>Il Machine Learning non supervisionato</strong>, invece, <strong>si basa su un insieme di dati non etichettati</strong>. In altre parole, il modello di apprendimento automatico deve &#8220;imparare&#8221; da solo a scoprire strutture e relazioni all&#8217;interno dei dati. Un esempio tipico di questo tipo di apprendimento automatico è il clustering, in cui i dati vengono suddivisi in gruppi (<em>cluster</em>) in base alle loro somiglianze.</p>



<p class="has-light-gray-background-color has-background wp-block-paragraph">In generale possiamo dire che il Machine Learning supervisionato utilizza dati etichettati per fare predizioni/classificazioni mentre il Machine Learning non supervisionato utilizza dati non etichettati per fare scoperte o identificare relazioni all&#8217;interno dei dati.</p>



<h3 class="wp-block-heading">I principali algoritmi di Machine Learning supervisionato</h3>



<p class="wp-block-paragraph">I principali algoritmi di Machine Learning supervisionato sono:</p>



<ul class="elencospaziato wp-block-list">
<li><strong>Regressione lineare</strong>: utilizzata per <strong>previsioni quantitative</strong> su una variabile continua. Ad esempio, per previsioni del prezzo di un&#8217;abitazione in base alla sua metratura. <br><br>Ho scritto dei post specifici sull&#8217;argomento, che ritengo possano essere molto utili per una corretta comprensione:<br><strong><a href="https://www.gironi.it/blog/regressione-lineare-semplice/" data-type="post" data-id="1807" target="_blank" rel="noreferrer noopener">Correlazione e regressione lineare</a><br><a href="https://www.gironi.it/blog/lanalisi-di-regressione-multipla-spiegata-semplice/" data-type="post" data-id="2225" target="_blank" rel="noreferrer noopener">L&#8217;analisi di regressione multipla spiegata semplice</a></strong><br></li>



<li><strong>Regressione logistica</strong>: utilizzata per <strong>previsioni di variabili categoriche</strong>, ovvero quando l&#8217;output è una classe tra due o più possibili. Ad esempio, la previsione per un paziente: soffre di una determinata malattia o meno?<br></li>



<li><strong>Alberi di decisione</strong>: utilizzati per la classificazione e la regressione. Consistono in un grafico di decisione in cui ogni nodo rappresenta una decisione e ogni ramo rappresenta un esito.<br></li>



<li><strong>Random Forest</strong>: una variante degli alberi di decisione dove vengono utilizzati più alberi per fare la previsione e poi si utilizza la media delle previsioni degli alberi.<br></li>



<li><strong>Gradient Boosting</strong>: un algoritmo che utilizza una serie di alberi di decisione in successione per migliorare la previsione.<br></li>



<li><strong>Support Vector Machine (SVM)</strong>: utilizzato per la classificazione in cui i dati sono separabili linearmente.<br></li>



<li><strong>k-Nearest Neighbors (k-NN)</strong>: utilizzato per la classificazione basato sulla similarità dei dati rispetto ad un punto di riferimento.<br></li>



<li><strong>Naive Bayes</strong>: utilizzato per la classificazione basato su probabilità.</li>
</ul>



<h3 class="wp-block-heading">I principali algoritmi di Machine Learning non supervisionato</h3>



<ul class="elencospaziato wp-block-list">
<li><strong>Clustering</strong>: utilizzato per suddividere i dati in gruppi o cluster in base alle loro somiglianze. L&#8217;algoritmo più comune di clustering è l&#8217;algoritmo k-means.<br></li>



<li><strong>Analisi delle componenti principali (PCA)</strong>: utilizzato per ridurre la dimensionalità dei dati, ovvero per trasformare un insieme di variabili correlate in un insieme di variabili non correlate.<br></li>



<li><strong>Analisi della densità del dato (DBSCAN)</strong>: utilizzato per trovare i cluster in base alla densità dei dati.<br></li>



<li><strong>Analisi delle associazioni (Apriori, FP-Growth)</strong>: utilizzato per trovare regole di associazione tra le variabili.<br></li>



<li><strong>Algoritmi di rilevamento di anomalie (One-class SVM, Isolation Forest)</strong>: utilizzato per rilevare gli elementi che si discostano dalla norma<br></li>



<li><strong>Analisi della mappa auto-organizzativa (SOM)</strong>: utilizzato per visualizzare la struttura nascosta nei dati.<br></li>



<li><strong>Algoritmi di rilevamento di struttura (Spectral Clustering, Hierarchical Clustering)</strong>: utilizzato per trovare relazioni gerarchiche nei dati.</li>
</ul>



<p class="wp-block-paragraph">Questi sono alcuni dei principali algoritmi di Machine Learning non supervisionato, ma ce ne sono molti altri.<br>Come per il Machine Learning supervisionato, la scelta dell&#8217;algoritmo dipende dalle caratteristiche del problema specifico e dalle caratteristiche dei dati.</p>



<p class="has-dark-gray-color has-light-gray-background-color has-text-color has-background has-medium-font-size wp-block-paragraph"><strong>In pratica, scegliere il giusto algoritmo da applicare alla specifica soluzione è una decisione delicatissima che può segnare il successo o il completo fallimento di un&#8217;attività di analisi dati.</strong></p>



<h2 class="wp-block-heading">Le fasi principali del processo di utilizzo del Machine Learning</h2>



<ol class="wp-block-list">
<li><strong>Raccolta dei dati</strong>: La prima fase consiste nel raccogliere i dati necessari per il problema da risolvere. Questi dati devono essere puliti, formattati e preparati per l&#8217;elaborazione.</li>



<li><strong>Analisi dei dati</strong>: Una volta che i dati sono stati raccolti, è importante esplorarli per capire meglio il problema e identificare eventuali relazioni o caratteristiche interessanti.</li>



<li><strong>Scelta del modello</strong>: La fase successiva consiste nella scelta del modello di apprendimento automatico più appropriato per il problema da risolvere. Esistono molti algoritmi di Machine Learning disponibili, tra cui alberi di decisione, reti neurali e support vector machine (SVM).</li>



<li><strong>Addestramento del modello</strong>: Una volta selezionato il modello, questo deve essere &#8220;allenato&#8221; utilizzando i dati di addestramento. Questo processo permette al modello di &#8220;imparare&#8221; dai dati e di essere in grado di fare previsioni sui dati nuovi.</li>



<li><strong>Valutazione del modello</strong>: Una volta allenato, il modello deve essere valutato su un insieme di dati di prova per verificare la sua accuratezza.</li>



<li><strong>Deploy del modello</strong>: Se il modello ha mostrato buone prestazioni, può essere utilizzato per risolvere il problema in questione e portato in ambiente di produzione.</li>



<li><strong>Monitoraggio e manutenzione</strong>: il modello deve essere monitorato per garantire che continui a funzionare correttamente e eventualmente essere aggiornato o sostituito se le prestazioni diminuiscono.</li>
</ol>



<h2 class="wp-block-heading">Come iniziare ad apprendere il Machine Learning: tutorial e risorse</h2>



<p class="wp-block-paragraph">L&#8217;apprendimento automatico (Machine Learning) è un campo in rapida evoluzione e ci sono molte risorse disponibili per coloro che vogliono iniziare ad apprenderlo.<br>Un elenco risulta necessariamente incompleto e soggetto a &#8220;gusti&#8221; personali, tuttavia si può partire da:</p>



<p class="wp-block-paragraph"><strong>Tutorial:</strong> Ci sono numerosissimi tutorial disponibili online che coprono i concetti di base del Machine Learning.<br>Ad esempio, il sito di scienza dei dati di scikit-learn ha una sezione di tutorial che spiega come utilizzare la libreria per creare alcuni dei modelli più comuni.<br><a href="https://scikit-learn.org/stable/tutorial/index.html" target="_blank" rel="noreferrer noopener">https://scikit-learn.org/stable/tutorial/index.html</a></p>



<p class="wp-block-paragraph"><strong>Libri: </strong>Ci sono molti libri sull&#8217;argomento, ma alcuni dei classici del settore sono:<br>&#8220;<em>Introduction to Machine Learning</em>&#8221; di Alpaydin: <a href="https://www.amazon.it/dp/0262028182?tag=consulenzeinf-21&#038;ascsubtag=machine-learning-una-guida-per-i-principianti" target="_blank" rel="noreferrer noopener">https://www.amazon.it/dp/0262028182?tag=consulenzeinf-21&#038;ascsubtag=machine-learning-una-guida-per-i-principianti</a><br>&#8220;<em>Python Machine Learning</em>&#8221; di Raschka e Mirjalili: <a href="https://www.packtpub.com/data/python-machine-learning-third-edition" target="_blank" rel="noreferrer noopener">https://www.packtpub.com/data/python-machine-learning-third-edition</a></p>



<p class="wp-block-paragraph"><strong>Corsi online</strong>: Ci sono molti corsi online che coprono i concetti di base del Machine Learning, come quello eccellente di Andrew Ng su Coursera:<br><a href="https://www.coursera.org/learn/machine-learning" target="_blank" rel="noopener">https://www.coursera.org/learn/machine-learning</a><br>o il corso di Machine Learning di fast.ai:<br><a href="https://www.fast.ai/" target="_blank" rel="noreferrer noopener">https://www.fast.ai/</a></p>



<p class="wp-block-paragraph"><strong>Tool</strong>: Ci sono molti strumenti e librerie che possono essere utilizzati per esplorare i dati e costruire modelli. Alcuni dei più popolari includono:</p>



<p class="wp-block-paragraph"><strong>scikit-learn</strong>: una libreria di apprendimento automatico per Python<br><a href="https://scikit-learn.org/stable/" target="_blank" rel="noopener">https://scikit-learn.org/stable/</a><br><strong>TensorFlow</strong>: una libreria di apprendimento automatico sviluppata da Google<br><a href="https://www.tensorflow.org/" target="_blank" rel="noopener">https://www.tensorflow.org/</a><br><strong>Keras</strong>: un&#8217;interfaccia di alto livello per costruire reti neurali in TensorFlow<br><a href="https://keras.io/" target="_blank" rel="noopener">https://keras.io/</a><br><strong>PyTorch</strong>: una libreria di apprendimento automatico open-source sviluppata da Facebook<br><a href="https://pytorch.org/" target="_blank" rel="noreferrer noopener">https://pytorch.org/</a></p>



<p class="wp-block-paragraph">In generale, consiglio di iniziare con tutorial e corsi online per familiarizzare con i concetti di base e poi di continuare con l&#8217;esplorazione di libri e strumenti per sviluppare la comprensione e le abilità. <br>Per diventare un buon data scientist è importante anche lavorare su dati reali e non solo su tutorial o esercizi. Cercare progetti o competizioni di machine learning può aiutare ad acquisire esperienza concreta.</p>



<h2 class="wp-block-heading">Sperimentare con il codice: Jupyter Lab e Google Colab</h2>



<p class="wp-block-paragraph">Jupyter Lab e Google Colab sono entrambi<strong> strumenti gratuiti e potenti per l&#8217;esplorazione dei dati</strong>, l&#8217;apprendimento e il test di codice per il Machine Learning. </p>



<p class="wp-block-paragraph">Come utilizzare entrambi i tool per creare ambienti di sviluppo e condividere il proprio lavoro con altri?</p>



<p class="wp-block-paragraph"><strong>Jupyter Lab</strong> è la nuova interfaccia per <strong>Jupyter Notebook</strong> che fornisce un ambiente di sviluppo integrato per lavorare con i notebook. <strong>E&#8217; un ambiente di sviluppo interattivo che ti consente di scrivere, eseguire e documentare il codice Python e R all&#8217;interno di un browser web</strong>. <br>È particolarmente utile per l&#8217;analisi dei dati e per l&#8217;apprendimento del Machine Learning. </p>



<p class="wp-block-paragraph">Per iniziare, devi installare Jupyter Lab sul tuo computer. Può essere fatto facilmente utilizzando <strong>Anaconda</strong>, una distribuzione Python che include Jupyter Lab e molte altre librerie di scienze dei dati. Una volta installato, puoi avviare Jupyter Lab dalla riga di comando e aprire un nuovo notebook in cui scrivere e eseguire il tuo codice. Jupyter Lab si può usare al link: <a href="https://jupyter.org/" target="_blank" rel="noopener">https://jupyter.org/</a></p>



<p class="wp-block-paragraph">Esiste anche la possibilità di testare l&#8217;ambiente direttamente nel browser con JupiterLite:</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="459" src="https://www.gironi.it/blog/wp-content/uploads/2023/01/jubyterLite-1024x459.png" alt="jubyterLite" class="wp-image-2602" srcset="https://www.gironi.it/blog/wp-content/uploads/2023/01/jubyterLite-1024x459.png 1024w, https://www.gironi.it/blog/wp-content/uploads/2023/01/jubyterLite-300x135.png 300w, https://www.gironi.it/blog/wp-content/uploads/2023/01/jubyterLite-1536x689.png 1536w, https://www.gironi.it/blog/wp-content/uploads/2023/01/jubyterLite-1200x538.png 1200w, https://www.gironi.it/blog/wp-content/uploads/2023/01/jubyterLite.png 1855w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption class="wp-element-caption">JupyterLite : prova l&#8217;ambiente Jupyter nel browser</figcaption></figure>



<p class="wp-block-paragraph"><strong>Google Colab</strong>, invece, è un ambiente di sviluppo<strong> basato sul cloud</strong>, che consente di scrivere e eseguire il codice Python e R all&#8217;interno di un browser web <strong>senza alcuna installazione</strong>. È un&#8217;opzione molto comoda, perché puoi accedere a Colab da qualsiasi dispositivo con una connessione a Internet e puoi condividere il tuo lavoro con altri semplicemente fornendo un link. Inoltre ti permette di utilizzare una GPU o un TPU per rendere il tuo calcolo più potente. Google Colab si può usare al link: <a href="https://colab.research.google.com/" target="_blank" rel="noopener">https://colab.research.google.com/</a></p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="506" src="https://www.gironi.it/blog/wp-content/uploads/2023/01/google-colab-1024x506.png" alt="google colab" class="wp-image-2603" srcset="https://www.gironi.it/blog/wp-content/uploads/2023/01/google-colab-1024x506.png 1024w, https://www.gironi.it/blog/wp-content/uploads/2023/01/google-colab-300x148.png 300w, https://www.gironi.it/blog/wp-content/uploads/2023/01/google-colab-1536x759.png 1536w, https://www.gironi.it/blog/wp-content/uploads/2023/01/google-colab-1200x593.png 1200w, https://www.gironi.it/blog/wp-content/uploads/2023/01/google-colab.png 1546w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption class="wp-element-caption">Google Colab: testa e condividi il codice in cloud</figcaption></figure>



<p class="wp-block-paragraph">Entrambi gli strumenti ti consentono di creare una sequenza di celle che contengono codice e testo. <strong>Il codice può essere eseguito all&#8217;interno delle celle e i risultati visualizzati direttamente nel notebook</strong>. Ciò rende Jupyter Lab e Google Colab ideali per l&#8217;esplorazione dei dati, l&#8217;apprendimento del Machine Learning, la condivisione e la documentazione del proprio lavoro.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Per approfondire</h3>



<p class="wp-block-paragraph">Per proseguire il percorso nel Machine Learning consigliamo <a href="https://www.amazon.it/dp/0262028182?tag=consulenzeinf-21&#038;ascsubtag=machine-learning-una-guida-per-i-principianti" rel="nofollow sponsored noopener" target="_blank"><em>Introduction to Machine Learning</em></a> di Ethem Alpaydın, il testo citato in questo articolo, e <a href="https://www.amazon.it/dp/1461471370?tag=consulenzeinf-21&#038;ascsubtag=machine-learning-una-guida-per-i-principianti" rel="nofollow sponsored noopener" target="_blank"><em>An Introduction to Statistical Learning</em></a> di James, Witten, Hastie e Tibshirani, che unisce teoria e pratica con esempi in R.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/machine-learning-una-guida-per-i-principianti/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
