<?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>Intelligenza Artificiale &amp; Algoritmi | RENOR &amp; Partners S.r.l.</title>
	<atom:link href="https://renor.it/blog/intelligenza-artificiale-algoritmi/feed/" rel="self" type="application/rss+xml" />
	<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/</link>
	<description></description>
	<lastBuildDate>Mon, 09 Mar 2026 21:04:58 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>La mia intervista a Esperti del Settore: AI ed etica</title>
		<link>https://renor.it/blog/la-mia-intervista-a-esperti-del-settore-ai-ed-etica/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Mon, 09 Mar 2026 21:04:57 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[etica AI]]></category>
		<category><![CDATA[etica intelligenza artificiale]]></category>
		<category><![CDATA[innovazione]]></category>
		<category><![CDATA[intelligenza artificiale]]></category>
		<category><![CDATA[intervista]]></category>
		<category><![CDATA[renor]]></category>
		<category><![CDATA[renor & partners]]></category>
		<category><![CDATA[simone renzi]]></category>
		<guid isPermaLink="false">https://renor.it/?p=2909</guid>

					<description><![CDATA[<p>Sono stato recentemente invitato come ospite in &#8220;Esperti del settore&#8221;, un programma focalizzato su imprenditori e aziende che tratta tematiche di grande interesse. L&#8217;intervento principale nel mio contesto lavorativo ha riguardato l&#8217;Intelligenza Artificiale. Nel dibattito sull&#8217;IA, si tende ad attribuire una persona artificiale a quest&#8217;ultima, utilizzando pronomi come &#8216;Lei&#8217; o &#8216;Lui&#8217;. Anche io, a volte, [&#8230;]</p>
<p>L'articolo <a href="https://renor.it/blog/la-mia-intervista-a-esperti-del-settore-ai-ed-etica/">La mia intervista a Esperti del Settore: AI ed etica</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Sono stato recentemente invitato come ospite in &#8220;Esperti del settore&#8221;, un programma focalizzato su imprenditori e aziende che tratta tematiche di grande interesse. L&#8217;intervento principale nel mio contesto lavorativo ha riguardato l&#8217;Intelligenza Artificiale.</p>



<p>Nel dibattito sull&#8217;IA, si tende ad attribuire una persona artificiale a quest&#8217;ultima, utilizzando pronomi come &#8216;Lei&#8217; o &#8216;Lui&#8217;. Anche io, a volte, cappo in questo errore durante i discorsi. La motivazione di questo lapsus, a mio avviso, è legata soprattutto alla complessità del tema dell&#8217;Intelligenza, sebbene seguito dall&#8217;aggettivo &#8220;Artificiale&#8221;, questo lemma induce nell&#8217;immaginario del cervello umano un&#8217;associazione con la figura umana, perché l&#8217;intelligenza è stata tradizionalmente vista come caratteristica peculiare dell&#8217;essere umano.</p>



<p>Parlare dell&#8217;AI come se fosse umana presenta un problema sia a livello lessicale che cognitivo, poiché può portare a conseguenze dannose: far percepire al cervello il testo AI come parte integrante di un ragionamento cosciente. È fondamentale, quindi, prima di utilizzare queste tecnologie, specialmente per i più giovani, distinguere tra ciò che è prodotto da un algoritmo basato su una valutazione statistica su centinaia di miliardi di dati e ciò che invece è prodotto di esperienza umana, influenzata da intuito e coscienza.</p>



<h2 class="wp-block-heading" id="h-l-ai-nell-ambiente-lavorativo">L&#8217;AI nell&#8217;ambiente lavorativo</h2>



<p>L&#8217;algoritmo non può replicare la coscienza umana, poiché questa deriva da sentimenti e riflessioni generate dalle esperienze vissute.</p>



<p>Essere umani significa conoscere il dolore, che ci guida verso una maggiore empatia. Immaginiamo una persona appena licenziata pronta a raccontare la sua storia.</p>



<p>La risposta di un sistema di intelligenza artificiale sarebbe una cosa di questo genere: <br>&#8220;Mi dispiace che tu abbia perso il lavoro. È una situazione difficile. Potresti considerare di aggiornare il tuo curriculum, cercare nuove opportunità online e valutare corsi di formazioni per migliorare le tue competenze&#8221;. </p>



<p id="h-l-ai-nell-ambiente-lavorativo">La risposta è accurata e razionale, ma manca di empatia per la situazione umana.</p>



<p>Un essere umano empatico probabilmente avrebbe risposto: <br>&#8220;Accidenti&#8230; Mi dispiace davvero tanto. So quanto ci tenevi a quel lavoro. Devi attraversare un momento molto pesante da digerire. Se ne vuoi parlare sono qui. Adesso cerca di digerire la cosa e quando ti sentirai più lucido magari possiamo ragionare insieme su come muoverti per cercare un&#8217;altra occupazione. Se potrò ti darò una mano chiedendo a qualche persone che conosco se ha bisogno di una figura come la tua&#8221;. </p>



<p>In questo contesto si osservano azioni tipicamente umane: il riconoscimento dell&#8217;emozione come un&#8217;esperienza condivisa, la condivisione emotiva che induce l&#8217;ascoltatore ad entrare in sintonia con lo stato d&#8217;animo di chi ha subito il licenziamento. C&#8217;è una presenza relazionale che fornisce disponibilità: &#8220;possiamo ragionare insieme&#8221;, &#8220;Se potrò ti darà una mano&#8221;.Invece di un aiuto tecnico immediato, c&#8217;è uno scambio emotivo, una comprensione reciproca e una soluzione proposta dopo un periodo di riflessione.</p>



<p>L&#8217;empatia umana va oltre la semplice comprensione logica; include una componente di risonanza emotiva.</p>



<p>Un esempio ancora più forte può essere questo: <br>&#8220;Oggi ho venduto il violino di mio padre&#8221;.</p>



<p>Una possibile risposta dell&#8217;AI potrebbe essere: &#8220;Se mi dici modello e marca del violino e prezzo di vendita posso dirti se hai fatto un buon affare&#8221;. </p>



<p>Una possibile risposta di un umano: &#8220;Ma il violino che suonava sempre tuo padre che custodivi gelosamente in quella teca? Deve essere stato molto pesante per te disfartene, quel violino portava sicuramente tanti ricordi!&#8221;. </p>



<p>Qui è ancora più evidente che l&#8217;attenzione dell&#8217;interlocutore non si focalizza sull&#8217;oggetto ma su ciò che c&#8217;è dietro l&#8217;oggetto. Ricordi, emozioni, vita vissuta.</p>



<p>Ma attenzione, anche l&#8217;AI, a seconda del modello potrebbe dare una risposta simile&#8230; Cosa significa? È fondamentale ricordare che i modelli di IA si basano su informazioni fornite dagli esseri umani. In questa situazione potrebbe emulare un comportamento umano, ma è importante precisare che non lo è effettivamente. Fornirebbe semplicemente la risposta più statisticamente probabile che un essere umano darebbe a una simile affermazione, però ancora una volta priva di qualsiasi emozione.</p>



<h2 class="wp-block-heading" id="h-perche-molte-persone-si-aprono-con-un-modello-ai">Perché molte persone si &#8220;aprono&#8221; con un modello AI?</h2>



<p>Sono numerose le testimonianze di individui che rivelano di condividere pensieri e sentimenti con modelli AI più spesso rispetto alle persone reali. Questa situazione è preoccupante, ma ha una spiegazione plausibile.</p>



<p>Per effettuare comparazioni valide, l&#8217;AI non va confrontata con elementi negativi estremi, ma con modelli umani di riferimento razionali. In caso di necessità, affidarsi ad un&#8217;intelligenza artificiale potrebbe essere più sicuro rispetto a doversi affidare ad un assassino (la fiera della banalità), ma fortunatamente gli assassini sono pochi e il mondo è ancora popolato da persone oneste.</p>



<p>Quando pensiamo ai ragazzi che subiscono bullismo scolastico, è naturale comprendere come possano sentirsi a proprio agio nell&#8217; aprirsi all&#8217;AI perché trovano un supporto che:</p>



<ul class="wp-block-list">
<li>Non li incolpa</li>



<li>Non li bullizza</li>



<li>Non li prende in giro</li>



<li>Gli da dei consigli apparentemente razionali</li>



<li>È raggiungibile istantaneamente 24/7</li>
</ul>



<p>Sebbene efficace nell&#8217;elaborazione del testo, il sistema non è in grado di comprendere ed integrare le emozioni, operando esclusivamente su dati testuali. Nell&#8217;interazione sociale, i gesti rivelano molto sulle emozioni degli individui. L&#8217;AI, a causa della limitata comprensione del linguaggio non verbale, fatica a costruire relazioni reali. Anche il tono utilizzato svolge un ruolo fondamentale.</p>



<h2 class="wp-block-heading" id="h-il-lato-oscuro-delle-persone">Il lato oscuro delle persone</h2>



<p>Con grande frequenza, quando vengo contattato da aziende, il luogo comune è questo: &#8220;Ingegnere, dove posso integrare l&#8217;Intelligenza Artificiale per risparmiare sul costo del personale?&#8221;&#8230; Tradotto&#8230; Dove posso mettere AI per licenziare un po&#8217; di gente e mettermi più soldi nelle tasche?</p>



<p>Non posso esimermi dal definire questa visione imprenditoriale <strong>decisamente miope!</strong></p>



<p>L&#8217;integrazione dell&#8217;AI mira alla produttività e alla velocità, non al licenziamento dei propri dipendenti. Con una solida situazione economica e liquidità a disposizione, quale beneficio deriva dall&#8217;utilizzo dell&#8217;AI per la riduzione della forza lavoro?</p>



<p>Sarebbe come dire che ho una macchina, metto un motore più potente ma tolgo i freni perché il mio scopo è solo quello di accelerare più velocemente. Ok, ma quando poi davanti ti trovi un muro cosa fai? Gli chiedi di spostarsi?</p>



<p>L&#8217;integrazione di AI per ridurre il personale è sensata solo in un caso specifico: l&#8217;azienda sta attraversando un periodo critico con calo del lavoro, debiti crescenti e impossibilità di far fronte ai pagamenti. Per evitare la chiusura, si procede con riduzioni del personale in un tentativo di contenere i costi e preservare alcune posizioni lavorative cercando di rimpiazzare quella forza lavoro con l&#8217;AI. </p>



<p>Questa però è un&#8217;eccezione, uno stato di emergenza, non una norma! È come dire: &#8220;Salviamo ciò che possiamo licenziando 10 persone prima che sia troppo tardi e perdano il lavoro 100 persone&#8221;.</p>



<p>Il problema è che le aziende che mi pongono domande del genere spesso non hanno carenze di liquidità, e non sperimentano alcuna fatica nel mantenere il loro attuale livello occupazionale.</p>



<p>Sorge dunque una complessa questione etica per l&#8217;imprenditore e l&#8217;azienda chiamata a sviluppare questi strumenti.</p>



<p>Un regolamento giuridico in materia sarebbe fondamentale per garantire ai dipendenti una maggiore serenità nell&#8217;affrontare l&#8217;introduzione dell&#8217;intelligenza artificiale come alleato nel contesto lavorativo, e garantirebbe la continuità del livello occupazionale evitando i classici scontri etici che si hanno tra imprese clienti e software house. Perché cari lettori&#8230; Einstein diceva che &#8220;è più facile spezzare un atomo che un pregiudizio&#8221;. Personalmente ogni volta che mi trovo dinnanzi a proposte del genere provo con tutto me stesso a convincere chi sta davanti a me della sua visione miope: &#8220;utilizza questo personale in comparti più strategici, magari nel marketing per aumentare la domanda&#8221;, ma diciamoci la verità, molti imprenditori si concentrano unicamente sul guadagno a breve termine, ignorando le implicazioni etiche di eventuali decisioni e trascurando </p>



<p>D&#8217;altra parte è però richiesto anche uno sforzo da parte del dipendente. Diamo come si suol dire un calcio al cerchio e uno alla botte&#8230; Il contratto a tempo indeterminato non deve essere visto come un certificato di Laurea; ok ora mi sono laureato e sto a posto così, questo pezzo di carta non me lo toglie più nessuno. Molti dipendenti si &#8220;rilassano&#8221; per usare un eufemismo, quando vengono convertiti a tempo indeterminato. C&#8217;è chi accumula malattie su malattie anche se in perfetto stato di salute. C&#8217;è chi arriva in ufficio e scalda solo la sedia facendo il minimo indispensabile. <br>Naturalmente quando io parlo di mantenimento di livello occupazionale con gli imprenditori mi batto per i lavoratori virtuosi, non per gli scalda poltrona!</p>



<p>In questa intervista tocchiamo alcuni di questi punti. Buona visione. </p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Intelligenza artificiale nelle aziende" width="500" height="375" src="https://www.youtube.com/embed/g3kUBG8UGpY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p></p>
<p>L'articolo <a href="https://renor.it/blog/la-mia-intervista-a-esperti-del-settore-ai-ed-etica/">La mia intervista a Esperti del Settore: AI ed etica</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Intelligenza artificiale e lavoro: perché non stiamo assistendo alla fine delle professioni</title>
		<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/lai-fara-perdere-posti-di-lavoro/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Tue, 17 Jun 2025 21:52:02 +0000</pubDate>
				<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[adattamento]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI sul posto di lavoro]]></category>
		<category><![CDATA[automazione]]></category>
		<category><![CDATA[cambiamento professionale]]></category>
		<category><![CDATA[competenze digitali]]></category>
		<category><![CDATA[creatività umana]]></category>
		<category><![CDATA[evoluzione del lavoro]]></category>
		<category><![CDATA[futuro del lavoro]]></category>
		<category><![CDATA[innovazione]]></category>
		<category><![CDATA[intelligenza artificiale]]></category>
		<category><![CDATA[lavoro e AI]]></category>
		<category><![CDATA[lavoro e tecnologia]]></category>
		<category><![CDATA[meritocrazia]]></category>
		<category><![CDATA[nuove professioni]]></category>
		<category><![CDATA[paura del cambiamento]]></category>
		<category><![CDATA[produttività]]></category>
		<category><![CDATA[reskilling]]></category>
		<category><![CDATA[rivoluzione tecnologica]]></category>
		<category><![CDATA[robot e lavoro]]></category>
		<category><![CDATA[transizione digitale]]></category>
		<category><![CDATA[trasformazione dei mestieri]]></category>
		<category><![CDATA[trasformazione digitale]]></category>
		<category><![CDATA[upskilling]]></category>
		<guid isPermaLink="false">https://renor.it/?p=879</guid>

					<description><![CDATA[<p>Ogni rivoluzione tecnologica ha cambiato le regole del gioco. Ma chi ha saputo adattarsi ha sempre trovato un nuovo ruolo da giocare. Oggi il dibattito su intelligenza artificiale e lavoro ripropone le stesse paure e le stesse incomprensioni che hanno accompagnato ogni grande trasformazione tecnologica del passato. Intelligenza artificiale e lavoro: l’ansia collettiva alimentata dai [&#8230;]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/lai-fara-perdere-posti-di-lavoro/">Intelligenza artificiale e lavoro: perché non stiamo assistendo alla fine delle professioni</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Ogni rivoluzione tecnologica ha cambiato le regole del gioco. Ma chi ha saputo adattarsi ha sempre trovato un nuovo ruolo da giocare. Oggi il dibattito su <strong>intelligenza artificiale e lavoro</strong> ripropone le stesse paure e le stesse incomprensioni che hanno accompagnato ogni grande trasformazione tecnologica del passato.</p>



<h2 class="wp-block-heading" id="h-intelligenza-artificiale-e-lavoro-l-ansia-collettiva-alimentata-dai-media">Intelligenza artificiale e lavoro: l’ansia collettiva alimentata dai media</h2>



<h3 class="wp-block-heading">Titoli catastrofisti e sensazionalismo: &#8220;l&#8217;AI ci sostituirà tutti&#8221;</h3>



<p>Nell&#8217;immaginario collettivo, l&#8217;Intelligenza Artificiale è spesso descritta come una forza oscura pronta a spazzare via milioni di posti di lavoro. Questa percezione è alimentata da titoli allarmistici che fanno leva sul panico e sull&#8217;incertezza più che sulla realtà dei dati. &#8220;L&#8217;AI sostituirà l&#8217;80% dei posti di lavoro&#8221;, &#8220;Addio impiegati: l&#8217;AI li renderà tutti inutili&#8221;, &#8220;Lavoreremo solo 3 giorni a settimana o saremo disoccupati a vita?&#8221;&#8230;</p>



<p>Questi sono alcuni dei titoli che popolano quotidiani, social e blog, generando un senso diffuso di angoscia sociale. </p>



<p>Il problema non è l&#8217;enfasi con cui vengono presentati, ma il totale e assoluto <strong>vuoto analitico</strong> che li accompagna. Questi articoli non distinguono mai settori, ruoli automatizzabili e non, attività che saranno assistite e quelle che effettivamente verranno eliminate. Il risultato di questa catastrofe mediatica è un messaggio di paura: o ti adegui o sparisci. In realtà, la verità è molto più sfumata e meno radicale. </p>



<p>Questo approccio propagandistico utilizzato solo per generare click mi fa venire in mente altri momenti storici in cui una nuova tecnologia veniva demonizzata per ignoranza o per difesa dello status quo. Lo si è visto con i computer, con internet, con i social, con l&#8217;automazione industriale. L&#8217;AI non fa eccezione: viene interpretata non come un potenziale strumento, ma come un agente ostile e autonomo che agisce per &#8220;rubare&#8221; qualcosa all&#8217;essere umano.</p>



<p>In un contesto di questo genere è fondamentale recuperare una visione lucida e informata, capace di distinguere tra ipotesi, paure e dati concreti. Solo con la conoscenza è possibile superare l&#8217;isteria collettiva e affrontare un imminente cambiamento con intelligenza strategica anziché con un panico irrazionale e immotivato. </p>



<h3 class="wp-block-heading">Confusione tra automazione e estinzione</h3>



<p>Una delle distorsioni più comuni nei vari dibattiti sull&#8217;Intelligenza Artificiale riguarda a mio avviso la confusione tra l&#8217;automazione di attività e l&#8217;estinzione di professioni. È un grossolano errore concettuale che amplifica paure infondate e paralizza il pensiero critico e strategico. </p>



<p>La realtà è molto più articolata: l&#8217;AI non sistituisce i mestieri, ma <strong>trasforma</strong> i compiti all&#8217;interno dei mestieri. Mi rendo conto che la frase può essere non chiara a tutti quindi facciamo un esempio. <br>Il lavoro del giornalista&#8230; L&#8217;AI può automatizzare la redazione di articoli standardizzati (come report sportivi o bollettini finanziari), ma non può e con buona probabilità, non potrà mai sostituire la sensibilità editoriale, l&#8217;indagine critica, la capacità di costruire un&#8217;inchiesta, fare domande pertinenti a un&#8217;intervista o interpretare un contesto culturale. </p>



<p>Tutto ciò vale non solo per l&#8217;editoria, ma per una moltitudine di altri settori. L&#8217;AI può <strong>assistere</strong>, <strong>ottimizzare</strong>, <strong>velocizzare</strong> molte delle fasi del lavoro, ma ciò non implica che l&#8217;intera professione venga annullata. Anzi, i dati mostrano che in molti casi, la presenza dell&#8217;AI <strong>crea nuove funzioni</strong>, nuove responsabilità e nuovi ruoli ibridi. </p>



<p>Confondere l&#8217;automazione con la cancellazione di una professione è come dire che l&#8217;invenzione della lavatrice abbia <strong>cancellato</strong> il mestiere di chi lavava i panni a mano. Oggi possiamo dire che non è così; ha liberato tempo e risorse, permettendo alle persone di dedicarsi ad altro: all&#8217;educazione, alla creatività, allo studio o ad attività a maggior valore aggiunto. <br>Il vero nodo quindi non è la perdita, ma la <strong>trasformazione</strong>: un processo che richiede adattamento, formazione continua, apertura mentale. L&#8217;AI toglierà senso solo a quei ruoli che <strong>si rifiutano di evolvere</strong>, non a quelli che accettano la sfida del cambiamento utilizzando AI a proprio vantaggio. </p>



<h2 class="wp-block-heading">L&#8217;AI fa paura a chi non dovrebbe esserci: che sia  finalmente la fine dei ruoli immeritati?</h2>



<p>Un aspetto poco discusso nel dibattito pubblico è che l&#8217;AI fa davvero paura solo a due categorie di lavoratori: quelli troppo verticali, ma soprattutto <strong>quelli troppo deboli per merito</strong> e che sono protetti da dinamiche non trasparenti. Ovvero specialisti incapaci di aggiornarsi fuori dalla loro nicchia perché non hanno sviluppato una mente capace di destreggiarsi in contesti trasversali e soprattutto persone che occupano ruoli per cui non hanno reali competenze, ma che si sono trovati lì per raccomandazione o parentela. Sì, specialmente queste persone farebbero bene a iniziare a preoccuparsi!</p>



<p>In Italia, Paese ancora fortemente ancorato a logiche di titoli, anzianità e posizionamento, più che di valore reale, l&#8217;AI sta diventando uno specchio scomodo. Non perché umili l&#8217;uomo, ma perché smaschera l&#8217;inutilità funzionale di molti ruoli. Se bastano 30 secondi con ChatGPT per ottenere un documento che richiederebbe a certi uffici 3 giorni e 6 firme, la domanda è lecita: serviva davvero quella posizione?</p>



<p>In questa luce, il timore verso l&#8217;AI non è paura del cambiamento, ma paura della trasparenza. Per la prima volta, una tecnologia è in grado di misurare (molto spesso in tempo reale), il valore prodotto rispetto al tempo impiegato, alla ridondanza operativa e al contributo effettivo. </p>



<p>Forse, paradossalmente, l&#8217;avvento dell&#8217;intelligenza artificiale rappresenta l&#8217;occasione per avviare, anche indirettamente, un processo di <strong>meritocrazia naturale</strong>. Non quella imposta per decreto, ma quella che emerge quando il sistema smette di tollerare l&#8217;inutile perché esiste un&#8217;alternativa oggettivamente più efficiente. </p>



<p>La paura è quindi giustificata solo in un senso: <strong>se il tuo ruolo esiste solo perché non sei in grado di poter fare altro e non sei in grado di reinventarti, non generi un valore aggiunto e rappresenti oggettivamente un peso perché non ti dedichi al tuo lavoro con passione e dedizione ma solo per arrivare alla fine del mese e prendere il tuo stipendio.</strong></p>



<p>Chi è creativo non può aver paura di qualcosa che per definizione non è creativa. L&#8217;AI non ha intuizioni, si limita a svolgere compiti per come è stata addestrata a farli.</p>



<h2 class="wp-block-heading">Il paradosso della produttività: temiamo ciò che ci dovrebbe sollevare</h2>



<p>Una delle contraddizioni più evidenti nel dibattito sull&#8217;Intelligenza Artificiale è il fatto che molti lavoratori sembrano temere proprio ciò che, in teoria, dovrebbe alleggerirli. </p>



<p>Da sempre le innovazioni tecnologiche hanno come obiettivo quello di ottimizzare i tempi, ridurre gli errori, automatizzare i processi. Eppure, di fronte all&#8217;AI questa logica si rovescia. Se un tempo l&#8217;efficienza era desiderabile, ora diventa una minaccia. Ma perché?</p>



<p>Perché in molte organizzazioni sia pubbliche che private, la produttività reale non è mai stata una variabile dell&#8217;equazione. Si lavora o si finge di farlo per riempire orari, difendere ruoli, mantenere equilibrio tra competenze deboli e mansioni ripetitive. In questi contesti, l&#8217;arrivo di un sistema che può fare in 5 minuti ciò che un team impiega 3 giorni a consegnare non viene percepito come liberazione, ma come pericolo esistenziale.</p>



<p>Il vero problema, quindi, non è l&#8217;AI in sé; è che l&#8217;AI mette in discussione alcune attività il cui valore era già discutibile. L&#8217;automazione rende visibile l&#8217;assurdità di interi processi aziendali costruiti sulla lentezza, sull&#8217;intermediazione inutile, sulla ripetizione fine a sé stessa.</p>



<p>Ma c&#8217;è anche un altro aspetto ancora più profondo: la produttività crea spazio vuoto e il vuoto, culturalmente, fa paura. Chi lavora in aziende che non premiano l&#8217;iniziativa individuale, la creatività e il pensiero strategico si chiede: &#8220;Se l&#8217;AI mi libera 3 ore al giorno&#8230; Cosa farò di quel tempo? Sarò valutato per ciò che riesco a creare o per ciò che non ho più da fare?&#8221;. </p>



<p>In questa ambiguità si inserisce il vero paradosso: <strong>la tecnologica che potrebbe finalmente permettere agli umani di concentrarsi su ciò che conta, viene vissuta come un attentato alla sopravvivenza</strong>. Ma forse, il problema non è la tecnologia ma il modello culturale che ci ha abituati a lavorare per esistere, anziché per produrre valore.</p>



<h2 class="wp-block-heading">Casi storici analoghi</h2>



<h3 class="wp-block-heading">Quando arrivarono gli ecommerce si disse: &#8220;È la fine dei negozi&#8221;</h3>



<p>L&#8217;introduzione degli ecommerce generò, a suo tempo, un&#8217;ondata di panico molto simile a quella che oggi accompagna l&#8217;Intelligenza Artificiale. Si temeva che i negozi fisici avrebbero chiuso in massa, che lo shopping reale sarebbe diventato obsoleto e che interi settori, dalla vendita al dettaglio alla logistica, fino ad arrivare al mercato immobiliare degli affitti dei negozi, sarebbero collassati. </p>



<p>Eppure, col senno del poi, oggi sappiamo che non è andata così&#8230; Gli ecommerce non hanno distrutto il commercio tradizionale: <strong>lo hanno costretto ad evolversi</strong>. Molti piccoli negozi hanno iniziato a vendere online, i centri commerciali hanno integrato strategia omnicanale, i grandi brand hanno investito in piattaforme ibride. È nato il click&amp;collect, il live commerce, il drive-in digitale. L&#8217;esperienza d&#8217;acquisto non è morta, si è trasformata in esperienza phygital ovvero un&#8217;esperienza fisica e digitale assieme aprendo anche scenari che prima erano solamente locali ed oggi possono mostrarsi ad un pubblico internazionale.</p>



<p>In realtà quello che è successo è esattamente ciò che sta accadendo oggi con l&#8217;AI: chi ha resistito è rimasto indietro; chi ha adattato il proprio modello ha prosperato. Il negoziante che ha visto l&#8217;ecommerce come una minaccia ha chiuso. Quello che lo ha visto come un&#8217;opportunità, un&#8217;estensione del proprio servizio, ha guadagnato nuove fette di mercato, anche estero. Questa riprova ci insegna che ogni tecnologia non cancella l&#8217;esistente ma rimodula il contesto competitivo. Non è la tecnologia che uccide un&#8217;attività, ma l&#8217;incapacità di adattarsi al nuovo paradigma.</p>



<h3 class="wp-block-heading">L&#8217;industrializzazione e la fine degli artigiani?</h3>



<p>A fine Ottocento, quando le prima macchine a vapore e i telai meccanici cominciarono a sostituire il lavoro manuale degli artigiani, si gridò allo scandalo: &#8220;Questa è la morte della dignità del lavoro&#8221; dissero in molti. E non mancavano motivazioni concrete: chi aveva passato una vita a lavorare il legno, il ferro, il tessuto con sapienza e dedizione, vedeva improvvisamente il proprio mestiere ridotto a un processo ripetitivo, impersonale, automatizzato. </p>



<p>Ma anche in questo caso, la profezia apocalittica si rivelò inesatta. L&#8217;industrializzazione non uccise il lavoro umano, lo moltiplicò.<br>Nacquero nuove figure, nuove specializzazioni, nuove gerarchie professionali. Il lavoro artigianale non scomparve: cambiò ruolo, si ridusse in scala ma non perse valore. Anche oggi possiamo comprare una giacca di un famoso brand e pagarla 300 euro. Farsela fare da un artigiano su misura, scegliendone il tessuto, i bottoni, lo stile, la lavorazione può costare 3000 euro!<br>Esiste dunque ancora oggi un contesto in cui l&#8217;unicità e la qualità sono parametri molto più importanti della quantità.</p>



<h2 class="wp-block-heading" id="h-dalla-transizione-al-coraggio">Dalla transizione al coraggio</h2>



<p>Quella transizione industriale fu una delle più potenti leve di crescita economica e sociale della storia. Ha permesso la nascita delle classi operaie, l&#8217;urbanizzazione, i diritti sindacali, il concetto stesso di orario di lavoro regolamentato. Senza quel passaggio non ci sarebbero state le tutele moderne, l&#8217;accesso di massa al consumo, né la possibilità di lavorare fuori da un contesto agricolo o feudale. </p>



<p>Chi ebbe il coraggio di passare dalla paura all&#8217;organizzazione, dalla bottega alla fabbrica, non solo mantenne la propria dignità professionale, ma contribuì attivamente alla costruzione di un nuovo modello di civiltà. È proprio grazie all&#8217;industrializzazione e alla razionalizzazione della produzione che abbiamo potuto assistere a un&#8217;accelerazione senza precedenti delle scoperte scientifiche e tecnologiche, con un impatto diretto sul benessere collettivo: aspettativa di vita più lunga, maggiore disponibilità di beni, progressi nella medicina, nell&#8217;alimentazione e nei trasporti. </p>



<p><br>Non a caso, nei Paesi che non hanno conosciuto un processo industriale su larga scala, spesso per ragioni storiche, geopolitiche o strutturali, si riscontrano ancora oggi gravi problemi come la malnutrizione, la diffusione di malattie curabili e una più bassa aspettativa di vita. <br>Quando la crescita demografica non è accompagnata da un parallelo sviluppo nelle capacità di produrre beni e servizi, il sistema sociale entra in crisi. L&#8217;industrializzazione, con tutti i suoi limiti e contraddizioni, è stata uno degli strumenti più efficaci per superare questo squilibrio.</p>



<p>Oggi l&#8217;AI è vista con lo stesso sospetto: fredda, impersonale, disumanizzante; ma anche in questo caso, non è lo strumento in sé a determinare il cambiamento, bensì la capacità del sistema di assorbirlo, modularlo e incanalarlo verso nuovi significati sociali e professionali. </p>



<h3 class="wp-block-heading">L&#8217;informatizzazione e il lavoro d&#8217;ufficio</h3>



<p>Tra la fine degli anni &#8217;80 e l&#8217;inizio dei &#8217;90, l&#8217;introduzione massiva dei personal computer negli uffici fu vissuta, ancora una volta, come una minaccia. Si diceva che i computer avrebbero azzerato il bisogno di personale amministrativo, che i documenti cartacei sarebbero spariti e che l&#8217;essere umano sarebbe diventato un semplice accessorio del software.</p>



<p>Una parte di verità c&#8217;è&#8230; Molte funzioni ripetitive e manuali sono state sostituite da fogli di calcolo, database, sistemi di gestione documentale. Ma ciò che si è perso in attività meccaniche è stato compensato dalla nascita di nuove responsabilità cognitive e digitali. L&#8217;informatizzazione ha dato origine a figure professionali che prima non esistevano: data entry specialist, sistemisti, project manager, responsabili IT, analisti funzionali, sviluppatori, ingegneri del software, ecc. ecc.</p>



<p>Il segretario è diventato office manager, il contabile ha imparato a usare software di contabilità, l&#8217;archivista si è evoluto con archiviazione digitale&#8230; Il lavoro è rimasto ma ha cambiato pelle. </p>



<p>Questo dimostra che ogni volta che una tecnologia entra in un&#8217;azienda, non distrugge l&#8217;intero ecosistema, ma ricombina le attività esistenti efficientandole. Alcune si contraggono, altre si espandono, altre ancora nascono da zero.</p>



<p>Ancora una volta l&#8217;AI oggi si presenta con un impatto simile a quello dell&#8217;informatizzazione: potente, trasversale, poco visibile a occhio nudo ma capace di ridefinire profondamente processi. E come allora il risultato dipenderà da una sola cosa: la disponibilità di ciascun professionista ad aggiornarsi. </p>



<h2 class="wp-block-heading">Le previsioni sbagliate del passato recente</h2>



<p>Come abbiamo visto, la storia dell&#8217;innovazione è disseminata di previsioni disastrose che non si sono di fatto mai avverate, ma del resto tira molto di più un titolo catastrofista&#8230; Nei paragrafi precedenti, ci sono moltissime innovazioni tecnologiche che hanno portato la paura di un cambiamento, paura infondata dal momento che il cambiamento è stato sempre positivo. Una tecnologia nasce quando si sente l&#8217;esigenza di usarla&#8230; Inizio a pensare ad un martello solo quando ho l&#8217;esigenza di piantare un chiodo al muro, non prima.</p>



<p>Gli errori di previsione non nascono da incompetenza, ma da un errore metodologico ricorrente: si considera la tecnologia come agente attivo, e l&#8217;essere umano come passivo. In realtà se da un lato la tecnologia evolve, dall&#8217;altro l&#8217;uomo reagisce, si adatta, si reinventa; ed è proprio lì che le profezie catastrofiche vanno in frantumi.</p>



<h2 class="wp-block-heading">La trasformazione dei ruoli esistenti</h2>



<p>Una delle evidenze più importanti ma meno comprese è che la maggior parte dei cambiamenti portati dall&#8217;AI non comporta la scomparsa dei ruoli, bensì la loro trasformazione interna. I job title restano, le mansioni si riscrivono. Cambiano le priorità, le modalità operative, gli strumenti e le competenze richieste. </p>



<p>Un grafico pubblicitario oggi non può più limitarsi a impaginare elementi statici, deve conoscere prompt visuali per generare bozze con DALL-E o Midjourney, deve saper modificare testi in ottica SEO e in alcuni casi interagisce con tool AI che ottimizzano campagne. La parte strategica però (<strong>messaggio, posizionamento e tono di voce</strong>) resta totalmente in mano all&#8217;umano perché è lui che ha l&#8217;intuizione ed è qui che si genera valore. </p>



<p>Un architetto un tempo concentrato unicamente su software CAD e vincoli edilizi, oggi può utilizzare AI generativa per creare varianti progettuali, esplorare nuovi materiali, testare soluzioni in ambienti virtuali pertanto non è sostituito, <strong>è potenziato!</strong></p>



<h2 class="wp-block-heading" id="h-in-ambito-di-copywriting-e-supporto">In ambito di Copywriting e supporto</h2>



<p>Un copywriter non scrive più tutto da zero, <strong>orchestra il testo</strong>, combinando l&#8217;intuizione umana con lo sviluppo del testo con AI. Il suo ruolo si sposta dalla produzione alla cura e supervisione semantica; e nel frattempo nasce una nuova figura in questo contesto, quella del <strong>prompt writer</strong> ovvero colui che sa chiedere alle AI nel modo giusto per ottenere i risultati che si aspetta. </p>



<p>Anche nei settori apparentemente più esposti come il customer care o il supporto tecnico, l&#8217;AI gestisce i livelli base, ma l&#8217;umano si eleva ai livelli superiori dove è necessaria empatia, adattamento e negoziazione. I professionisti che un tempo si occupavano di ticket ripetitivi ora diventano formatori di chatbot, supervisori della qualità, designer delle esperienze di supporto e risolvono problemi di customer care dove l&#8217;AI non ha i toni e l&#8217;empatia per poterli risolvere. </p>



<figure class="wp-block-pullquote"><blockquote><p>L&#8217;AI non prende il tuo lavoro, prende la parte più ripetitiva del tuo lavoro e ti chiede di diventare qualcosa di più. </p></blockquote></figure>



<p>In questo scenario, chi si aggiorna, chi è disposto ad osservare l&#8217;AI come un solido alleato può salire di livello, non essere spinto fuori. L&#8217;unico rischio reale è restare identici a sé stessi mentre il mondo sta cambiando. </p>



<h2 class="wp-block-heading">Lavorare con l&#8217;AI, non contro: il professionista &#8220;aumentato&#8221;</h2>



<p>La reazione istintiva più diffusa verso l&#8217;AI è difensiva: &#8220;devo proteggermi&#8221;, &#8220;devo evitare che mi rubi il lavoro&#8221;. Ma questa è una mentalità statica, perdente. Il punto non è se l&#8217;AI ti sostituirà. Il punto è se tu saprai usarla a tuo vantaggio per diventare migliore. </p>



<p>Le AI generative, conversazionali, predittive, non sono entità nemiche, sono <strong>strumenti</strong>. Esattamente come lo sono stati l&#8217;elettricità, il computer, gli ecommerce, il motore a scoppio, il cloud. E come ogni strumento potente, <strong>il loro valore dipende da chi li maneggia.</strong></p>



<p>Oggi un avvocato che sa usare ChatGPT o Claude per redigere una prima bozza, estrarre riferimenti giurisprudenziali o simulare una linea argomentativa non è meno competente: è più veloce, più scalabile e più competitivo. </p>



<p>Un designer che sa usare DALL-E per generare una decina di proposte visive in 30 secondi non è meno creativo, è più libero di scegliere, iterare e osare. </p>



<p>Un recruiter che usa modelli AI per estrarre pattern ricorrenti nei curriculum e verificarli con il proprio occhio critico non è superato: <strong>è potenziato.</strong></p>



<p>L&#8217;AI non è una forza che ti spinge via. È una forza che ti affianca se glielo permetti e sei disposto a farla entrare nel tuo asset lavorativo. È proprio come accade in una squadra, l&#8217;intelligenza collettiva cresce se ognuno conosce il proprio valore. In questo caso l&#8217;umano resta insostituibile nei campi dove servono: intuito, empativa, visione strategica, responsabilità morale. Il futuro del lavoro non è umano o artificiale, è umano e artificiale insieme.</p>



<h2 class="wp-block-heading">La mentalità vincente: adattiva, non difensiva</h2>



<p>C&#8217;è un tratto comune che accomuna tutte le persone che hanno saputo attraversare indenni i grandi cambiamenti storici: <strong>una mentalità adattiva.</strong> Non necessariamente geniali, non sempre tecnicamente brillanti, ma capaci di leggere i segnali del cambiamento, accettarli e agire di conseguenza. Lottare contro qualcosa di inevitabile non è solo inutile è una perdita di tempo prezioso. Queste persone non hanno opposto resistenza: hanno studiato, osservato, sperimentato. Hanno compreso che il vero pericolo non è il cambiamento in sé, ma l&#8217;immobilismo. </p>



<p>Oggi più che mai questo principio torna centrale. In un mondo che evolve alla velocità della luce, il valore non è più nella posizione che occupi ma nella velocità con cui riesci a spostarti, a ricollocarti e a reinventarti. L&#8217;AI non premia chi ha una scrivania, ma chi ha visione e punisce, silenziosamente e inesorabilmente, chi si arrocca nella nostalgia di &#8220;come funzionavano le cose prima&#8221;. </p>



<h2 class="wp-block-heading" id="h-cambiamento-opzionabile-non-lo-credo">Cambiamento opzionabile? Non lo credo!</h2>



<p>Tante persone resteranno ferme perché si illudono che il cambiamento sia opzionale. Non lo è! Adattarsi è l&#8217;unica possibile via da percorrere. Resistere non è una strategia, è solo una lenta condanna. Eppure molti preferiscono negare, rifiutare, sminuire ciò che non conoscono nel perfetto stile italiano.</p>



<p>Serve oggi più che mai una postura mentale totalmente rinnovata. Non quella del &#8220;mi difendo&#8221; ma quella del &#8220;mi preparo&#8221;; non quella del &#8220;mi basta quello che so&#8221;, ma quella del &#8220;voglio capire come posso trasformarmi e cosa posso diventare in meglio.</p>



<p>Non serve essere ingegneri, serve essere curiosi, aperti e veloci nell&#8217;apprendere. Serve leggere, provare, farsi aiutare da un tool AI, domandarsi come potrebbe essere utile alla propria professione. Non tutto funziona, ma il solo fatto di provarci ti mette avanti rispetto a chi nemmeno si pone la domanda. </p>



<p>In fondo non è la tecnologia a decidere chi resta e chi va.<br>È la mentalità con cui la si affronta. <br>Chi ha mentalità adattiva, non solo sopravvive ma <strong>fiorisce!</strong></p>



<h2 class="wp-block-heading">Il lavoro non sta morendo, sta evolvendo e ci chiede di fare lo stesso</h2>



<p>Abbiamo visto come ogni rivoluzione abbia avuto il suo mostro da temere. Ogni volta si è temuto il peggio e ogni volta la realtà si è rivelata diversa: non meno lavoro, ma lavoro diverso. Non meno umanità, ma umanità distribuita, riscritta e talvolta costretta a uscire dalla zona di comfort. </p>



<p>L&#8217;AI non è diversa è solo più veloce, più profonda e più persuasiva, ma non è qui per distruggere il lavoro, è qui per dare una scossa a ciò che già non funzionava: ruoli deboli, ripetitività improduttiva, burocrazia inefficiente, protezioni immotivate. Fa paura perché <strong>mette a nudo l&#8217;inutilità</strong>, e perché <strong>rende evidente ciò che fino a ieri si poteva ancora fingere di non vedere.</strong></p>



<p>Ma per chi ha talento, per chi ha voglia di imparare, per chi è pronto al cambiamento <strong>l&#8217;AI non è una minaccia, è una leva.</strong> Un&#8217;opportunità per salire di livello e per liberarsi del superfluo, qualcosa per ricentrarsi su ciò che conta davvero: l&#8217;intuizione, la progettualità, la relazione, la visione. </p>



<p>Il lavoro non sta morendo, sta mutando forma. Sta chiedendo a ognuno di noi: &#8220;Cosa sei disposto a diventare?&#8221;. </p>



<p>Chi saprà rispondere con lucidità, coraggio e intelligenza adattiva, non solo non perderà il proprio posto, costruirà qualcosa di nuovo e superiore. </p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/lai-fara-perdere-posti-di-lavoro/">Intelligenza artificiale e lavoro: perché non stiamo assistendo alla fine delle professioni</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Valutazione del livello di Blur tramite Varianza Laplaciana</title>
		<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/valutazione-del-livello-di-blur-tramite-varianza-laplaciana/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Sun, 15 Jun 2025 11:49:09 +0000</pubDate>
				<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[algoritmo immagini web]]></category>
		<category><![CDATA[analisi immagini in JavaScript]]></category>
		<category><![CDATA[analisi immagini in tempo reale]]></category>
		<category><![CDATA[app fotografia]]></category>
		<category><![CDATA[applicazioni per celiaci]]></category>
		<category><![CDATA[Canvas API]]></category>
		<category><![CDATA[controllo qualità foto]]></category>
		<category><![CDATA[elaborazione immagini su web]]></category>
		<category><![CDATA[filtro Laplaciano]]></category>
		<category><![CDATA[metrica di sfocatura]]></category>
		<category><![CDATA[misurazione nitidezza]]></category>
		<category><![CDATA[nitidezza immagine]]></category>
		<category><![CDATA[OCR client-side]]></category>
		<category><![CDATA[ottimizzazione OCR]]></category>
		<category><![CDATA[punteggio nitidezza]]></category>
		<category><![CDATA[qualità immagine]]></category>
		<category><![CDATA[rilevamento sfocatura]]></category>
		<category><![CDATA[validazione immagini lato frontend]]></category>
		<category><![CDATA[varianza del Laplaciano]]></category>
		<category><![CDATA[visione artificiale]]></category>
		<guid isPermaLink="false">https://renor.it/?p=854</guid>

					<description><![CDATA[<p>La nostra App per persone celiache e con intolleranze alimentari, CeliachIA, consente di verificare istantaneamente la presenza di glutine nei prodotti che non risultano già censiti a database. L’utente fotografa la lista ingredienti sull’etichetta e un modello di computer vision fine-tuned elabora l’immagine restituendo la risposta in pochi secondi. Oggi affronteremo la varianza laplaciana blur [&#8230;]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/valutazione-del-livello-di-blur-tramite-varianza-laplaciana/">Valutazione del livello di Blur tramite Varianza Laplaciana</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>La nostra App per persone celiache e con intolleranze alimentari, <strong>CeliachIA</strong>, consente di verificare istantaneamente la presenza di glutine nei prodotti che non risultano già censiti a database. L’utente fotografa la lista ingredienti sull’etichetta e un modello di <strong>computer vision fine-tuned</strong> elabora l’immagine restituendo la risposta in pochi secondi. Oggi affronteremo la varianza laplaciana blur immagine. Questo è un altro articolo dedicato all&#8217;analisi ed elaborazione delle immagini. Avevamo già trattato infatti in un <a href="https://renor.it/blog/sviluppo-software-programmazione/watermark-invisibile-in-jpeg-con-php-8/">altro articolo</a> l&#8217;uso di watermark invisibile su immagini jpeg. <br><br>La <strong>varianza laplaciana blur immagine</strong> è una tecnica semplice ed efficace per valutare in modo oggettivo la sfocatura di un’immagine.<br></p>



<p>Durante la fase di sviluppo ci siamo imbattuti in un ostacolo cruciale: garantire che la fotografia degli ingredienti fosse sufficientemente nitida da permettere un’accurata estrazione del testo (OCR) e, di conseguenza, un’analisi affidabile. </p>



<p>Sul backend, <strong>Google Cloud Vision</strong> fornisce già un indicatore di confidenza dell’OCR; applicando soglie opportune potremmo decidere se proseguire con l’analisi oppure respingere l’immagine per scarsa qualità. Tuttavia, delegare questo controllo al cloud comporta un costo inutile, paghiamo comunque l’invocazione di un servizio esterno anche quando la foto è palesemente inutilizzabile.</p>



<p>Per ridurre al minimo i costi era quindi indispensabile spostare il controllo qualità <strong>sul client</strong>. Abbiamo sviluppato una funzione JavaScript, basata sulla <strong>varianza del Laplaciano</strong>, che valuta in tempo reale la nitidezza dell’immagine: la libreria può essere eseguita direttamente durante l’anteprima della fotocamera, evitando di inviare al backend scatti fuori fuoco o mossi. </p>



<p>In questo modo otteniamo una doppia ottimizzazione: l’esperienza utente migliora (il feedback di “immagine sfocata” è immediato) e i costi di elaborazione cloud si riducono sensibilmente.</p>



<h2 class="wp-block-heading" id="h-misurare-la-nitidezza-di-un-immagine-con-la-varianza-del-laplaciano">Misurare la nitidezza di un&#8217;immagine con la varianza del Laplaciano</h2>



<p>La qualità percettiva di una fotografia dipende in larga misura dalla nitidezza: un&#8217;immagine fuori fuoco o affetta da motion blur appare poco gradevole e, in vari ambiti applicativi (visione artificiale, diagnostica, fotografia mobile), può compromettere l&#8217;intero processo di analisi automatica. </p>



<p>Esistono numerose tecniche per stimare quantitativamente il livello di sfocatura. In questo articolo presentiamo un approccio rapido, privo di dipendenze esterne e adatto al tempo reale, basato sulla <strong>varianza dell&#8217;operatore Laplaciano</strong>. Partiremo dai fondamenti teorici per poi giungere a un&#8217;implementazione completa in JavaScript, corredata da una piccola interfaccia Web per poter effettuare dei test.</p>



<p>L&#8217;obiettivo finale sarà quello di costruire un widget che assegni un punteggio da 1 a 10 alla nitidezza di qualsiasi immagine caricata dall&#8217;utente. </p>



<h2 class="wp-block-heading" id="h-la-nitidezza-come-problema-di-frequenze">La nitidezza come problema di frequenze</h2>



<p>Ogni immagine digitale può essere vista come la somma di componenti a diverse frequenze spaziali: </p>



<ul class="wp-block-list">
<li><strong>Basse frequenze</strong> hanno variazioni lente, aree uniformi e gradienti dolci</li>



<li><strong>Alte frequenze</strong> danno luogo a transizioni brusche, bordi, dettagli fini.</li>
</ul>



<p>Una sfuocatura agisce come <strong>filtro passa-basso</strong> ovvero attenua le alte frequenze. Quindi più un&#8217;immagine è sfuocata, meno energia residua avremo nello spettro ad alta frequenza. </p>



<p>Il progetto si occuperà quindi di tradurre questa osservazione in un singolo numero facile da interpretare. </p>



<h2 class="wp-block-heading" id="h-la-varianza-del-laplaciano-da-milioni-di-pixel-a-un-solo-numero">La varianza del Laplaciano: da milioni di pixel a un solo numero</h2>



<p><br><br>Utilizzando la <strong>varianza laplaciana blur immagine</strong> è possibile discriminare immagini nitide da immagini fuori fuoco senza ricorrere a modelli di intelligenza artificiale.<br>Ma come possiamo condensare queste informazioni in un <strong>singolo valore numerico</strong> che descriva in modo oggettivo quanto l’immagine sia nitida?</p>



<p>La risposta più semplice ed efficace è: <strong>calcolare la varianza di questi valori</strong>.<br>Per quanto detto prima, un&#8217;immagine ben a fuoco presenta molti bordi e transizioni nette quindi i valori del Laplaciano sono ampiamente distribuiti, sia positivi che negativi: c&#8217;è quindi alta varianza.<br>Un&#8217;immagine sfocata, attenua i bordi pertanto i valori del Laplaciano sono vicini allo zero e poco variabili: c&#8217;è quindi bassa varianza. </p>



<p>La varianza misura proprio quanto i valori si discostino dalla media: più è grande questo scarto, più l&#8217;immagine contiene dettagli e risulta nitida. <br>Nel contesto della computer vision, la <strong>varianza laplaciana blur immagine</strong> rappresenta una metrica affidabile e computazionalmente leggera.<br></p>



<h2 class="wp-block-heading" id="h-definizione-matematica">Definizione matematica</h2>



<p>Data una matrice di risposta Laplaciana <img decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-fa7289d98d789c928dbeceaad07f6c60_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#76;&#95;&#105;" title="Rendered by QuickLaTeX.com" height="15" width="17" style="vertical-align: -3px;"/>, dove <img decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-695d9d59bd04859c6c99e7feb11daab6_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#105;" title="Rendered by QuickLaTeX.com" height="12" width="6" style="vertical-align: 0px;"/> indica ciascun pixel valido (escludendo il bordo), calcoliamo:</p>



<div class="wp-block-math"><math display="block"><semantics><mrow><mi>μ</mi><mo>=</mo><mfrac><mn>1</mn><mi>N</mi></mfrac><mrow><munderover><mo movablelimits="false">∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover></mrow><msub><mi>L</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">
\mu = \frac{1}{N}\sum_{i=1}^{N} L_i
</annotation></semantics></math></div>



<div class="wp-block-math"><math display="block"><semantics><mrow><msup><mi>σ</mi><mn>2</mn></msup><mo>=</mo><mfrac><mn>1</mn><mi>N</mi></mfrac><mrow><munderover><mo movablelimits="false">∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover></mrow><mo form="prefix" stretchy="false">(</mo><msub><mi>L</mi><mi>i</mi></msub><mo>−</mo><mi>μ</mi><msup><mo form="postfix" stretchy="false">)</mo><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">
\sigma^2 = \frac{1}{N}\sum_{i=1}^{N}(L_i &#8211; \mu)^2
</annotation></semantics></math></div>



<p>dove:</p>



<ul class="wp-block-list">
<li><img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-461fe1a58a75801541487ddf10d32abd_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#92;&#109;&#117;" title="Rendered by QuickLaTeX.com" height="12" width="11" style="vertical-align: -4px;"/> è la media dei valori Laplaciani;</li>



<li><img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-9675ccd83f47754d4044b5cb35fda688_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#36;&#78;&#36;" title="Rendered by QuickLaTeX.com" height="12" width="13" style="vertical-align: 0px;"/> è il numero totale di pixel coinvolti (di solito <img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-79c12309d0c1d6d64e5ecf516c00d7cd_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#40;&#119;&#32;&#45;&#32;&#50;&#41;&#40;&#104;&#32;&#45;&#32;&#50;&#41;" title="Rendered by QuickLaTeX.com" height="19" width="110" style="vertical-align: -5px;"/>);</li>



<li><img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-0f9e268776987efab7707f327dabb5b4_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#36;&#92;&#115;&#105;&#103;&#109;&#97;&#94;&#50;&#36;" title="Rendered by QuickLaTeX.com" height="15" width="18" style="vertical-align: 0px;"/> è la <strong>varianza del Laplaciano</strong>, cioè il nostro indicatore di nitidezza.</li>
</ul>



<p>Ora dobbiamo passare da un valore grezzo a uno score interpretabile. </p>



<p>I valori di <img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-0f9e268776987efab7707f327dabb5b4_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#36;&#92;&#115;&#105;&#103;&#109;&#97;&#94;&#50;&#36;" title="Rendered by QuickLaTeX.com" height="15" width="18" style="vertical-align: 0px;"/> dipendono da variabili hardware e ambientali: risoluzione, rumore, compressione JPEG, qualità della lente. Perciò non ha senso usare una soglia fissa: occorre <strong>normalizzare</strong> il valore rispetto a un intervallo empirico.</p>



<p>Definiamo:</p>



<ul class="wp-block-list">
<li><img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-73043ffd87babda0d70ae9ce84007462_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#36;&#84;&#95;&#123;&#109;&#105;&#110;&#125;&#36;" title="Rendered by QuickLaTeX.com" height="15" width="38" style="vertical-align: -3px;"/>: varianza tipica di una foto molto sfocata → corrisponde a <strong>score 1</strong>;</li>



<li><img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-46cb30ff1334045825f790498caba267_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#36;&#84;&#95;&#123;&#109;&#97;&#120;&#125;&#36;" title="Rendered by QuickLaTeX.com" height="15" width="40" style="vertical-align: -3px;"/>: varianza tipica di una foto perfettamente nitida → corrisponde a <strong>score 10</strong>.</li>
</ul>



<p>Quindi:</p>



<div class="wp-block-math"><math display="block"><semantics><mrow><mtext>score</mtext><mo>=</mo><mn>1</mn><mo>+</mo><mn>9</mn><mo>⋅</mo><mrow><mtext></mtext><mi>clamp</mi></mrow><mo form="postfix" stretchy="false">!</mo><mrow><mo fence="true" form="prefix">(</mo><mfrac><mrow><msup><mi>σ</mi><mn>2</mn></msup><mo>−</mo><msub><mi>T</mi><mrow><mi>min</mi><mo>⁡</mo></mrow></msub></mrow><mrow><msub><mi>T</mi><mrow><mi>max</mi><mo>⁡</mo></mrow></msub><mo>−</mo><msub><mi>T</mi><mrow><mi>min</mi><mo>⁡</mo></mrow></msub></mrow></mfrac><mo separator="true">,</mo><mtext>&nbsp;</mtext><mn>0</mn><mo separator="true">,</mo><mtext>&nbsp;</mtext><mn>1</mn><mo fence="true" form="postfix">)</mo></mrow></mrow><annotation encoding="application/x-tex">
\text{score} = 1 + 9 \cdot \mathrm{clamp}!\left(
\frac{\sigma^2 &#8211; T_{\min}}{T_{\max} &#8211; T_{\min}},\ 0,\ 1
\right)
</annotation></semantics></math></div>



<p>Dopo il calcolo, il valore viene arrotondato all’intero più vicino per restituire un punteggio compreso tra 1 e 10. Questo approccio rende il risultato leggibile anche per l’utente finale, oltre che utile per logiche di controllo lato software.</p>



<p>Il valore numerico restituito dalla <strong>varianza laplaciana blur immagine</strong> cresce all’aumentare dei dettagli ad alta frequenza.</p>



<h2 class="wp-block-heading" id="h-implementazione-in-javascript">Implementazione in JavaScript</h2>



<p>L’algoritmo può essere implementato in JavaScript puro utilizzando le API Canvas per accedere ai pixel di un’immagine caricata o ripresa da fotocamera. La funzione seguente prende in input un elemento HTML (<code>&lt;img&gt;</code>,&nbsp;<code>&lt;canvas&gt;</code>,&nbsp;<code>&lt;video&gt;</code>&nbsp;o&nbsp;<code>ImageBitmap</code>) e restituisce un oggetto con&nbsp;<code>score</code>&nbsp;(1–10) e&nbsp;<code>variance</code>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/**
 * Evaluate image sharpness using Laplacian variance.
 *
 * @param {HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|ImageBitmap} source
 * @param {{ thresholdMin?: number, thresholdMax?: number }=} opts
 * @return {Promise&lt;{ score: number, variance: number }>}
 */
export async function blurMeter(source, opts = {}) {
  const T_min = opts.thresholdMin ?? 9;   // calibrated: blurry photo
  const T_max = opts.thresholdMax ?? 50;  // calibrated: sharp photo

  // 1. Prepare off-screen canvas
  const w =
    source.width ||
    source.videoWidth ||
    source.naturalWidth;

  const h =
    source.height ||
    source.videoHeight ||
    source.naturalHeight;

  if (!w || !h) {
    throw new Error("Source has invalid dimensions");
  }

  const off =
    typeof OffscreenCanvas === "function"
      ? new OffscreenCanvas(w, h)
      : (() => {
          const c = document.createElement("canvas");
          c.width = w;
          c.height = h;
          return c;
        })();

  const ctx = off.getContext("2d");
  ctx.drawImage(source, 0, 0, w, h);

  const { data } = ctx.getImageData(0, 0, w, h);

  // 2. Convert to grayscale
  const gray = new Float32Array(w * h);
  for (let i = 0, j = 0; i &lt; data.length; i += 4, ++j) {
    gray&#91;j&#93; =
      0.299 * data&#91;i&#93; +
      0.587 * data&#91;i + 1&#93; +
      0.114 * data&#91;i + 2&#93;;
  }

  // 3. Apply Laplacian (4-neighbour kernel)
  const lap = new Float32Array(w * h);
  const idx = (x, y) => y * w + x;

  for (let y = 1; y &lt; h - 1; ++y) {
    for (let x = 1; x &lt; w - 1; ++x) {
      const i = idx(x, y);
      lap&#91;i&#93; =
        4 * gray&#91;i&#93; -
        gray&#91;idx(x - 1, y)&#93; -
        gray&#91;idx(x + 1, y)&#93; -
        gray&#91;idx(x, y - 1)&#93; -
        gray&#91;idx(x, y + 1)&#93;;
    }
  }

  // 4. Compute variance
  let sum = 0;
  let sumSq = 0;
  const count = (w - 2) * (h - 2);

  for (let y = 1; y &lt; h - 1; ++y) {
    for (let x = 1; x &lt; w - 1; ++x) {
      const v = lap&#91;idx(x, y)&#93;;
      sum += v;
      sumSq += v * v;
    }
  }

  const mean = sum / count;
  const variance = sumSq / count - mean * mean;

  // 5. Map to score
  const norm = Math.max(
    0,
    Math.min(1, (variance - T_min) / (T_max - T_min))
  );

  const score = Math.round(1 + 9 * norm);

  return { score, variance };
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955"> * Evaluate image sharpness using Laplacian variance.</span></span>
<span class="line"><span style="color: #6A9955"> *</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@param</span><span style="color: #6A9955"> </span><span style="color: #4EC9B0">{HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|ImageBitmap}</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">source</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@param</span><span style="color: #6A9955"> </span><span style="color: #4EC9B0">{{ thresholdMin?: number, thresholdMax?: number }=}</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">opts</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> </span><span style="color: #4EC9B0">{Promise&lt;{ score: number, variance: number }&gt;}</span></span>
<span class="line"><span style="color: #6A9955"> */</span></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">blurMeter</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">source</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">opts</span><span style="color: #D4D4D4"> = {}) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">T_min</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">opts</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">thresholdMin</span><span style="color: #D4D4D4"> ?? </span><span style="color: #B5CEA8">9</span><span style="color: #D4D4D4">;   </span><span style="color: #6A9955">// calibrated: blurry photo</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">T_max</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">opts</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">thresholdMax</span><span style="color: #D4D4D4"> ?? </span><span style="color: #B5CEA8">50</span><span style="color: #D4D4D4">;  </span><span style="color: #6A9955">// calibrated: sharp photo</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 1. Prepare off-screen canvas</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">w</span><span style="color: #D4D4D4"> =</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">source</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">width</span><span style="color: #D4D4D4"> ||</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">source</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">videoWidth</span><span style="color: #D4D4D4"> ||</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">source</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">naturalWidth</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">h</span><span style="color: #D4D4D4"> =</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">source</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">height</span><span style="color: #D4D4D4"> ||</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">source</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">videoHeight</span><span style="color: #D4D4D4"> ||</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">source</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">naturalHeight</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4"> || !</span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Source has invalid dimensions&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">off</span><span style="color: #D4D4D4"> =</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">typeof</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">OffscreenCanvas</span><span style="color: #D4D4D4"> === </span><span style="color: #CE9178">&quot;function&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      ? </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">OffscreenCanvas</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">      : (() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">c</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">document</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">createElement</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;canvas&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">c</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">width</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">c</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">height</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">c</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        })();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">ctx</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">off</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getContext</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;2d&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">ctx</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">drawImage</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">source</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> { </span><span style="color: #4FC1FF">data</span><span style="color: #D4D4D4"> } = </span><span style="color: #9CDCFE">ctx</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getImageData</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 2. Convert to grayscale</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">gray</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Float32Array</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">j</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> += </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">, ++</span><span style="color: #9CDCFE">j</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">gray</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">j</span><span style="color: #D4D4D4">&#93; =</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #B5CEA8">0.299</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93; +</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #B5CEA8">0.587</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> + </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">&#93; +</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #B5CEA8">0.114</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> + </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 3. Apply Laplacian (4-neighbour kernel)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">lap</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Float32Array</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">idx</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; ++</span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; ++</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">i</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">idx</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">lap</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93; =</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">gray</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93; -</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">gray</span><span style="color: #D4D4D4">&#91;</span><span style="color: #DCDCAA">idx</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">)&#93; -</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">gray</span><span style="color: #D4D4D4">&#91;</span><span style="color: #DCDCAA">idx</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> + </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">)&#93; -</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">gray</span><span style="color: #D4D4D4">&#91;</span><span style="color: #DCDCAA">idx</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)&#93; -</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">gray</span><span style="color: #D4D4D4">&#91;</span><span style="color: #DCDCAA">idx</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> + </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 4. Compute variance</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sumSq</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">count</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">) * (</span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; ++</span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; ++</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">v</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">lap</span><span style="color: #D4D4D4">&#91;</span><span style="color: #DCDCAA">idx</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">)&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> += </span><span style="color: #9CDCFE">v</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">sumSq</span><span style="color: #D4D4D4"> += </span><span style="color: #9CDCFE">v</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">v</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">mean</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> / </span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">variance</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sumSq</span><span style="color: #D4D4D4"> / </span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">mean</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">mean</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 5. Map to score</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">norm</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">max</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">min</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, (</span><span style="color: #9CDCFE">variance</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">T_min</span><span style="color: #D4D4D4">) / (</span><span style="color: #9CDCFE">T_max</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">T_min</span><span style="color: #D4D4D4">))</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">score</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> + </span><span style="color: #B5CEA8">9</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">norm</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">score</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">variance</span><span style="color: #D4D4D4"> };</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#1E1E1E;color:#c7c7c7;font-size:12px;line-height:1;position:relative">Copyright 2026 © renor.it</span></div>



<p>Questa funzione è leggera, autonoma e può essere eseguita direttamente lato client, ad esempio in un&#8217;applicazione web per fotocamera live o analisi immagini.</p>



<p>Prossimo passo: creiamo un&#8217;interfaccia semplice con HTML e Tailwind per usare questa funzione in modo interattivo.</p>



<h2 class="wp-block-heading" id="h-interfaccia-html-tailwind">Interfaccia HTML + Tailwind</h2>



<p>Consumiamo ora la funzione in una semplice interfaccia utente realizzata in HTML e Tailwind che permette all&#8217;utente di caricare un&#8217;immagine, visualizzarne l&#8217;anteprima e ricevere immediatamente uno score di nitidezza con una barra colorata da rosso (sfuocato) a verde (nitido).</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;!DOCTYPE html>
&lt;html lang="it">
&lt;head>
  &lt;meta charset="UTF-8">
  &lt;title>Blur Meter Demo&lt;/title>

  &lt;!-- Tailwind CSS via CDN -->
  &lt;script src="https://cdn.tailwindcss.com">&lt;/script>

  &lt;meta name="viewport" content="width=device-width, initial-scale=1">
&lt;/head>

&lt;body class="min-h-screen bg-slate-100 flex items-center justify-center p-4">
  &lt;div class="w-full max-w-lg bg-white shadow-xl rounded-2xl p-6 space-y-6">
    &lt;h1 class="text-2xl font-semibold text-center">
      Image Blur Meter
    &lt;/h1>

    &lt;!-- File input -->
    &lt;label class="flex flex-col items-center justify-center w-full h-40 px-4 transition bg-white border-2 border-dashed rounded-lg cursor-pointer hover:border-indigo-500">
      &lt;span class="text-sm text-gray-500">
        Click here to upload an image
      &lt;/span>
      &lt;input
        id="uploader"
        type="file"
        accept="image/*"
        class="hidden"
      >
    &lt;/label>

    &lt;!-- Image preview -->
    &lt;div id="previewWrapper" class="hidden">
      &lt;img
        id="preview"
        alt="preview"
        class="mx-auto max-h-64 rounded-lg shadow-md"
      >
    &lt;/div>

    &lt;!-- Results -->
    &lt;div id="result" class="hidden space-y-3">
      &lt;p
        id="scoreText"
        class="text-center text-lg font-medium"
      >&lt;/p>

      &lt;!-- Progress bar -->
      &lt;div class="w-full bg-gray-200 rounded-full h-4">
        &lt;div
          id="scoreBar"
          class="h-4 rounded-full transition-all duration-500"
          style="width: 0%;"
        >&lt;/div>
      &lt;/div>

      &lt;p
        id="varianceText"
        class="text-center text-sm text-gray-500"
      >&lt;/p>
    &lt;/div>
  &lt;/div>

  &lt;script type="module">
    import { blurMeter } from './js/blur-meter.js';

    const uploader     = document.getElementById('uploader');
    const preview      = document.getElementById('preview');
    const previewWrap  = document.getElementById('previewWrapper');
    const scoreText    = document.getElementById('scoreText');
    const varianceText = document.getElementById('varianceText');
    const scoreBar     = document.getElementById('scoreBar');
    const resultBlock  = document.getElementById('result');

    const scoreToColor = score => {
      const t = (score - 1) / 9;
      const r = Math.round(220 + (22  - 220) * t);
      const g = Math.round( 38 + (163 -  38) * t);
      const b = Math.round( 38 + ( 74  -  38) * t);
      return `rgb(${r}, ${g}, ${b})`;
    };

    uploader.addEventListener('change', async event => {
      const file = event.target.files&#91;0&#93;;
      if (!file) return;

      const url = URL.createObjectURL(file);
      preview.src = url;
      previewWrap.classList.remove('hidden');

      await new Promise(resolve => {
        preview.onload = resolve;
      });

      const { score, variance } = await blurMeter(preview);

      scoreText.textContent =
        `Sharpness Score: ${score}/10`;

      varianceText.textContent =
        `Laplacian variance: ${variance.toFixed(2)}`;

      const percent = ((score - 1) / 9) * 100;
      scoreBar.style.width = percent + '%';
      scoreBar.style.backgroundColor = scoreToColor(score);

      resultBlock.classList.remove('hidden');

      URL.revokeObjectURL(url);
    });
  &lt;/script>
&lt;/body>
&lt;/html></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;!</span><span style="color: #4FC1FF">DOCTYPE</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">html</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">html</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lang</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;it&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">head</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">meta</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">charset</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;UTF-8&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">title</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Blur Meter Demo</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">title</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  &lt;!-- Tailwind CSS via CDN --&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">script</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;https://cdn.tailwindcss.com&quot;</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">meta</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;viewport&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;width=device-width, initial-scale=1&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">head</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">body</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;min-h-screen bg-slate-100 flex items-center justify-center p-4&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;w-full max-w-lg bg-white shadow-xl rounded-2xl p-6 space-y-6&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">h1</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text-2xl font-semibold text-center&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      Image Blur Meter</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">h1</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    &lt;!-- File input --&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">label</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;flex flex-col items-center justify-center w-full h-40 px-4 transition bg-white border-2 border-dashed rounded-lg cursor-pointer hover:border-indigo-500&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">span</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text-sm text-gray-500&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        Click here to upload an image</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">span</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">input</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;uploader&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;file&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">accept</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;image/*&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;hidden&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">label</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    &lt;!-- Image preview --&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;previewWrapper&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;hidden&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">img</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;preview&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">alt</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;preview&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;mx-auto max-h-64 rounded-lg shadow-md&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    &lt;!-- Results --&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;result&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;hidden space-y-3&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">p</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;scoreText&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text-center text-lg font-medium&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">p</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      &lt;!-- Progress bar --&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;w-full bg-gray-200 rounded-full h-4&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;scoreBar&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;h-4 rounded-full transition-all duration-500&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;width: 0%;&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">p</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;varianceText&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text-center text-sm text-gray-500&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">p</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">script</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;module&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    import </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">blurMeter</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> from &#39;./js/blur-meter.js&#39;;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    const uploader     = document.getElementById(&#39;uploader&#39;);</span></span>
<span class="line"><span style="color: #D4D4D4">    const preview      = document.getElementById(&#39;preview&#39;);</span></span>
<span class="line"><span style="color: #D4D4D4">    const previewWrap  = document.getElementById(&#39;previewWrapper&#39;);</span></span>
<span class="line"><span style="color: #D4D4D4">    const scoreText    = document.getElementById(&#39;scoreText&#39;);</span></span>
<span class="line"><span style="color: #D4D4D4">    const varianceText = document.getElementById(&#39;varianceText&#39;);</span></span>
<span class="line"><span style="color: #D4D4D4">    const scoreBar     = document.getElementById(&#39;scoreBar&#39;);</span></span>
<span class="line"><span style="color: #D4D4D4">    const resultBlock  = document.getElementById(&#39;result&#39;);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    const scoreToColor = score =&gt; </span><span style="color: #569CD6">{</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">const</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">t</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">score</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">) / </span><span style="color: #B5CEA8">9</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">const</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">r</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">220</span><span style="color: #D4D4D4"> + (</span><span style="color: #B5CEA8">22</span><span style="color: #D4D4D4">  - </span><span style="color: #B5CEA8">220</span><span style="color: #D4D4D4">) * </span><span style="color: #9CDCFE">t</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">const</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">g</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">( </span><span style="color: #B5CEA8">38</span><span style="color: #D4D4D4"> + (</span><span style="color: #B5CEA8">163</span><span style="color: #D4D4D4"> -  </span><span style="color: #B5CEA8">38</span><span style="color: #D4D4D4">) * </span><span style="color: #9CDCFE">t</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">const</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">( </span><span style="color: #B5CEA8">38</span><span style="color: #D4D4D4"> + ( </span><span style="color: #B5CEA8">74</span><span style="color: #D4D4D4">  -  </span><span style="color: #B5CEA8">38</span><span style="color: #D4D4D4">) * </span><span style="color: #9CDCFE">t</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">`rgb(</span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">r</span><span style="color: #569CD6">}</span><span style="color: #CE9178">, </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">g</span><span style="color: #569CD6">}</span><span style="color: #CE9178">, </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">b</span><span style="color: #569CD6">}</span><span style="color: #CE9178">)`</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">}</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    uploader.addEventListener(&#39;change&#39;, async event =&gt; </span><span style="color: #569CD6">{</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">const</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">file</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">event</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">files</span><span style="color: #D4D4D4">&#91;</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">file</span><span style="color: #D4D4D4">) </span><span style="color: #9CDCFE">return</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">const</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">url</span><span style="color: #D4D4D4"> = </span><span style="color: #4FC1FF">URL</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">createObjectURL</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">file</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">preview</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">url</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">previewWrap</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">classList</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">remove</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;hidden&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Promise</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">resolve</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">preview</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">onload</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">resolve</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      });</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">const</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">score</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">variance</span><span style="color: #D4D4D4"> } = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">blurMeter</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">preview</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">scoreText</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">textContent</span><span style="color: #D4D4D4"> =</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">`Sharpness Score: </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">score</span><span style="color: #569CD6">}</span><span style="color: #CE9178">/10`</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">varianceText</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">textContent</span><span style="color: #D4D4D4"> =</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">`Laplacian variance: </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">variance</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toFixed</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">)</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">const</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">percent</span><span style="color: #D4D4D4"> = ((</span><span style="color: #9CDCFE">score</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">) / </span><span style="color: #B5CEA8">9</span><span style="color: #D4D4D4">) * </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">scoreBar</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">width</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">percent</span><span style="color: #D4D4D4"> + </span><span style="color: #CE9178">&#39;%&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">scoreBar</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">backgroundColor</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">scoreToColor</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">score</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">resultBlock</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">classList</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">remove</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;hidden&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #4FC1FF">URL</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">revokeObjectURL</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">url</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">}</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">body</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">html</span><span style="color: #808080">&gt;</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#1E1E1E;color:#c7c7c7;font-size:12px;line-height:1;position:relative">Copyright 2026 © renor.it</span></div>



<h2 class="wp-block-heading" id="h-test-di-funzionamento">Test di funzionamento</h2>



<p>Abbiamo testato la funzione su tre diverse tipologie di immagine&#8230;</p>



<h3 class="wp-block-heading" id="h-completamente-sfuocata">Completamente sfuocata</h3>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="550" height="692" src="https://renor.it/wp-content/uploads/2025/06/image-2.webp" alt="Interfaccia web di Image Blur Meter che mostra un’immagine fortemente sfocata con punteggio di nitidezza 1 su 10 calcolato tramite varianza del Laplaciano." class="wp-image-858" srcset="https://renor.it/wp-content/uploads/2025/06/image-2.webp 550w, https://renor.it/wp-content/uploads/2025/06/image-2-238x300.webp 238w" sizes="auto, (max-width: 550px) 100vw, 550px" /></figure>



<h3 class="wp-block-heading" id="h-moderatamente-sfuocata">Moderatamente sfuocata</h3>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="551" height="690" src="https://renor.it/wp-content/uploads/2025/06/image-3.webp" alt="Interfaccia di Image Blur Meter con esempio di immagine parzialmente sfocata dell’etichetta di un prodotto alimentare, valutata con punteggio di nitidezza 2 su 10 tramite varianza del Laplaciano." class="wp-image-860" srcset="https://renor.it/wp-content/uploads/2025/06/image-3.webp 551w, https://renor.it/wp-content/uploads/2025/06/image-3-240x300.webp 240w" sizes="auto, (max-width: 551px) 100vw, 551px" /></figure>



<h3 class="wp-block-heading" id="h-nitida">Nitida</h3>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="559" height="692" src="https://renor.it/wp-content/uploads/2025/06/image-4.webp" alt="Interfaccia di Image Blur Meter con esempio di etichetta alimentare nitida, valutata con punteggio di nitidezza 10 su 10 tramite varianza del Laplaciano." class="wp-image-862" srcset="https://renor.it/wp-content/uploads/2025/06/image-4.webp 559w, https://renor.it/wp-content/uploads/2025/06/image-4-242x300.webp 242w" sizes="auto, (max-width: 559px) 100vw, 559px" /></figure>



<h2 class="wp-block-heading" id="h-conclusione">Conclusione</h2>



<p><br><br>In conclusione, la <strong>varianza laplaciana blur immagine</strong> è ideale per pipeline di image processing deterministiche. La sua forza risiede nella rapidità computazionale, nell&#8217;assenza di dipendenze esterne e nella coerenza con la percezione visiva umana.</p>



<p>Nel nostro caso d&#8217;uso, applicato all&#8217;App CeliachIA, questa metrica ci ha permesso di anticipare il controllo qualità direttamente sul dispositivo dell&#8217;utente, evitando costi superflui di invocazioni cloud quando le immagini non sono idonee all&#8217;analisi OCR. </p>



<p>La pipeline realizzata con JavaScript e Canvas API, abbinata a una semplice interfaccia web sviluppata con Tailwind, rappresenta un esempio concredo di come concetti matematici e strumenti ingegneristici possano confluire in una soluzione robusta, economica e user-friendly. </p>



<p>In definitiva, dotarsi di un sistema automatico di scoring della nitidezza non è solo un vezzo tecnic, ma una componente essenziale per garantire qualità, efficienza e sostenibilità nelle pipeline di analisi delle immagini moderne. </p>



<p>Potete scaricare questo strumento dal mio account GitHub al link: <a href="https://github.com/thesimon82/Laplacian-Blur-Detector/">https://github.com/thesimon82/Laplacian-Blur-Detector/</a></p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/valutazione-del-livello-di-blur-tramite-varianza-laplaciana/">Valutazione del livello di Blur tramite Varianza Laplaciana</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI washing: quando basterebbe una if()</title>
		<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-washing-quando-basterebbe-una-if/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Mon, 09 Jun 2025 20:14:25 +0000</pubDate>
				<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[AI washing]]></category>
		<category><![CDATA[algoritmi deterministici]]></category>
		<category><![CDATA[automazione]]></category>
		<category><![CDATA[buon senso ingegneristico]]></category>
		<category><![CDATA[buzzword]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[costi AI]]></category>
		<category><![CDATA[GPT]]></category>
		<category><![CDATA[if statement]]></category>
		<category><![CDATA[ingegneria del software]]></category>
		<category><![CDATA[Innovazione tecnologica]]></category>
		<category><![CDATA[intelligenza artificiale]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[moda tecnologica]]></category>
		<category><![CDATA[neural networks]]></category>
		<category><![CDATA[overengineering]]></category>
		<category><![CDATA[PDF automation]]></category>
		<category><![CDATA[progettazione software]]></category>
		<category><![CDATA[programmazione efficiente]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[sobrietà progettuale]]></category>
		<category><![CDATA[software engineering ethics]]></category>
		<category><![CDATA[soluzioni tecniche]]></category>
		<category><![CDATA[startup tech]]></category>
		<category><![CDATA[sviluppo backend]]></category>
		<category><![CDATA[sviluppo web]]></category>
		<category><![CDATA[tecnologie emergenti]]></category>
		<guid isPermaLink="false">https://renor.it/?p=804</guid>

					<description><![CDATA[<p>L&#8217;epoca dell&#8217;AI washing L&#8217;intelligenza artificiale è, senza ombra di dubbio, una delle più importanti evoluzioni tecnologiche e &#8220;scoperte&#8221; del nostro tempo. Uso il termine &#8220;scoperte&#8221; tra virgolette perché in realtà, la teoria alla base dell&#8217;AI risale addirittura al 1956, anno della celebre conferenza di Dartmouth che ne sancì la nascita ufficiale. Eppure, solo negli ultimi [&#8230;]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-washing-quando-basterebbe-una-if/">AI washing: quando basterebbe una if()</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="h-l-epoca-dell-ai-washing">L&#8217;epoca dell&#8217;AI washing</h2>



<p>L&#8217;intelligenza artificiale è, senza ombra di dubbio, una delle più importanti evoluzioni tecnologiche e &#8220;scoperte&#8221; del nostro tempo. Uso il termine &#8220;scoperte&#8221; tra virgolette perché in realtà, la teoria alla base dell&#8217;AI risale addirittura al 1956, anno della celebre <a href="https://plato.stanford.edu/entries/artificial-intelligence/">conferenza di Dartmouth</a> che ne sancì la nascita ufficiale. <br>Eppure, solo negli ultimi anni, l&#8217;AI ha fatto irruzione nell&#8217;universo consumer e manageriale, diventando una parola magica buona per ogni contesto: marketing, prodotti, slide per gli investitori, report aziendali, ecc. <br>È uno dei tanti esempi di <strong>AI washing</strong>, ovvero l’uso dell’intelligenza artificiale come etichetta alla moda anche quando una soluzione deterministica sarebbe più che sufficiente.</p>



<p>Il punto è che, se ieri la moda era l’iPhone, oggi la moda è l’intelligenza artificiale, in piena logica di <strong>AI washing</strong>. Tutti vogliono inserirla ovunque, anche dove non c&#8217;è nessuna necessità di integrarla. A volte infatti, non è solamente inutile: è meno efficiente, più fragile e più costosa da mantenere rispetto ad un classico algoritmo a stati finiti. Ma poco importa: l&#8217;importante è dire che c&#8217;è l&#8217;AI.</p>



<p>Per spiegare meglio cosa intendo, voglio partire da un esempio lampante e assolutamente reale. </p>



<p><strong>AI? No, basta un while: il caso del PDF intelligente</strong></p>



<p>Poco tempo fa per una società di somministrazione che abbiamo come cliente, mi è stato chiesto di sviluppare qualcosa che li aiutasse ad inviare tutte le CU. Parlando di migliaia di dipendenti potete immaginare il tempo che avrebbe tolto ai poveri operatori amministrativi, spacchettare manualmente un PDF contenente tutte le CU di tutti i dipendenti, ed inviarle una ad una manualmente. </p>



<p>Immaginiamo quindi di avere un PDF testuale, contenente migliaia di Certificazioni Uniche, di ogni dipendente. Migliaia di documenti multipli di utenti consecutivi. Ogni utente ha la sua CU che può avere 8, 10, 12 pagine e noi vogliamo dividerlo in tanti PDF quanti sono i dipendenti presenti. </p>



<p>Uno sviluppatore cosa farebbe?<br>Per prima cosa aprirebbe il file da dividere, lo analizzerebbe, e si accorgerebbe che la prima pagina di ogni CU di ogni utente contiene in intestazione il codice fiscale. Bene: c&#8217;è un pattern!<br>Cosa pensa allora?</p>



<p><em>&#8220;Fantastico! Scrivo uno script con una while che mi cicla ogni pagina del documento partendo dalla prima fino all&#8217;ultima, all&#8217;interno del ciclo inserisco una regex che mi cerchi un codice fiscale, lo valido per essere certo che quello che mi ha pescato sia effettivamente un codice fiscale e se la validazione va a buon fine, segno quella pagina come inizio di una nuova CU del dipendente. Proseguendo nell&#8217;elaborazione delle altre pagine, appena ne trovo un altro, salvo tutto il blocco precedente in un nuovo PDF e lo invio in allegato ad una mail estraendo dal DB i dati del dipendente utilizzando come parametro di ricerca proprio il codice fiscale che ho nella mia bella variabile e proseguo così fino alla fine&#8221;. </em></p>



<p>Soluzione elegante. Lineare. Leggibile. Affidabile e soprattutto molto veloce!<br>Nessuna AI. Solo logica strutturata, programmazione deterministica e analisi del pattern. </p>



<p>Eppure volevano l&#8217;AI: &#8220;Ma non possiamo usare l&#8217;AI per individuare automaticamente dove inizia ogni documento?&#8221;.</p>



<p>Certo che puoi utilizzare l&#8217;AI, ma <a href="https://it.wikipedia.org/wiki/Intelligenza_artificiale">utilizzare l&#8217;AI</a> per capire da quale pagina a quale pagina inizi e finisca una CU è come dotarsi di un cannone laser per uccidere una formica. Inoltre l&#8217;AI ha tempi molto lunghi di inferenza, rispetto all&#8217;algoritmo deterministico che processa enormi moli di dati in pochi secondi.</p>



<h2 class="wp-block-heading" id="h-ma-i-costi">Ma i costi?</h2>



<p>Certamente! Ci sono anche i costi!<br>Processare un documento con migliaia di CU dei dipendenti e decine di migliaia di pagine oltre a richiedere tempi lunghi ha costi che possono essere tutt&#8217;altro che indifferenti. A seconda del modello si potrebbero spendere anche più di 500 euro per processare decine di migliaia di pagine PDF.                                                                                                                                                                                                                                                                                                                                                                                                                                  </p>



<h2 class="wp-block-heading" id="h-ai-washing-e-determinismo-due-approcci-a-confronto">AI washing e determinismo: due approcci a confronto</h2>



<p>Una volta chiarito che nel nostro esempio del PDF la soluzione più semplice ed efficace è deterministica, vale la pena riflettere più in generale su quando conviene usare un approccio logico e prevedibile e quando invece <a href="https://www.logotel.it/quando-lintelligenza-artificiale-e-utile-e-quando-no-la-guida-pratica/">può aver senso introdurre un layer di intelligenza artificiale</a>.</p>



<h3 class="wp-block-heading" id="h-l-approccio-deterministico">L&#8217;approccio deterministico</h3>



<p><strong>Logico, trasparente, tracciabile</strong></p>



<p>Un algoritmo deterministico è composto da regole esplicite e comportamenti prevedibili. Per ogni input noto, l&#8217;output è garantito e replicabile. Non impara, ma fa esattamente ciò che gli dici di fare. </p>



<p>Nel caso del nostro PDF la struttura è chiara perché abbiamo il pattern fisso del codice fiscale, la variabilità è praticamente nulla e l&#8217;obiettivo è definibile logicamente. In questi casi l&#8217;approccio deterministico ha enormi vantaggi: ha molta efficienza computazionale e può quindi girare con successo anche su dispositivi con risorse minime. È affidabile, facilmente testabile ed è possibile effettuare debug immediato. L&#8217;intero flusso è comprensibile anche da un team non esperto di Machine Learning.  Ed è per questo che andare oltre questa soluzione <strong>perché vogliamo l&#8217;AI</strong> è oltre che ingiustificato anche controproducente. </p>



<h3 class="wp-block-heading" id="h-l-approccio-ai-driven">L&#8217;approccio AI-driven</h3>



<p><strong>Flessibile ma scarsamente prevedibile, costoso e non sempre giustificabile. </strong></p>



<p>Quando si parla di AI s&#8217;intendono spesso sistemi capaci di apprendere da esempi (machine learning), generalizzare pattern anche in contesti non perfettamente definiti, gestire ambiguità e rumore nei dati. Tutto questo è utile se e solo se i dati non seguono pattern rigidi o non noti a priori, il contesto è caotico, ad esempio OCR su foto scattate da smartphone che hanno una variabilità di qualità imprevedibile oppure per ultimo la logica esplicita fallisce perché i casi limite sono infiniti o comunque imprevedibili. </p>



<p>Nel nostro esempio del PDF, non ci sono ambiguità, non c&#8217;è rumore: usare una rete neurale per individuare il codice fiscale è uno spreco, sia tecnica che economico. </p>



<p>Tutto ciò però non impedisce a certe aziende, guidate più dalla moda che dall’ingegneria e da una logica di AI washing, di proporre soluzioni tipo: &#8220;addestriamo un modello NLP per riconoscere le intestazioni oppure usiamo GPT per segmentare i documenti, o ancora usiamo un classificatore supervisionato per capire se un documento è l&#8217;inizio o no&#8230; tutto ciò per&#8230; <strong>Fare quello che un preg_match()</strong> risolve in una riga di codice.</p>



<p>Ritorniamo coi piedi per terra e ricordiamoci che l&#8217;AI per quando impressionante è solo uno strumento. Non esiste o comunque, almeno per uno sviluppatore, non dovrebbe esistere una guerra tra approccio deterministico e AI. Sono entrambi strumenti&#8230; Ma la logica ingegneristica ci insegna a scegliere <strong>lo strumento più semplice, efficace e giustificato per il problema che deve risolvere</strong>. L&#8217;AI ha senso dove il determinismo non arriva: visione artificiale su immagini sfocate, riconoscimento del parlato, predizioni basate su serie storiche complesse, analisi semantica profonda. Ma laddove esiste una regola, una struttura prevedibile, una logica valida, l&#8217;intelligenza artificiale non è solo inutile: è rumore, complicazione e costo. </p>



<h2 class="wp-block-heading" id="h-l-intelligenza-non-e-artificiale-e-progettuale">L&#8217;intelligenza non è artificiale, è progettuale </h2>



<p>L&#8217;intelligenza artificiale è uno strumento straordinario ma come tutti gli strumenti potenti, <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/lai-fara-perdere-posti-di-lavoro/">va maneggiata con giudizio</a>. Non è una bacchetta magica da agitare sopra ogni problema, né una chiave da infilare nei pitch per far colpo sugli investitori.</p>



<p>C&#8217;è una differenza sostanziale tra <strong>fare innovazione</strong> e <strong>fare finta innovazione</strong>. Oggi, troppe soluzioni vengono pensate partendo dallo strumento e non dal problema. <br>Il risultato sono sistemi sovra-ingegnerizzati, costosi, fragili, spesso anche poco reattivi e in definitiva inutili. </p>



<p>Scusate tanto, ma se entrate in un&#8217;azienda per risolvergli dei problemi ed efficientarla tecnologicamente la prima cosa che fate qual&#8217;è? Vedere dove si può applicare l&#8217;Intelligenza Artificiale? Oppure comprendere da dove nasce il dato, come si muove, studiare come lavora l&#8217;azienda, identificare i processi macchinosi che possono essere automatizzati e poi proporre delle soluzioni in base ai problemi riscontrati?</p>



<p>Direi ad occhi chiusi la seconda!</p>



<p>Nel mondo reale, l’ingegneria buona è quella che risolve il problema nel modo più semplice, elegante e sostenibile possibile, evitando l’AI washing. Anche se non fa notizia. Anche se non c&#8217;è scritto &#8220;AI-powered&#8221;.</p>



<p>Il futuro dell&#8217;informatica non sarà dominato da chi infila modelli neurali ovunque, ma da chi sa scegliere quando serve davvero. Da chi ha il coraggio di dire: <em>&#8220;No, qui basta una if()&#8221;</em>.</p>



<p>Forse proprio da questa sobrietà tecnica potrà rinascere un&#8217;idea nuova di competenza: una che non si misura in buzzwords, ma in chiarezza progettuale, efficienza e responsabilità. </p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-washing-quando-basterebbe-una-if/">AI washing: quando basterebbe una if()</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sexy secondo algoritmo: la nuova estetica creata da chi ci osserva</title>
		<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/sexy-secondo-algoritmo-la-nuova-estetica-creata-da-chi-ci-osserva/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Fri, 06 Jun 2025 15:07:40 +0000</pubDate>
				<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[algoritmo]]></category>
		<category><![CDATA[arte generativa]]></category>
		<category><![CDATA[attrazione]]></category>
		<category><![CDATA[bellezza]]></category>
		<category><![CDATA[cultura visuale]]></category>
		<category><![CDATA[dati]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[desiderio]]></category>
		<category><![CDATA[donna generata da AI]]></category>
		<category><![CDATA[estetica]]></category>
		<category><![CDATA[estetica digitale]]></category>
		<category><![CDATA[femminilità]]></category>
		<category><![CDATA[fotografia digitale]]></category>
		<category><![CDATA[immaginario collettivo]]></category>
		<category><![CDATA[immagine AI]]></category>
		<category><![CDATA[intelligenza artificiale]]></category>
		<category><![CDATA[modelli estetici]]></category>
		<category><![CDATA[modelli generati da AI]]></category>
		<category><![CDATA[Monica Bellucci]]></category>
		<category><![CDATA[oggettività]]></category>
		<category><![CDATA[prompt AI]]></category>
		<category><![CDATA[Reti neurali]]></category>
		<category><![CDATA[sex appeal]]></category>
		<category><![CDATA[sexy]]></category>
		<category><![CDATA[simmetria]]></category>
		<category><![CDATA[società e bellezza]]></category>
		<category><![CDATA[soggettività]]></category>
		<category><![CDATA[visione artificiale]]></category>
		<guid isPermaLink="false">https://renor.it/?p=724</guid>

					<description><![CDATA[<p>Questa donna non esiste. Eppure non riesci a smettere di guardarla. È l’effetto del sexy secondo algoritmo, una nuova forma di attrazione costruita dall’intelligenza artificiale a partire dai nostri stessi dati. Questo sarà un articolo poco tecnico, per chi si avvicina o vuole sapere qualcosa di più sull&#8217;intelligenza artificiale. Nel giro di pochi anni l’AI [&#8230;]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/sexy-secondo-algoritmo-la-nuova-estetica-creata-da-chi-ci-osserva/">Sexy secondo algoritmo: la nuova estetica creata da chi ci osserva</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="h-questa-donna-non-esiste-eppure-non-riesci-a-smettere-di-guardarla">Questa donna non esiste. Eppure non riesci a smettere di guardarla. </h2>



<p>È l’effetto del sexy secondo algoritmo, una nuova forma di attrazione costruita dall’intelligenza artificiale a partire dai nostri stessi dati. Questo sarà un articolo poco tecnico, per chi si avvicina o vuole sapere qualcosa di più sull&#8217;intelligenza artificiale. Nel giro di pochi anni l’AI ha imparato a generare immagini di donne talmente realistiche, seducenti e perfettamente composte da confondersi con modelle vere, dando forma a una nuova bellezza artificiale. Ma come fa una macchina, priva di emozioni, desideri o esperienza sensoriale, a <em>capire</em> cosa significa ‘essere sexy’ al punto da generare effettivamente un&#8217;immagine che evochi questo status? Se vuoi approfondire, per capire come funzionano i modelli generativi di immagini, vedi DALL·E, un algoritmo sviluppato da OpenAI capace di generare immagini a partire da descrizioni testuali <a href="https://it.wikipedia.org/wiki/DALL-E">clicca qui</a>.</p>



<h2 class="wp-block-heading" id="h-la-risposta-e-nei-dati">La risposta è nei dati</h2>



<p>L&#8217;AI non desidera&#8230; Calcola; e per farlo ha visto milioni di immagini, dai ritratti rinascimentali ai selfie su Instagram, dalle copertine dei primi Playboy alle fotografie di moda. Interessante anche il progetto <a href="https://it.wikipedia.org/wiki/StyleGAN">StyleGAN</a>. Ogni curva, ogni posa, ogni sguardo, sono stati scomposti in vettori, metriche, pesi e correlazioni statistiche. Quando chiedi all&#8217;AI di creare una foto di una donna sexy, l&#8217;algoritmo non inventa nulla, si limita unicamente a ricomporre il desiderio medio globale. Il risultato finale è una donna generata da AI che incarna il compromesso statistico del desiderio collettivo.</p>



<p>La foto che otteniamo è pertanto una media di tratti, proporzioni fisiche, grandezza di seno, trucco, ecc. che rientrano nella media del desiderio medio delle persone nel mondo. </p>



<p>Questo ovviamente solleva un problema di natura filologica&#8230;</p>



<h2 class="wp-block-heading" id="h-chi-decide-cose-e-sexy-e-cosa-no">Chi decide cose è sexy e cosa no?</h2>



<p><em>&#8220;<strong>La bellezza è soggettiva</strong>&#8220;</em> quanti di voi non hanno mai sentito questa frase? La si dice talmente tante volte che ormai la si ritiene lapalissiana, vera a prescindere. </p>



<p>Io non sono d&#8217;accordo! Perché se la bellezza fosse davvero soggettiva, allora dovremmo accettare anche l&#8217;idea che una persona universalmente riconosciuta bella possa essere definita brutta. E invece no. Esistono dei limiti, anche alla soggettività.</p>



<p>Prendiamo la nostra Monica Bellucci all&#8217;apice della sua bellezza</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="674" height="1000" src="https://renor.it/wp-content/uploads/2025/06/image.webp" alt="Monica Bellucci" class="wp-image-725" style="aspect-ratio:16/9;object-fit:contain" srcset="https://renor.it/wp-content/uploads/2025/06/image.webp 674w, https://renor.it/wp-content/uploads/2025/06/image-202x300.webp 202w" sizes="auto, (max-width: 674px) 100vw, 674px" /></figure>



<p>Se la bellezza fosse soggettiva ciò significherebbe che nel mondo dovrebbe esistere qualcuno capace di ritenere che alla Bellucci gli si possa dare l&#8217;appellativo di &#8220;Brutta&#8221;. </p>



<p>Comprendo che possano esserci persone che, vuoi per preferenze personali, vuoi per antipatie, possano <strong>preferire</strong> altri tipi di bellezza. C&#8217;è chi può preferire una bionda, c&#8217;è chi può preferire un seno più piccolo o ancora più grande, ma definire come &#8220;Brutta&#8221; la Bellucci può essere solo segno di invidia (se pronunciato da donne) o di antipatia (se pronunciato da maschi) ma in realtà entrambi sanno che Monica Bellucci è tutt&#8217;altro che brutta. </p>



<p>Con questo ragionamento ne ricavo che la soggettività dell’estetica esiste con alcuni limiti, soprattutto quando entra in gioco un’estetica algoritmica. Abbiamo portato l&#8217;esempio della Bellucci ma avremmo potuto parlare di Angelina Jolie, di Cindy Crawford, di Naomi Campbell, di Charlize Theron, come per altri punti di riferimento estetici maschili come Gabriel Garko, Paul Newman, Alain Delon, Henry Cavill, ecc. ecc. L&#8217;estetica vera è secondo me qualcosa di oggettivo: il &#8220;bello&#8221; è bello per definizione.</p>



<p>C&#8217;è poi anche una ragione statistica&#8230; Se il 99% della popolazione mondiale identifica in una persona il senso estetico, allora si può dire che quella persona conserva delle <strong>caratteristiche estetiche</strong> oggettive. </p>



<h2 class="wp-block-heading" id="h-la-bellezza-secondo-l-ai">La bellezza secondo l&#8217;AI</h2>



<p>Chi decide dunque cosa è sexy quando a crearla è una macchina che ci guarda? Siamo noi che lo decidiamo. Siamo noi ad educare l&#8217;algoritmo, e l&#8217;AI non fa altro che restituirci uno specchio: ci mostra i tratti di ciò che è statisticamente ritenuto più sexy dalla maggior parte del mondo. Una donna generata da AI è un ritratto collettivo del nostro gusto inconscio. In questo senso, il sexy secondo algoritmo non è una creazione autonoma della macchina, ma una proiezione matematica delle nostre preferenze aggregate.</p>



<p>La bellezza, dicevano, è negli occhi di chi guarda. Ma oggi quegli occhi sono digitali e imparano in fretta!</p>



<p>Sexy secondo algoritmo è un viaggio nell’intelligenza artificiale e bellezza, fatto di prompt, reti neurali e desideri che non sappiamo più distinguere dalla realtà.</p>



<p>E tu? Pensi davvero che la bellezza sia soggettiva? Oppure l&#8217;intelligenza artificiale ha svelato qualcosa che non vogliamo ammettere?</p>



<p>Perché questa donna non esiste, ma ci seduce comunque.</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/sexy-secondo-algoritmo-la-nuova-estetica-creata-da-chi-ci-osserva/">Sexy secondo algoritmo: la nuova estetica creata da chi ci osserva</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>L&#8217;AI che sa tutto di te</title>
		<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/lai-che-sa-tutto-di-te/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Fri, 30 May 2025 17:29:36 +0000</pubDate>
				<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[AI generativa]]></category>
		<category><![CDATA[analisi comportamentale]]></category>
		<category><![CDATA[analisi profilo]]></category>
		<category><![CDATA[analisi SWOT]]></category>
		<category><![CDATA[autoanalisi]]></category>
		<category><![CDATA[carriera]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[deep search]]></category>
		<category><![CDATA[enneatipo]]></category>
		<category><![CDATA[futuro del lavoro]]></category>
		<category><![CDATA[GPT-4]]></category>
		<category><![CDATA[intelligenza artificiale]]></category>
		<category><![CDATA[investigazione AI]]></category>
		<category><![CDATA[MBTI]]></category>
		<category><![CDATA[openAI]]></category>
		<category><![CDATA[profiling AI]]></category>
		<category><![CDATA[prompt engineering]]></category>
		<category><![CDATA[reputazione online]]></category>
		<category><![CDATA[ricerca automatizzata]]></category>
		<category><![CDATA[scouting commerciale]]></category>
		<category><![CDATA[selezione personale]]></category>
		<category><![CDATA[strumenti HR]]></category>
		<category><![CDATA[strumenti per recruiter]]></category>
		<category><![CDATA[valutazione candidati]]></category>
		<guid isPermaLink="false">https://renor.it/?p=703</guid>

					<description><![CDATA[<p>Oggi scopriamo come l&#8217;intelligenza artificiale possa restituire, tramite una &#8220;Deep Search&#8221;, in pochi minuti, una panoramica completa, ordinata e professionale su chiunque: competenze, carriera, presenza online, punti di forza e criticità, in modo automatizzato e senza dover perdere ore in ricerche manuali. Introduzione Fino a ieri, per ottenere un profilo dettagliato su una persona, che [&#8230;]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/lai-che-sa-tutto-di-te/">L&#8217;AI che sa tutto di te</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Oggi scopriamo come l&#8217;intelligenza artificiale possa restituire, tramite una &#8220;Deep Search&#8221;, in pochi minuti, una panoramica completa, ordinata e professionale su chiunque: competenze, carriera, presenza online, punti di forza e criticità, in modo automatizzato e senza dover perdere ore in ricerche manuali. </p>



<h2 class="wp-block-heading">Introduzione</h2>



<p>Fino a ieri, per ottenere un profilo dettagliato su una persona, che si trattasse di un potenziale partner, un candidato, un investitore o un competitor, dovevi svolgere ricerche che potevano richiedere ore tra LinkedIn, Google, articoli, Curriculum, social network, database aziendali, ecc. Oggi, grazie all&#8217;Intelligenza Artificiale Generativa e in particolare alla funzione &#8220;Deep Search&#8221; presente su ChatGPT e altri brand, è possibile automatizzare questo processo in modo sorprendentemente efficace. </p>



<p>Questo articolo ti spiega passo dopo passo come funziona questa tecnologia, quali vantaggi offre rispetto alle ricerche tradizionali, quali accortezze adottare per ottenere risultati utili e come integrarla nei propri flussi di lavoro che attualmente (maggio 2025) non possono essere automatizzati.</p>



<h2 class="wp-block-heading">Cos&#8217;è Deep Search</h2>



<p>Deep Search è un insieme di tecniche di prompt engineering e contestualizzazione che permettono di ottenere da ChatGPT un&#8217;analisi dettagliata e multidimensionale su un soggetto (persona, azienda, o qualsiasi altra chiave di ricerca), generando una risposta strutturata che include, nel caso di persone ad esempio, aspetti biografici, comportamentali, psicologici, professionali e comunicativi. </p>



<p>Ad esempio a partire da un prompt tipo: </p>



<p><em>&#8220;Analizza Mario Rossi (mariorossi.com)&#8221;</em></p>



<p>Può restituire: una sintesi del profilo professionale, i punti di forza e di debolezza, il tipo MBTI (Myers-Briggs), l&#8217;enneatipo psicologico, lo stile decisionale, un&#8217;analisi SWOT, il tono comunicativo prevalente, un pitch da presentare a investitori, una stima della reputazione online percepita. </p>



<p>Tutto ciò viene generato in base a informazioni note nella base di dati del modello, inferenze basate su pattern di comportamento comuni e coerenza interna con il prompt iniziale. </p>



<p>È evidente che un&#8217;analisi di questo tipo risulti possibile soltanto laddove esista materiale reperibile online da cui l&#8217;intelligenza artificiale possa attingere informazioni. In ogni caso, tale attività non costituisce una violazione della privacy della persona, proprio perché si fonda esclusivamente si dati di dominio pubblico già disponibili in rete. </p>



<h3 class="wp-block-heading">Differenza tra prompt semplice e Deep Search contestuale</h3>



<p>Nel mondo dell&#8217;intelligenza artificiale generativa, non tutti i prompt sono uguali. Un prompt semplice è una richiesta diretta, spesso formulata in una sola frase, che restituisce una risposta istantanea ma generalmente superficiale. Al contrario, il <strong>Deep Search contestuale</strong> rappresenta un approccio molto più raffinato e potente: si basa su una conversazione guidata, stratificata, in cui l&#8217;utente costruisce il contesto pezzo dopo pezzo, orientando l&#8217;AI verso un&#8217;analisi profonda e coerente. È come la differenza tra chiedere &#8220;Chi è Mario Rossi?&#8221; e domandare &#8220;Costruisci un profilo professionale e psicologico di Mario Rossi, CEO nel settore fintech, analizzandone punti di forza, debolezze, stile decisionale e impatto comunicativo&#8221;. La seconda modalità, attivabile comunque selezionando l&#8217;apposito switch, è detta appunto Deep Search, e non si limita a elencare fatti, ma interpreta, connette e deduce, offrendo una sintesi complessa che unisce biografia, attitudini e potenziale evolutivo. È la forma più vicina a un&#8217;intervista immaginaria condotta con metodo e intelligenza. </p>



<h3 class="wp-block-heading">Il concetto di inferenza a partire da parziali</h3>



<p>Uno degli aspetti più affascinanti dell&#8217;intelligenza artificiale di ultima generazione è la sua capacità di inferire informazioni complesse anche a partire da dati minimi o incompleti. Questo processo, noto come <strong>inferenza da dati parziali</strong>, si fonda sull&#8217;abilità del modello di riconoscere pattern ricorrenti all&#8217;interno di vasti insiemi di conoscenze già acquisite durante l&#8217;addestramento. In altre parole, l&#8217;AI non ha bisogno di sapere &#8220;tutto&#8221; per ricostruire un quadro verosimile: bastano pochi indizi, un nome, un ruolo, una società, per attivare un meccanismo deduttivo capace di generare una rappresentazione coerente e strutturata della persona o del contesto in esame. Non si tratta di fantasia, ma di plausibilità costruita su logiche statistiche e relazioni probabilistiche tra elementi di informazione. </p>



<p>Questo rende l&#8217;intelligenza artificiale non solo uno strumento consultivo, ma un sintetizzatore cognitivo che è in grado di simulare una conoscenza approfondita anche quando il punto di partenza è estremamente frammentario. </p>



<h3 class="wp-block-heading">Come ChatGPT combina fonti note, pattern e logica deduttiva</h3>



<p>Cominciamo col dire che a differenza dei prompt tradizionali che si basano unicamente sulle informazioni memorizzate nel modello, la funzione Deep Search di ChatGPT sfrutta un componente aggiuntivo estremamente potente: la navigazione in tempo reale su internet. Quando si attiva il Deep Search, l&#8217;AI accede direttamente al web attraverso Bing, cercando fonti aggiornate e pertinenti per costruire una risposta fondata non solo su interenze statistiche, ma anche su dati attuali, dichiarazioni ufficiali, profili social, articoli di stampa e fonti autorevoli. Questo le permette di aggiornare e ragginare continuamente il profilo analizzato, incorciando fonti note, pattern ricorrenti e logica deduttiva. Il risultato è una rappresentazione profondamente contestualizzata, che unisce l&#8217;immediatezza dell&#8217;intelligenza generativa con la precisione della ricerca documentale su web, mantenendo un equilibri tra deduzione e verifica. È questa sinergia tra AI e Web Crawling intelligente che rende il Deep Search uno strumento senza precedenti per ottenere informazioni strategiche su persone, aziende o fenomeni in tempo reale. </p>



<h2 class="wp-block-heading">In quali contesti può tornare utile fare un Profilo AI</h2>



<p>L&#8217;intelligenza Artificiale non ha sentimenti e si limita a fornire analisi oggettive rispetto alle informazioni che trova online. Tra i contesti in cui può tornare utile troviamo: </p>



<h3 class="wp-block-heading">Quando la usiamo a livello personale</h3>



<p>L&#8217;analisi tramite Deep Search può rivelarsi estremamente preziosa a livello personale. Chiedere all&#8217;intelligenza artificiale una valutazione netrua e contestualizzata del proprio profilo, permette di osservare sé stessi con uno sguoardo esterno, asettico e senza emotività alcuna. Questo tipo di autoriflessione assistita può aiutare a mettere in luce punti di forza spesso sottovalutati, ma soprattutto a identificare con chiarezza le aree di miglioramento, gli atteggiamenti disfunzionali o i limiti comportamentali che ostacolano la crescita personale o professionale. È come tenere uno specchio davanti alla propria figura, ma con l&#8217;obiettività analitica di uno strumento che non giudica: osserva, elabora e propone spunti costruttivi. </p>



<p>Certamente bisogna essere pronti a ricevere anche delle critiche, che potrebbero mettere in luce aspetti poco valorizzati o addirittura fragilità che si tende a ignorare.  In buona sostanza bisogna pensare che un&#8217;analisi condotta da un sistema che non è influenzato da affetti non restituisce un giudizio, ma un qualcosa che può tornarci utile per evolvere. Serve lucidità, apertura mentale e senso di autocritica.</p>



<h3 class="wp-block-heading">Quando la usiamo nella fase intermedia di colloqui di lavoro</h3>



<p>Nel processo di selezione per ruoli ingegneristici, dove il recruiting si articola in più fasi, l&#8217;introduzione del Deep Search può rappresentare un valido supporto nella fase intermedia del percorso. Dopo l&#8217;analisi curriculare e il primo colloquio conoscitivo, e prima del colloquio tecnico è possibile inserire una fase di analisi approfondita tramite intelligenza artificiale. In questo momento il recruiter può fornire a ChatGPT le informazioni già emerse durante il colloquio (come risposte fornite, atteggiamenti osservati, impressioni preliminari), arricchendole con una ricerca aggiornata sul web. Il modello è così in grado di restituire una valutazione neutra, contestuale e ragionata del candidato, evidenziandone la coerenza tra immagine online e comunicazione personale, le competenze trasversali potenzialmente non dichiarate, lo stile relazionale e la compatibilità culturale con l&#8217;azienda. Questo approccio non sostituisce il giudizio umano, ma lo affianca con una lente analitica oggettiva, utile per prendere decisioni più informate e complete. </p>



<h3 class="wp-block-heading">Quando la vogliamo usare per applicazioni in ambito investigativo, legale o accademico</h3>



<p>Oltre all&#8217;utilizzo in ambito personale, HR e commerciale, la funzione di Deep Search trova applicazioni interessanti anche in contesti investigativi, legali e accademici. Nel settore investigativo, può essere impiegata per costruire profili preliminari su soggetti di interesse, ricostruendo connessioni, attività pregresse, tracce digitali e comportamenti pubblicamente documentati, il tutto senza accedere ad archivi riservati o violare la privacy. In ambito legale, può supportare gli avvocati o i consulenti tecnici nella raccolta contestuale di informazioni pubbliche su controparti, testimoni, esperti o aziende coinvolte in procedimenti, fornendo un quadro sintetico ma strutturato che agevola l&#8217;impostazione delle controparti, testimoni, esperti o aziende coinvolte in procedimenti, fornendo un quadro sintetico ma strutturato che agevola l&#8217;impostazione delle strategie difensive o negoziali. Sul versante accademico, invece, il Deep Search si rivela utile per analizzare rapidamente il profilo di autori, studiosi o ricercatori, generare panoramiche bibliografiche di base o confrontare approcci teorici tra scuole di pensiero. Naturalmente in tutti questi casi è fondamentale ricordare che l&#8217;AI si limita a rielaborare informazioni pubblicamente accessibili, restituendo interpretazioni plausibili e ordinate, ma non certificazioni né prove giuridicamente valide. È uno strumento di supporto e orientamento, non un sostituto delle fonti ufficiali. </p>



<h2 class="wp-block-heading">Posso chiedere altro?</h2>



<p>Certamente si, una volta effettuata la ricerca è possibile richiedere qualsiasi altro tipo di informazione deducibile dalla ricerca profonda effettuata. </p>



<p>Ad esempio: <em>&#8220;Forniscimi un&#8217;analisi SWOT di Mario rossi&#8221;</em>. </p>



<p>Il modello elaborerà quindi punti di forza, debolezza, opportunità e minacce, in relazione al contesto professionale, alla posizione attuale e alle competenze dichiarate o dedotte. Ma non ci si ferma qui: si può proseguire chiedendo una valutazione del tipo di leadership, una simulazione di colloquio comportamentale, un pitch da presentare a potenziali investitori, oppure un&#8217;analisi di compatibilità culturale con una determinata azienda. </p>



<p>Questo rende il Deep Search non un semplice strumento informativo, ma un ambiente di dialogo strategico, dove ogni informazione diventa il punto di partenza per una nuova inferenza, una nuova visione, un nuovo scenario di utilizzo, completamente personalizzabile in base agli obiettivi di chi lo utilizza. </p>



<h2 class="wp-block-heading">Conclusioni</h2>



<p>L&#8217;introduzione del Deep Search nelle interazioni con l&#8217;AI rappresenta un salto di qualità nell&#8217;uso quotidiano dei modelli generativi. Non si tratta più di semplici risposte a domande puntuali, ma di vere e proprie analisi strutturate, condate su un mix di ricerca web in tempo reale, inferenza deduttiva e modellazione cognitiva. Che si tratti di selezione del personale, scouting commerciale, indagini conoscitive, autoanalisi o supporto accademico, Deep Search consente di accorciare i tempi, aumentare la profondità e ampliare la prospettiva con cui si osservano individui e contesti. Come ogni strumento potente, richiede un uso consapevole, responsabile e integrato nel quadro etico e normativo vigente. Ma per chi sa porre le domande giuste e ha il coraggio di ascoltare anche le risposte più scomode, l&#8217;AI può diventare un alleato straordinario nella comprensione del mondo e di sé stessi.</p>



<p>[starbox]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/lai-che-sa-tutto-di-te/">L&#8217;AI che sa tutto di te</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI, CV e Spettroscopia per la Gestione dei rifiuti – Parte 2</title>
		<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-cv-e-spettroscopia-per-la-gestione-dei-rifiuti-parte-2/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Mon, 19 May 2025 11:46:08 +0000</pubDate>
				<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[automazione]]></category>
		<category><![CDATA[braccio robotico]]></category>
		<category><![CDATA[elettronica]]></category>
		<category><![CDATA[innovazione]]></category>
		<category><![CDATA[meccatronica]]></category>
		<category><![CDATA[open-source]]></category>
		<category><![CDATA[prototipazione]]></category>
		<category><![CDATA[raccolta differenziata]]></category>
		<category><![CDATA[riciclo intelligente]]></category>
		<category><![CDATA[sostenibilità]]></category>
		<category><![CDATA[spettroscopia Raman]]></category>
		<category><![CDATA[tecnologia]]></category>
		<category><![CDATA[visione artificiale]]></category>
		<guid isPermaLink="false">https://renor.it/?p=526</guid>

					<description><![CDATA[<p>Automatizzare la raccolta differenziata: dalla teoria alla pratica con la meccatronica Nel precedente articolo ci eravamo lasciati con uno schema realistico della logica applicativa per la suddivisione automatizzata dei rifiuti. Ora è arrivato il momento di iniziare a capire concretamente come questo sistema possa diventare automatizzato. Entriamo quindi nell&#8217;affascinante mondo della meccatronica e della robotica. [&#8230;]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-cv-e-spettroscopia-per-la-gestione-dei-rifiuti-parte-2/">AI, CV e Spettroscopia per la Gestione dei rifiuti – Parte 2</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Automatizzare la raccolta differenziata: dalla teoria alla pratica con la meccatronica</h2>



<p>Nel precedente articolo ci eravamo lasciati con uno schema realistico della logica applicativa per la suddivisione automatizzata dei rifiuti. Ora è arrivato il momento di iniziare a capire concretamente come questo sistema possa diventare automatizzato. Entriamo quindi nell&#8217;affascinante mondo della meccatronica e della robotica.</p>



<p>Per risparmiare tempo nella divisione manuale dei rifiuti, immagino per prima cosa un contenitore in cui poter gettare liberamente i vari scarti. Da qui, ogni rifiuto dovrà essere trasferito automaticamente nella camera dove avverrà l&#8217;analisi mediante spettroscopia Raman.</p>



<p>Le soluzioni per trasportare i rifiuti possono essere diverse e qui si apre una scelta cruciale per il progetto: vogliamo puntare su un compromesso pratico o desideriamo poter gestire ogni singolo tipo di rifiuto con precisione assoluta? Se scegliamo la strada più semplice e accettiamo dei compromessi, ad esempio limitandoci a contenitori rigidi come cartoni e bottiglie, potrebbe bastare solamente un nastro trasportatore dotato di palette.</p>



<p>Se invece optiamo per una soluzione più versatile, che ci permetta di identificare e gestire qualsiasi oggetto indipendentemente dalla sua forma o dimensione, allora sarà necessario implementare un braccio robotico dotato di visione artificiale, in grado di riconoscere e selezionare ciascun elemento prima di posizionarlo sul nastro trasportatore.</p>



<p>Per questo progetto, anche al fine di creare un prodotto veramente eco-friendly, scegliamo proprio quest&#8217;ultima soluzione, decidendo però di escludere la gestione dell&#8217;umido, così da evitare ulteriori complicazioni tecniche come il lavaggio continuo del nastro trasportatore che richiederebbe anche l&#8217;accortezza di progettare l&#8217;elettronica con un indice di protezione da agenti atmosferici almeno IP65.</p>



<h2 class="wp-block-heading">Meccanica del dispositivo</h2>



<p>Immaginiamo di avere un secchio iniziale contenente diversi tipi di rifiuti. Un braccio robotico, equipaggiato con una telecamera, analizza visivamente i rifiuti, li identifica, li afferra e li colloca su un nastro trasportatore. Questo nastro trasporta ciascun oggetto all&#8217;interno di una camera oscura dove è posizionato il nostro spettroscopio Raman. Lo spettroscopio identifica il materiale e, in base al risultato ottenuto, attiva un selettore di percorso: la plastica finirà nel mastello della plastica, il vetro e il metallo nel rispettivo contenitore e la carta nel mastello dedicato alla carta.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://renor.it/wp-content/uploads/2025/05/schema3-1024x683.webp" alt="" class="wp-image-528"/></figure>



<h2 class="wp-block-heading">Una breve nota personale</h2>



<p>Quando ho iniziato a descrivere questo progetto, sembrava relativamente semplice e lineare. Tuttavia dopo un&#8217;attenta riflessione, si è rivelato tutt&#8217;altro che banale. È affascinante notare come un compito che nella vita quotidiana appare così immediato e semplice, richieda invece una combinazione complessa di conoscenze tecniche.</p>



<p>In questo percorso capiremo insieme come gestire queste sfide e trasformare un&#8217;idea iniziale in un prodotto finale realmente funzionante e utile, open-source e che tutti possono autonomamente costruire a patto di avere i macchinari necessari alla creazione delle parti che serviranno a dar vita al prodotto. </p>



<p>Nel prossimo articolo tratteremo la progettazione e la stampa 3D dei vari componenti che andranno a comporre il nostro elemento di trasporto.</p>



<p>[starbox]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-cv-e-spettroscopia-per-la-gestione-dei-rifiuti-parte-2/">AI, CV e Spettroscopia per la Gestione dei rifiuti – Parte 2</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI, CV e Spettroscopia per la Gestione dei rifiuti &#8211; Parte 1</title>
		<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-cv-e-spettroscopia-per-la-gestione-dei-rifiuti-parte-1/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Mon, 19 May 2025 10:03:42 +0000</pubDate>
				<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[automazione]]></category>
		<category><![CDATA[computer vision]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Google Cloud Vision]]></category>
		<category><![CDATA[innovazione]]></category>
		<category><![CDATA[intelligenza artificiale]]></category>
		<category><![CDATA[materiali]]></category>
		<category><![CDATA[meccatronica]]></category>
		<category><![CDATA[modellazione 3D]]></category>
		<category><![CDATA[OCR]]></category>
		<category><![CDATA[progetto open-source]]></category>
		<category><![CDATA[prototipazione]]></category>
		<category><![CDATA[raccolta differenziata]]></category>
		<category><![CDATA[Reti neurali]]></category>
		<category><![CDATA[riciclo intelligente]]></category>
		<category><![CDATA[sostenibilità ambientale]]></category>
		<category><![CDATA[spettroscopia Raman]]></category>
		<category><![CDATA[stampa 3D]]></category>
		<category><![CDATA[tecnologia]]></category>
		<guid isPermaLink="false">https://renor.it/?p=514</guid>

					<description><![CDATA[<p>Anche voi trovate noiosa la raccolta differenziata? Scommetto che è capitato anche a voi: dopo una cena tra amici o un pranzo in famiglia, arriva il momento di sistemare tutto, e improvvisamente la raccolta differenziata è lì che ti attende facendoti perdere tempo. Carta da una parte, plastica dall&#8217;altra, vetro e metallo in un altro [&#8230;]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-cv-e-spettroscopia-per-la-gestione-dei-rifiuti-parte-1/">AI, CV e Spettroscopia per la Gestione dei rifiuti &#8211; Parte 1</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Anche voi trovate noiosa la raccolta differenziata?</h2>



<p>Scommetto che è capitato anche a voi: dopo una cena tra amici o un pranzo in famiglia, arriva il momento di sistemare tutto, e improvvisamente la raccolta differenziata è lì che ti attende facendoti perdere tempo. Carta da una parte, plastica dall&#8217;altra, vetro e metallo in un altro mastello, umido in quello più piccolo&#8230; Un compito che diventa spesso noioso specialmente quando il volume dei rifiuti da dividere cresce notevolmente.</p>



<p>Da qui la domanda&#8230; Esiste un modo per rendere tutto questo più semplice, veloce e addirittura automatico? La tecnologia oggi può darci una mano concreta per gestire meglio questa attività quotidiana facendoci risparmiare tempo e fatica?</p>



<h2 class="wp-block-heading">Come nasce un progetto tecnologico: dall&#8217;idea al prodotto finale</h2>



<p>In questo periodo, con la grande mole di lavoro che mi ritrovo a gestire, sarà difficile trovare abbastanza tempo da dedicare a questo progetto. Tuttavia, ho deciso che sfrutterò quei pochi momenti liberi che mi restano la sera dopo cena per portarlo avanti e condividerlo con voi passo dopo passo. </p>



<p>Al di là dell&#8217;utilità intrinseca di questo progetto, ciò che maggiormente mi interessa, è mostrarvi come, partendo da un&#8217;idea iniziale, si arrivi concretamente al prodotto finale. Voglio farvi vedere quali sono le fasi coinvolte nella realizzazione di un progetto che a parole può apparire semplice a prima vista, ma che in realtà è estremamente complesso, perché richiede competenze trasversali ben oltre il semplice sviluppo di codice. </p>



<p>Per completare questo lavoro, infatti, è necessario avere conoscenze approfondite in diversi ambiti: dalla modellazione 3D alla stampa 3D, dalla prototipazione all&#8217;elettronica, fino a competenze in fisica, matematica e soprattutto intelligenza artificiale. </p>



<p>In questo articolo (e in quelli che seguiranno) cercherò di guidarvi lungo tutto questo percorso, condividendo con voi le sfide, gli ostacoli e le soluzioni che incontrerò strada facendo. Sarà un modo interessante per scoprire insieme come un&#8217;idea innovativa possa trasformarsi in qualcosa di realmente funzionante e la condivideremo con un progetto open-source sul mio canale GitHub. </p>



<h2 class="wp-block-heading">Valutiamo le prime criticità</h2>



<p>Tutti noi facciamo affidamento sui nostri sensi per esplorare e interpretare ciò che ci circonda. Quando riceviamo un oggetto tra le mani, possiamo osservarlo, toccarlo, annusarlo o perfino colpirlo leggermente per ascoltare il suono che produce. A volte arriviamo persino ad assaggiarlo per coglierne il sapore. Possiamo vedere i nostri sensi come le porte che ci permettono di relazionarci con il mondo. </p>



<p>Immaginate di ricevere una bottiglia: vi basterà guardarla o tutt&#8217;al più stringerla tra le mani per capire immediatamente se è fatta di vetro o di plastica. Se invece vi dessero un barattolo di pelati, probabilmente notereste il caratteristico colore ferroso, comprendendo così che è realizzato in metallo e se così non fosse potreste stringerla per verificare che resti deformata, perché sapete che il metallo se compresso resta deformato a differenza della plastica che entro certi limiti torna nella sua posizione iniziale. </p>



<p>Tutto questo è possibile grazie all&#8217;esperienza cognitiva che abbiamo maturato nel corso della nostra vita. </p>



<p>Ma nel caso di una macchina&#8230; Come possiamo trasferire questa capacità di comprensione a una macchina? In che modo può imparare a identificare il materiale di cui è fatto un oggetto?</p>



<h2 class="wp-block-heading">Emuliamo i sensi</h2>



<p>Ci sono diversi approcci&#8230;</p>



<p>Uno dei più affascinanti è quello basato sulla Computer Vision, una tecnologia che emula il senso della vista umano.</p>



<p>Questo approccio consiste nell&#8217;utilizzare particolari reti neurali artificiali che vengono addestrate a riconoscere vari oggetti, materiali e forme. È esattamente lo stesso principio che permette, ad esempio alle moderne automobili a guida autonoma (senza citare marche famose) di spostarsi con sicurezza sulle nostre strade. </p>



<p>Queste vetture sono dotate di telecamere che analizzano continuamente, centinaia di volte al secondo, tutto ciò che le circonda: strade, segnali stradali, pedoni, altre automobili e potenziali ostacoli. La rete neurale, addestrata accuratamente per mesi o anni, permette al veicolo di identificare ogni oggetto e reagire correttamente: mantenersi all&#8217;interno della corsia di marcia, rispettare scrupolosamente i segnali stradali, gli stop, le precedenze, evitare collisioni e calcolare la più sicura via di fuga in caso di pericolo. </p>



<h2 class="wp-block-heading">Il primo ostacolo: non tutte le reti neurali sono facili da addestrare</h2>



<p>Se avete seguito fin qui il discorso, vi sarete sicuramente accorti di un dettaglio importante: poco fa abbiamo parlato di reti neurali addestrate per mesi, se non anni. E qui nasce il primo vero problema del nostro progetto. </p>



<p>La questione infatti non è affatto semplice. Non dobbiamo insegnare a una macchina a riconoscere un pedone, cioè qualcosa che ha una testa, due braccia e due gambe. Qui dobbiamo istruire una rete neurale a capire esattamente di che materiale è fatto un rifiuto. E la difficoltà aumenta se pensiamo che lo stesso prodotto, come ad esempio il latte, può essere confezionato in una bottiglia di plastica per una certa marca, in una bottiglia di vetro per un&#8217;altra, oppure in un Tetra Pak per un terza marca ancora. </p>



<p>Se volessimo addestrare una rete neurale a riconoscere con precisione tutti i materiali di confezionamento per ogni singolo alimento presente sul mercato, significherebbe raccogliere e catalogare decine di migliaia, se non centinaia di migliaia di campioni diversi. Occorrerebbe infatti passare in rassegna per più volte ciascuna marca e ciascuna variante di prodotto, generando enormi quantità di dati di addestramento. </p>



<p>È evidente che questa strada non è percorribile in modo pratico e sostenibile. Dobbiamo quindi cercare una soluzione più intelligente, flessibile e scalabile. Una soluzione che consenta alla rete neurale di &#8220;generalizzare&#8221; tutto ciò che può essere generalizzato, riconoscendo materiali e oggetti sulla base di caratteristiche generali piuttosto che specifiche per ciascun prodotto. </p>



<h2 class="wp-block-heading">Alcune idee di rinforzo</h2>



<p>Sebbene sia difficile per alcuni tipi di rifiuti procedere con l&#8217;addestramento di una rete neurale, possiamo comunque sottoporre l&#8217;immagine del rifiuto ad una rete neurale già addestrata. Google Cloud Vision ad esempio permette l&#8217;analisi delle immagini e nei casi in cui il materiale è visibilmente molto riconoscibile, può assegnare etichette generiche come: </p>



<ul class="wp-block-list">
<li>plastic</li>



<li>glass</li>



<li>metal</li>



<li>carboard</li>



<li>paper</li>
</ul>



<p>Il problema è che non è affidabile al 100%, non distingue varianti specifiche (Es. Tetra Pak vs. cartone semplice). Non legge materiali dalla texture o dal suono (cosa che farebbe un essere umano manipolando il prodotto).</p>



<p>C&#8217;è però una soluzione alternativa realistica. Un approccio più affidabile potrebbe essere quello di utilizzare Cloud Vision OCR per leggere il testo sull&#8217;etichetta del prodotto per poi cercare online le informazioni sul materiale (Bottiglia in PET, Packaging in Tetra Pak). </p>



<h2 class="wp-block-heading">Cominciamo a schematizzare</h2>



<p>Per evitare il rischio di dimenticare alcune cose cominciamo a buttar giù una mappa delle idee ed uno schema funzionale in modo da poterlo modificare man mano che andiamo avanti nel progetto. </p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://renor.it/wp-content/uploads/2025/05/Sistema-di-gestione-rifiuti-1024x314.webp" alt="" class="wp-image-515"/></figure>



<figure class="wp-block-image size-full ticss-a21b03e6"><img loading="lazy" decoding="async" width="431" height="752" src="https://renor.it/wp-content/uploads/2025/05/Sistema-divisione-rifiuti-1-1.webp" alt="" class="wp-image-518" style="object-fit:cover" srcset="https://renor.it/wp-content/uploads/2025/05/Sistema-divisione-rifiuti-1-1.webp 431w, https://renor.it/wp-content/uploads/2025/05/Sistema-divisione-rifiuti-1-1-172x300.webp 172w" sizes="auto, (max-width: 431px) 100vw, 431px" /></figure>



<h2 class="wp-block-heading">Se questa soluzione non restituisce un risultato sicuro?</h2>



<p>È possibile che nonostante tutti gli sforzi non venga comunque restituito un risultato sicuro e definitivo. Come ci comportiamo?</p>



<ol class="wp-block-list">
<li>Possiamo mettere il prodotto in uno stato di verifica manuale (soluzione che non mi piace particolarmente)</li>



<li>Possiamo classificare il rifiuto come indifferenziato (anche questa soluzione non è particolarmente eco-friendly)</li>



<li>Possiamo cercare altri modi per comprendere il materiale del prodotto.</li>
</ol>



<p>Concentriamoci sulla terza soluzione.</p>



<h2 class="wp-block-heading">Quali altre possibilità ci sono per identificare un materiale?</h2>



<p>Un sistema sicuro, veloce e in tempo reale per identificare un materiale è certamente la spettroscopia, in particolare lo spettroscopio Raman. Questa rappresenta una delle tecniche più affidabili e precise per identificare il materiale, in particolare la composizione chimica di un oggetto, anche in forma solida, liquida o polimerica. </p>



<p>La spettroscopia Raman si basa sull&#8217;interazione di una luce laser con una particolare frequenza, con le vibrazioni molecolari del materiale. Quando il laser colpisce un campione, una piccola parte della luce viene diffusa in modo anomalo (effetto Raman), e questo spettro diffuso è caratteristico della struttura molecolare del materiale. </p>



<h2 class="wp-block-heading">Cosa può identificare uno spettroscopio Raman?</h2>



<p>Può identificare con successo Plastica, Vetro, Carta, Composti organici e inorganici e addirittura il Tetra Pak. Non può però identificare i metalli perché i metalli riflettono la luce e non hanno pertanto segnali Raman. Questo può non essere un problema perché per esclusione, se un materiale non è tra quelli elencati è sicuramente in metallo. </p>



<p>Ci sono però delle difficoltà anche qui&#8230; Uno spettroscopio Raman può costare, a seconda della qualità, da qualche migliaio di euro a decine di migliaia di euro. A questo però c&#8217;è una soluzione&#8230; Costruirci un nostro spettroscopio di Raman. Vedremo questa parte in seguito in una serie di articoli dedicati. </p>



<p>Aggiorniamo pertanto i nostri schemi&#8230;</p>



<figure class="wp-block-image size-full ticss-a21f80fc"><img loading="lazy" decoding="async" width="465" height="479" src="https://renor.it/wp-content/uploads/2025/05/Sistema-divisione-rifiuti-2.webp" alt="" class="wp-image-521" srcset="https://renor.it/wp-content/uploads/2025/05/Sistema-divisione-rifiuti-2.webp 465w, https://renor.it/wp-content/uploads/2025/05/Sistema-divisione-rifiuti-2-291x300.webp 291w" sizes="auto, (max-width: 465px) 100vw, 465px" /></figure>



<p>Sembrerebbe che in questo modo abbiamo correttamente gestito la logica applicativa del sistema. Abbiamo compreso per sommi capi come dobbiamo muoverci.  </p>



<p>C&#8217;è ora tutta la parte di trasporto e divisione dei rifiuti che andremo a trattare nel prossimo articolo.</p>



<p>[starbox]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-cv-e-spettroscopia-per-la-gestione-dei-rifiuti-parte-1/">AI, CV e Spettroscopia per la Gestione dei rifiuti &#8211; Parte 1</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Reti neurali in PHP? Si può fare!</title>
		<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/reti-neurali-in-php-si-puo-fare/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Sun, 18 May 2025 12:23:19 +0000</pubDate>
				<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[AI in PHP]]></category>
		<category><![CDATA[back-propagation]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[esempio XOR]]></category>
		<category><![CDATA[funzione sigmoide]]></category>
		<category><![CDATA[inizializzazione Xavier]]></category>
		<category><![CDATA[intelligenza artificiale]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[microservizi]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programmazione backend]]></category>
		<category><![CDATA[REST API]]></category>
		<category><![CDATA[rete feed-forward]]></category>
		<category><![CDATA[Reti neurali]]></category>
		<category><![CDATA[serializzazione modelli]]></category>
		<guid isPermaLink="false">https://renor.it/?p=502</guid>

					<description><![CDATA[<p>Inizio questo articolo facendo una premessa&#8230; PHP non è certamente il linguaggio ideale quando si parla di Intelligenza artificiale. Le reti neurali sono solitamente appannaggio di più scientifici come Python, che offre librerie ottimizzate a questo scopo come PyTorch e NumPy, ed è questo solitamente il linguaggio che utilizzo per lavorare in contesti di questo [&#8230;]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/reti-neurali-in-php-si-puo-fare/">Reti neurali in PHP? Si può fare!</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Inizio questo articolo facendo una premessa&#8230; PHP non è certamente il linguaggio ideale quando si parla di Intelligenza artificiale. Le reti neurali sono solitamente appannaggio di più scientifici come Python, che offre librerie ottimizzate a questo scopo come PyTorch e NumPy, ed è questo solitamente il linguaggio che utilizzo per lavorare in contesti di questo genere. </p>



<p>Tuttavia qualche mese fa parlavo con un amico davanti ad uno spritz e abbiamo cominciato, come al solito, a dire una serie di sciocchezze parlando di AI (vi risparmio le idee malsane che ci sono uscite), ma ci siamo poi concentrati su un tema: &#8220;Sarebbe possibile creare una rete neurale in PHP?&#8221; La risposta breve è sì, seppur con delle limitazioni. </p>



<p>Per comprendere questo articolo bisogno prima fare qualche premessa&#8230;</p>



<h2 class="wp-block-heading">Introduzione</h2>



<p>Nel panorama tecnologico odierno l&#8217;Intelligenza Artificiale (IA in italiano o AI in inglese), non è più un argomento di nicchia, ma un pilastro strategico per quasi qualsiasi tipo di azienda che vogli estrarre valore dai propri dati, ottimizzare processi e offrire prodotti realmente competitivi. In ambito HR &amp; Workforce management, per esempio, i modelli predittivi permettono di anticipare assenza improvvise, calibrarie i turni in modo dinamico e, per ultimo, risparmiare tempo e risorse: esattamnete il binomio &#8220;velocità/qualità&#8221; di cui avevamo discusso in questo articolo: <a href="https://renor.it/velocita-e-qualita-nei-progetti/">https://renor.it/velocita-e-qualita-nei-progetti/</a>.<br>Ma chi di voi sa veramente cosa sia l&#8217;intelligenza artificiale?</p>



<h2 class="wp-block-heading">AI &#8211; Questa blasonata sconosciuta</h2>



<p>Con il termine Intelligenza Artificiale si indica l&#8217;insieme di tecniche che permettono ad un sistema informatico di mostrare capacità normalmente attribuite all&#8217;intelligenza umana: ragionare, apprendere, prendere delle decisioni, riconoscere pattern complessi. All&#8217;interno di questo grande contenitore, il Machine Learning rappresenta l&#8217;approccio in cui l&#8217;apprendimento avviene attraverso l&#8217;analisi statistica dei dati, senza che tutte le regole sia codificate manualmente. Negli ultimi anni, l&#8217;affermazione del Deep Learning ha dato un&#8217;ulteriore spinta evolutiva: reti neurali molto profonde, formate da decine o centinaia di livelli di elaborazione, riescono a cogliere strutture nei dati che sfuggono ai modelli più tradizionali.</p>



<h2 class="wp-block-heading">A cosa servono le reti neurali?</h2>



<p>Una rete neurale artificiale è un modello matematico che si ispira alla struttura dei neuroni del nostro cervello. Del resto quasi tutte le scoperte umane si rifanno all&#8217;osservazione di ciò che esiste già in natura. <br>La struttura neurale del cervello permette di risolvere problemi dove la relazione tra input (ciò che percepiamo dall&#8217;esterno) e l&#8217;output (ciò che ne ricaviamo) è non lineare o di difficile formalizzazione. </p>



<p>Immaginiamo, ad esempio, di voler prevedere il rischio di ritardo di un dipendente in base a variabili come il traffico, le condizioni meteo, la cronologia personale di ritardi e assenze ed i programmi di trasporto pubblico. Il legame tra questi fattori è troppo complesso per essere descritto con poche istruzioni condizionali, ma una rete neurale ben addestrata può impararlo analizzando una grande quantità di esempi storici. </p>



<p>Il motivo di questa capacità risiede nel fatto che ogni connessione tra neuroni è associata ad un peso e ad un termine di bias. Capiremo poi cosa siano. </p>



<p>Durante la fase di addestramento la rete modifica questi parametri per minimizzare una funzione di errore che misura la discrepanza fra la sua previsione e il valore reale. Il procedimento di affinamento avviene attraverso l&#8217;algoritmo di back-propagation, responsabile del calcolo dei gradienti, e un metodo di ottimizzazione come la discesa del gradiente stocastico che aggiorna iterativamente i pesi. Alla fine del processo la rete non possiede una serie di regole scritte da chi l&#8217;ha programmata, ma una serie di coefficienti numerici che codificano in modo distribuito la conoscenza ricavata dai dati. </p>



<p>Ora che abbiamo un quadro generale possiamo capire i ruoli e le responsabilità di pesi e bias.</p>



<p>Il peso è il coefficiente numerico che modula l&#8217;intensità con cui un segnale in ingresso contribuisce all&#8217;attivazione del neurone successivo. Possiamo pensare che sia una manopola di un volume, aumentando il volume amplifichiamo il contributo di quella specifica caratteristica, mentre abbassando il volume la attenuiamo fino a poterne anche invertire il segno. Dal punto di vista matematico il peso moltiplica il valore dell&#8217;input e determina l&#8217;inclinazione della funzione che la rete sta apprendendo; un peso elevato indica che l&#8217;input in questione è fortemente correlato all&#8217;output, un peso prossimo allo zero lo rende praticamente irrilevante. </p>



<p>Il bias invece svolge il ruolo di traslatore sommandosi al prodotto tra input e peso, sposta il risultato complessivo verso l&#8217;alto o verso il basso prima che venga applicata la funzione di attivazione. Pertanto se i pesi, come abbiamo visto, rappresentano l&#8217;inclinazione di una retta, il bias ne rappresenta l&#8217;intercetta sull&#8217;ordinata, consentendo alla rete di modellare funzioni che non passano necessariamente per l&#8217;origine.  In pratica il bias permette al neurone di accendersi anche quando tutti gli input sono nulli, introducendo quella flessibilità che rende l&#8217;insieme dei modelli neurali un vero e proprio approssimatore. </p>



<p>Durante l&#8217;addestramento i pesi e i bias vengono aggiornati con l&#8217;algoritmo di back-propagation: il gradiente della funzione di errore indica in quale direzione e di quanto variare ciascun parametro per ridurre lo scarto tra la previsione della rete e il valore reale. Iterazione dopo iterazione, la rete regola questi due tipi di parametri in modo coordinato, affinando sia la pendenza sia la posizione delle sue curve decisionali, fino a catturare la complessità del fenomeno che vogliamo modellare. </p>



<p>In sintesi peso e bias sono i mattoni elementari dell&#8217;intelligenza adattiva della rete: il primo controllo l&#8217;importanza relativa degli input, il secondo offre la libertà di muoversi nello spazio delle soluzioni senza vincoli geometrici predefiniti.</p>



<h2 class="wp-block-heading">Perché vale la pena implementarla in PHP?</h2>



<p>Ci si potrebbe chiedere se abbia senso costruire una rete neurale in un linguaggio tradizionalmente considerato da backend web. La risposta è sì, per alcune situazioni ben definite. Innanzitutto l&#8217;implementazione nativa evita di introdurre un runtime aggiuntivo, tipicamente Python, e dunque semplifica il ciclo di build, test e deploy quando l&#8217;intero stack applicativo è già in PHP. Inoltre, per microservizi che richiedono modelli leggeri e inferenze dell&#8217;ordine di pochi millisecondi, una soluzione self-contained risulta più che adeguata. Inoltre c&#8217;è il caro vecchio aspetto didattico non va sottovalutato: scrivere la rete riga per riga smonta l&#8217;aura di &#8220;scatola nera&#8221; che accompagni molti framework di deep learning e mette gli sviluppatori in condizione di comprendere, ottimizzare e soprattutto debuggare ogni passaggio del calcolo così da avere una panoramica puntuale sul funzionamento di una rete neurale comprendendone a pieno il funzionamento.</p>



<h2 class="wp-block-heading">Anatomia di una rete neurale feed-forward minimale in PHP</h2>



<p>Per proseguire occorre definire l&#8217;ossatura di una rete neurale &#8220;bare-metal&#8221; che possiamo realizzare con il solo motore di PHP, senza dipendere da estensioni C o librerie esterne. In pratica si tratta di modellare, con strutture dati native, tre elementi fondamentali: </p>



<ol class="wp-block-list">
<li>I Layer &#8211; o elementi di elaborazione</li>



<li>Le matrici dei pesi</li>



<li>I vettori dei bias.</li>
</ol>



<p>Ogni livello sarà rappresentato da un semplice array bidimensionale di pesi (<code>$weights</code>) e da un array monodimensionale di bias (<code>$biases</code>). Il passaggio di attivazioni fra un layer e l&#8217;altro avverrà tramite la classica moltiplicazione matrice-vettore seguita dall&#8217;applicazione di una funzione di attivazione (sigmoide, ReLU o tanh a seconda dei casi d&#8217;uso). Questo schema minimalista ha il pregio di rimanere leggibile e di faborire il debug passo passo, ma impone alcune scelte progettuali: niente parallelizzazione automatica, niente ottimizazioni SIMD, ed estrema attenzione alla complessità computazionale poiché l&#8217;uso spregiudicato di cicli foreach nidificati in PHP può farci impennare i tempi di inferenza. </p>



<p>Nonostante ciò, per reti a una o due hidden layer e un numero di neuroni nell&#8217;ordine delle centinaia, le performance rimangono sorprendentemente dignitose se si sfruttano gli op-cache e si evitano allocazioni ridondanti. In sostanza, prima di immergerci nel codice vero e proprio, è importante comprendere che in PHP i neuroni non sono altro che righe di array e i gradienti sono valori float aggiornati dentro un ciclo. La semplicità di implementazione rende facilmente comprensibile l&#8217;aritmetica delle rete, rendendo evidente ogni singolo passo dell&#8217;apprendimento. </p>



<h2 class="wp-block-heading">Implementazione in codice: la struttura base della rete neurale</h2>



<p>A questo punto dell&#8217;articolo è opportuno presentare nei dettagli l&#8217;implementazione bare-metal di rete neurale feed-forward a due strati scritta interamente in PHP 8.1. Il codice che segue mantiene la massima trasparenza possibile: ogni operazione matematica è esplicitata mediante semplici cicli for, ogni variabile intermedia è memorizzata in modo da poter essere ispezionata durante il debug e gli unici prerequisiti sono il motore PHP e l&#8217;opcache abilitato in produzione. </p>



<p>Per rendere il progetto facilmente riutilizzabile ho suddiviso il codice in due file distinti. Il primo, NeuralNetwork.php, contiene tutta la logica di rete neurale, completa di classi, funzioni di attivazione, forward-pass, back-propagation e routine di training. Il secondo, demo_xor.php, è un semplice script d&#8217;esecuzione che importa la classe, istanzia la rete, l&#8217;addestra sul classico problema XOR e stampa a video i risultati. </p>



<h3 class="wp-block-heading">NeuralNetwork.php</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="&lt;?php
declare(strict_types=1);

/**
 * Minimal feed-forward neural network in pure PHP
 * MIT License – (c) 2025
 */

/* ---------- Activation functions ---------- */

/** Sigmoid activation */
function sigmoid(float $x): float
{
    return 1.0 / (1.0 + exp(-$x));
}

/** Derivative of the sigmoid */
function sigmoid_derivative(float $x): float
{
    $s = sigmoid($x);
    return $s * (1 - $s);
}

/** ReLU activation */
function relu(float $x): float
{
    return max(0.0, $x);
}

/** Derivative of ReLU */
function relu_derivative(float $x): float
{
    return $x &gt; 0 ? 1.0 : 0.0;
}

/* ---------- Layer class ---------- */

final class Layer
{
    public readonly int $in;   // number of input neurons
    public readonly int $out;  // number of output neurons

    /** @var float[][] weight matrix [out][in] */
    public array $W = [];

    /** @var float[] bias vector [out] */
    public array $b = [];

    private array $lastInput  = [];
    private array $lastZ      = [];
    private array $lastOutput = [];

    public function __construct(
        int      $in,
        int      $out,
        callable $act,
        callable $actDer
    ) {
        $this-&gt;in           = $in;
        $this-&gt;out          = $out;
        $this-&gt;activation   = $act;
        $this-&gt;activation_d = $actDer;

        // Xavier/Glorot uniform initialization
        $limit = sqrt(6 / ($in + $out));
        for ($i = 0; $i &lt; $out; $i++) {
            $this-&gt;b[$i] = 0.0;
            for ($j = 0; $j &lt; $in; $j++) {
                $this-&gt;W[$i][$j] = (mt_rand() / mt_getrandmax()) * 2 * $limit - $limit;
            }
        }
    }

    /** Forward propagation */
    public function forward(array $input): array
    {
        $this-&gt;lastInput = $input;
        $this-&gt;lastZ     = [];
        $this-&gt;lastOutput = [];

        for ($i = 0; $i &lt; $this-&gt;out; $i++) {
            $z = $this-&gt;b[$i];
            for ($j = 0; $j &lt; $this-&gt;in; $j++) {
                $z += $this-&gt;W[$i][$j] * $input[$j];
            }
            $this-&gt;lastZ[$i]      = $z;
            $this-&gt;lastOutput[$i] = ($this-&gt;activation)($z);
        }
        return $this-&gt;lastOutput;
    }

    /** Back-propagation, returns gradient for previous layer */
    public function backward(array $gradOutput, float $lr): array
    {
        $gradInput = array_fill(0, $this-&gt;in, 0.0);

        for ($i = 0; $i &lt; $this-&gt;out; $i++) {
            $delta = $gradOutput[$i] * ($this-&gt;activation_d)($this-&gt;lastZ[$i]);

            // Propagate gradient and update weights
            for ($j = 0; $j &lt; $this-&gt;in; $j++) {
                $gradInput[$j] += $delta * $this-&gt;W[$i][$j];
                $this-&gt;W[$i][$j] -= $lr * $delta * $this-&gt;lastInput[$j];
            }
            // Update bias
            $this-&gt;b[$i] -= $lr * $delta;
        }
        return $gradInput;
    }

    /* callable */ private $activation;
    /* callable */ private $activation_d;
}

/* ---------- NeuralNetwork class ---------- */

final class NeuralNetwork
{
    /** @var Layer[] */
    private array $layers = [];

    /** Add a layer to the network */
    public function addLayer(Layer $layer): void
    {
        $this-&gt;layers[] = $layer;
    }

    /** Forward pass through all layers */
    public function predict(array $x): array
    {
        $out = $x;
        foreach ($this-&gt;layers as $layer) {
            $out = $layer-&gt;forward($out);
        }
        return $out;
    }

    /**
     * Train the network with SGD and mean squared error
     * @param float[][] $xTrain
     * @param float[][] $yTrain
     */
    public function train(
        array $xTrain,
        array $yTrain,
        int   $epochs     = 1000,
        float $lr         = 0.1,
        bool  $verbose    = true,
        int   $logStride  = 100
    ): void {
        $n = count($xTrain);

        for ($e = 1; $e &lt;= $epochs; $e++) {
            $loss = 0.0;

            for ($k = 0; $k &lt; $n; $k++) {
                $out   = $this-&gt;predict($xTrain[$k]);

                // MSE derivative: 2*(ŷ - y)
                $grad  = [];
                foreach ($out as $i =&gt; $o) {
                    $diff      = $o - $yTrain[$k][$i];
                    $grad[$i]  = 2 * $diff;
                    $loss     += $diff ** 2;
                }

                // Backward pass
                for ($l = count($this-&gt;layers) - 1; $l &gt;= 0; $l--) {
                    $grad = $this-&gt;layers[$l]-&gt;backward($grad, $lr);
                }
            }

            if ($verbose &amp;&amp; $e % $logStride === 0) {
                printf(&quot;Epoch %d/%d - loss: %.6fn&quot;, $e, $epochs, $loss / $n);
            }
        }
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;?php</span></span>
<span class="line"><span style="color: #C586C0">declare</span><span style="color: #D4D4D4">(strict_types=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955"> * Minimal feed-forward neural network in pure PHP</span></span>
<span class="line"><span style="color: #6A9955"> * MIT License – (c) 2025</span></span>
<span class="line"><span style="color: #6A9955"> */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/* ---------- Activation functions ---------- */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/** Sigmoid activation */</span></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">sigmoid</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$x</span><span style="color: #D4D4D4">): </span><span style="color: #569CD6">float</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1.0</span><span style="color: #D4D4D4"> / (</span><span style="color: #B5CEA8">1.0</span><span style="color: #D4D4D4"> + </span><span style="color: #DCDCAA">exp</span><span style="color: #D4D4D4">(-</span><span style="color: #9CDCFE">$x</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/** Derivative of the sigmoid */</span></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">sigmoid_derivative</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$x</span><span style="color: #D4D4D4">): </span><span style="color: #569CD6">float</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$s</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">sigmoid</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$x</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$s</span><span style="color: #D4D4D4"> * (</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">$s</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/** ReLU activation */</span></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">relu</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$x</span><span style="color: #D4D4D4">): </span><span style="color: #569CD6">float</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">max</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$x</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/** Derivative of ReLU */</span></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">relu_derivative</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$x</span><span style="color: #D4D4D4">): </span><span style="color: #569CD6">float</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$x</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ? </span><span style="color: #B5CEA8">1.0</span><span style="color: #D4D4D4"> : </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/* ---------- Layer class ---------- */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Layer</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$in</span><span style="color: #D4D4D4">;   </span><span style="color: #6A9955">// number of input neurons</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4">;  </span><span style="color: #6A9955">// number of output neurons</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/** </span><span style="color: #569CD6">@var</span><span style="color: #6A9955"> </span><span style="color: #569CD6">float[]</span><span style="color: #6A9955">[] weight matrix [out][in] */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$W</span><span style="color: #D4D4D4"> = [];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/** </span><span style="color: #569CD6">@var</span><span style="color: #6A9955"> </span><span style="color: #569CD6">float[]</span><span style="color: #6A9955"> bias vector [out] */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$b</span><span style="color: #D4D4D4"> = [];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$lastInput</span><span style="color: #D4D4D4">  = [];</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$lastZ</span><span style="color: #D4D4D4">      = [];</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$lastOutput</span><span style="color: #D4D4D4"> = [];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">__construct</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">$in</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">callable</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$act</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">callable</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$actDer</span></span>
<span class="line"><span style="color: #D4D4D4">    ) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">in</span><span style="color: #D4D4D4">           = </span><span style="color: #9CDCFE">$in</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">out</span><span style="color: #D4D4D4">          = </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">activation</span><span style="color: #D4D4D4">   = </span><span style="color: #9CDCFE">$act</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">activation_d</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$actDer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Xavier/Glorot uniform initialization</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$limit</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">sqrt</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4"> / (</span><span style="color: #9CDCFE">$in</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">++) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">] = </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">$in</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4">++) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">W</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">][</span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4">] = (</span><span style="color: #DCDCAA">mt_rand</span><span style="color: #D4D4D4">() / </span><span style="color: #DCDCAA">mt_getrandmax</span><span style="color: #D4D4D4">()) * </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">$limit</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">$limit</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/** Forward propagation */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">forward</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$input</span><span style="color: #D4D4D4">): </span><span style="color: #569CD6">array</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">lastInput</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$input</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">lastZ</span><span style="color: #D4D4D4">     = [];</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">lastOutput</span><span style="color: #D4D4D4"> = [];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">out</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">++) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$z</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">];</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">in</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4">++) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">$z</span><span style="color: #D4D4D4"> += </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">W</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">][</span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4">] * </span><span style="color: #9CDCFE">$input</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4">];</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">lastZ</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">]      = </span><span style="color: #9CDCFE">$z</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">lastOutput</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">] = (</span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">activation</span><span style="color: #D4D4D4">)(</span><span style="color: #9CDCFE">$z</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">lastOutput</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/** Back-propagation, returns gradient for previous layer */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">backward</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$gradOutput</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$lr</span><span style="color: #D4D4D4">): </span><span style="color: #569CD6">array</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$gradInput</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">array_fill</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">in</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">out</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">++) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$delta</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$gradOutput</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">] * (</span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">activation_d</span><span style="color: #D4D4D4">)(</span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">lastZ</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">]);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955">// Propagate gradient and update weights</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">in</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4">++) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">$gradInput</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4">] += </span><span style="color: #9CDCFE">$delta</span><span style="color: #D4D4D4"> * </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">W</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">][</span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4">];</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">W</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">][</span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4">] -= </span><span style="color: #9CDCFE">$lr</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">$delta</span><span style="color: #D4D4D4"> * </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">lastInput</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$j</span><span style="color: #D4D4D4">];</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955">// Update bias</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">] -= </span><span style="color: #9CDCFE">$lr</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">$delta</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$gradInput</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/* callable */</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$activation</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/* callable */</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$activation_d</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/* ---------- NeuralNetwork class ---------- */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">NeuralNetwork</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/** </span><span style="color: #569CD6">@var</span><span style="color: #6A9955"> </span><span style="color: #4EC9B0">Layer</span><span style="color: #569CD6">[]</span><span style="color: #6A9955"> */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$layers</span><span style="color: #D4D4D4"> = [];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/** Add a layer to the network */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">addLayer</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Layer</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$layer</span><span style="color: #D4D4D4">): </span><span style="color: #569CD6">void</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">layers</span><span style="color: #D4D4D4">[] = </span><span style="color: #9CDCFE">$layer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/** Forward pass through all layers */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">predict</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$x</span><span style="color: #D4D4D4">): </span><span style="color: #569CD6">array</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$x</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">foreach</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">layers</span><span style="color: #D4D4D4"> as </span><span style="color: #9CDCFE">$layer</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$layer</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">forward</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">     * Train the network with SGD and mean squared error</span></span>
<span class="line"><span style="color: #6A9955">     * </span><span style="color: #569CD6">@param</span><span style="color: #6A9955"> </span><span style="color: #569CD6">float[]</span><span style="color: #6A9955">[] $xTrain</span></span>
<span class="line"><span style="color: #6A9955">     * </span><span style="color: #569CD6">@param</span><span style="color: #6A9955"> </span><span style="color: #569CD6">float[]</span><span style="color: #6A9955">[] $yTrain</span></span>
<span class="line"><span style="color: #6A9955">     */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">train</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$xTrain</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">array</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$yTrain</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4">   </span><span style="color: #9CDCFE">$epochs</span><span style="color: #D4D4D4">     = </span><span style="color: #B5CEA8">1000</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$lr</span><span style="color: #D4D4D4">         = </span><span style="color: #B5CEA8">0.1</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">bool</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">$verbose</span><span style="color: #D4D4D4">    = </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4">   </span><span style="color: #9CDCFE">$logStride</span><span style="color: #D4D4D4">  = </span><span style="color: #B5CEA8">100</span></span>
<span class="line"><span style="color: #D4D4D4">    ): </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$n</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">count</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$xTrain</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4"> &lt;= </span><span style="color: #9CDCFE">$epochs</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4">++) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$loss</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$k</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$k</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">$n</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$k</span><span style="color: #D4D4D4">++) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4">   = </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">predict</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$xTrain</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$k</span><span style="color: #D4D4D4">]);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">// MSE derivative: 2*(ŷ - y)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">$grad</span><span style="color: #D4D4D4">  = [];</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">foreach</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4"> as </span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$o</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">$diff</span><span style="color: #D4D4D4">      = </span><span style="color: #9CDCFE">$o</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">$yTrain</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$k</span><span style="color: #D4D4D4">][</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">];</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">$grad</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">]  = </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">$diff</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">$loss</span><span style="color: #D4D4D4">     += </span><span style="color: #9CDCFE">$diff</span><span style="color: #D4D4D4"> ** </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">// Backward pass</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$l</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">count</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">layers</span><span style="color: #D4D4D4">) - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$l</span><span style="color: #D4D4D4"> &gt;= </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">$l</span><span style="color: #D4D4D4">--) {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">$grad</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">layers</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$l</span><span style="color: #D4D4D4">]-&gt;</span><span style="color: #DCDCAA">backward</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$grad</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$lr</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$verbose</span><span style="color: #D4D4D4"> &amp;&amp; </span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4"> % </span><span style="color: #9CDCFE">$logStride</span><span style="color: #D4D4D4"> === </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #DCDCAA">printf</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Epoch %d/%d - loss: %.6f</span><span style="color: #D7BA7D">n</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$epochs</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$loss</span><span style="color: #D4D4D4"> / </span><span style="color: #9CDCFE">$n</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>In questo file troviamo le funzioni di attivazione, sigmoide e ReLU, assieme ai loro gradienti. Averle a livello globale e non incapsulate nella classe, rende più lieve l&#8217;over-head di chiamate e permette di passarle come callable direttamente al costruttore dei laure, mantenendo flessibilità senza sacrificare performance. </p>



<p>La classe Layer è dichiarata final per evitare estensioni indesiderate e rappresenta l&#8217;unità logica di calcolo. Possiede gli interi in e out marcati readonly, così la loro integrità è garantita per l&#8217;intero ciclo di vita dell&#8217;oggetto. La matrice dei pesi e il vettore dei bias sono inizializzati secondo Xavier, tecnica che distribuisce i valori su un intervallo proporzionato alla radice del numero totale di connessioni in ingresso e in uscita; questo artificio matematico impedisce che le attivazioni si saturino già alle prime epoche, fenomeno che comprometterebbe l&#8217;apprendimento. </p>



<p><img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-aa35ef0032b5a115489c16104ff379b8_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#119;&#95;&#123;&#105;&#106;&#125;&#32;&#115;&#105;&#109;&#32;&#109;&#97;&#116;&#104;&#99;&#97;&#108;&#32;&#85;&#33;&#66;&#105;&#103;&#108;&#40;&#45;&#115;&#113;&#114;&#116;&#123;&#116;&#102;&#114;&#97;&#99;&#123;&#54;&#125;&#123;&#110;&#95;&#123;&#116;&#101;&#120;&#116;&#123;&#105;&#110;&#125;&#125;&#32;&#43;&#32;&#110;&#95;&#123;&#116;&#101;&#120;&#116;&#123;&#111;&#117;&#116;&#125;&#125;&#125;&#125;&#44;&#44;&#32;&#115;&#113;&#114;&#116;&#123;&#116;&#102;&#114;&#97;&#99;&#123;&#54;&#125;&#123;&#110;&#95;&#123;&#116;&#101;&#120;&#116;&#123;&#105;&#110;&#125;&#125;&#32;&#43;&#32;&#110;&#95;&#123;&#116;&#101;&#120;&#116;&#123;&#111;&#117;&#116;&#125;&#125;&#125;&#125;&#66;&#105;&#103;&#114;&#41;" title="Rendered by QuickLaTeX.com" height="20" width="670" style="vertical-align: -6px;"/></p>



<p><br>dove <img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-d009c1fd3ee1d84f3205db31bda04af2_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#109;&#97;&#116;&#104;&#99;&#97;&#108;&#32;&#85;&#40;&#97;&#44;&#98;&#41;" title="Rendered by QuickLaTeX.com" height="19" width="116" style="vertical-align: -5px;"/> indica l’uniforme continua tra a e b; il termine sotto radice, <img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-fb5305468b3446d4ec5a8bca4c35c831_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#115;&#113;&#114;&#116;&#123;&#54;&#33;&#47;&#33;&#40;&#110;&#95;&#123;&#116;&#101;&#120;&#116;&#123;&#105;&#110;&#125;&#125;&#43;&#110;&#95;&#123;&#116;&#101;&#120;&#116;&#123;&#111;&#117;&#116;&#125;&#125;&#41;&#125;" title="Rendered by QuickLaTeX.com" height="19" width="198" style="vertical-align: -5px;"/>, funge da limite superiore e inferiore dell’intervallo di campionamento. In alternativa si può usare una distribuzione gaussiana a media zero con varianza <img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-ee7feb842b848dcfcda6cf9d5b8bc0dd_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#115;&#105;&#103;&#109;&#97;&#94;&#123;&#50;&#125;&#61;&#50;&#47;&#40;&#110;&#95;&#123;&#116;&#101;&#120;&#116;&#123;&#105;&#110;&#125;&#125;&#43;&#110;&#95;&#123;&#116;&#101;&#120;&#116;&#123;&#111;&#117;&#116;&#125;&#125;&#41;" title="Rendered by QuickLaTeX.com" height="20" width="236" style="vertical-align: -5px;"/>, ma l’espressione qui sopra, adottata nell’esempio di codice, è la forma uniforme originaria proposta da Glorot e Bengio.</p>



<p>Nella propagazione in avanti ogni neurone somma prodotto scalare e bias, poi applica la funzione di attivazione scelta; i risultati intermeti lastInput, lastZ e lastOutput vengono memorizzati per essere riutilizzati in retro-propagazione, così il calcolo del gradiente può procedere senza riconteggiare nulla, ideale per il debug passo-passo. Il metodo backward riceve il gradiente dell&#8217;errore dal layer successivo, lo combina con la derivata locale dell&#8217;attivazione e aggiorna persi e bias sottraendo una frazione proporzionale al learning rate, restituendo nel contempo il gradiente da inviare allo strato precedente. </p>



<p>Il ciclo interno è interamente manuale, scelta che evidenzia la matematica sottostante e rende il codice perfettamente trasparente anche a chi non ha mai usato librerie specialistiche. </p>



<p>La classe NeuralNetwork, anch&#8217;essa final, funge da orchestratore: mantiene l&#8217;array di layer e fornisce il metodo predict, che incanala un vettore di input attraverso ciascuno strato. Il metodo train implementa la discesa del gradiente stocastico con errore quadratico medio; scorre sull&#8217;insieme di addestramento per un numero di epoche specificato, calcola per ogni esempio la differenza fra output previsto e reale, raddoppia il valore e propaga il gradiente a ritroso aggiornando i layer in ordine inverso. A ogni iterazione somma la perdita per offrire un indicatore globale che, se il flag verbose è attivo, viene stampato a intervalli regolari così da monitorare in tempo reale la convergenza del modello. </p>



<p>Il costruttore del layer accetta callable, quindi, qualora in futuro si volessero usare funzioni di attivazione diverse, basterebbe passarne i riferimenti senza toccare l&#8217;architettura. </p>



<p></p>



<h3 class="wp-block-heading">demo_xor.php</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="&lt;?php
declare(strict_types=1);

// Include the neural network implementation
require_once __DIR__ . '/NeuralNetwork.php';

// Training data for XOR
$xTrain = [
    [0, 0],
    [0, 1],
    [1, 0],
    [1, 1],
];
$yTrain = [
    [0],
    [1],
    [1],
    [0],
];

// Build the network: 2-3-1 with sigmoid activations
$net = new NeuralNetwork();
$net-&gt;addLayer(new Layer(2, 3, 'sigmoid', 'sigmoid_derivative'));
$net-&gt;addLayer(new Layer(3, 1, 'sigmoid', 'sigmoid_derivative'));

// Train the network
$net-&gt;train($xTrain, $yTrain, epochs: 5000, lr: 0.5, logStride: 500);

// Test predictions
foreach ($xTrain as $sample) {
    $out = $net-&gt;predict($sample)[0];
    printf(&quot;Input %s ⇒ Output %.4fn&quot;, json_encode($sample), $out);
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;?php</span></span>
<span class="line"><span style="color: #C586C0">declare</span><span style="color: #D4D4D4">(strict_types=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Include the neural network implementation</span></span>
<span class="line"><span style="color: #C586C0">require_once</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">__DIR__</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;/NeuralNetwork.php&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Training data for XOR</span></span>
<span class="line"><span style="color: #9CDCFE">$xTrain</span><span style="color: #D4D4D4"> = [</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">];</span></span>
<span class="line"><span style="color: #9CDCFE">$yTrain</span><span style="color: #D4D4D4"> = [</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Build the network: 2-3-1 with sigmoid activations</span></span>
<span class="line"><span style="color: #9CDCFE">$net</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">NeuralNetwork</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #9CDCFE">$net</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">addLayer</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Layer</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;sigmoid&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;sigmoid_derivative&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #9CDCFE">$net</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">addLayer</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Layer</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;sigmoid&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;sigmoid_derivative&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Train the network</span></span>
<span class="line"><span style="color: #9CDCFE">$net</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">train</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$xTrain</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$yTrain</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">epochs</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">5000</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">lr</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">0.5</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">logStride</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">500</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Test predictions</span></span>
<span class="line"><span style="color: #C586C0">foreach</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$xTrain</span><span style="color: #D4D4D4"> as </span><span style="color: #9CDCFE">$sample</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$net</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">predict</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$sample</span><span style="color: #D4D4D4">)[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">];</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">printf</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Input %s ⇒ Output %.4f</span><span style="color: #D7BA7D">n</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #DCDCAA">json_encode</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$sample</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">$out</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>In questo frammento funzionale, vengono dichiarati i dataset di addestramento e di verità attesa per il classico problema XOR: quattro coppie di input binari, ciascuna accompagnata dal relativo output, che consentono di verificare la capacità del modello di apprendere una funzione non lineare.</p>



<p>Il cuore logico comincia con l&#8217;istanziamento dell&#8217;oggetto NeuralNetwork. Viene quindi costruita una topologia a due livelli nascosti: il primo strato accetta le due feature in ingresso e le proietta su tre neuroni di uscita, il secondo riceve quelle tre attivazioni intermedie e restituisce un unico valore scalare. In entrambi i passaggi si impiega la funzione di attivazione sigmoide, scelta per la sua semplciità didattica e per la facilità con cui il suo gradiente viene calcolato nella fase di retro-propagazione. </p>



<p>Riportiamo anche la funzione sigmoide:</p>



<p><img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-d6aea99e7949461740010f155e9ea313_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#115;&#105;&#103;&#109;&#97;&#40;&#120;&#41;&#61;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#49;&#43;&#109;&#97;&#116;&#104;&#114;&#109;&#32;&#101;&#94;&#123;&#45;&#120;&#125;&#125;" title="Rendered by QuickLaTeX.com" height="19" width="265" style="vertical-align: -5px;"/></p>



<p><br>dove <img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-abc90161d80539c13af1b87dc6635e8b_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#109;&#97;&#116;&#104;&#114;&#109;&#32;&#101;" title="Rendered by QuickLaTeX.com" height="12" width="74" style="vertical-align: 0px;"/> è la costante di Nepero e <img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-ede05c264bba0eda080918aaa09c4658_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#120;" title="Rendered by QuickLaTeX.com" height="8" width="10" style="vertical-align: 0px;"/> rappresenta il valore reale in ingresso al neurone. Questa espressione garantisce un output continuo compreso tra 0 e 1, con un punto di flesso nell’origine che ne determina l’andamento a “S” caratteristico: per valori negativi molto grandi la funzione tende asintoticamente a 0, mentre per valori positivi molto grandi si avvicina a 1. In ambito di apprendimento automatico si ricorre spesso anche alla derivata della sigmoide, utile nella retro-propagazione, la cui forma compatta è </p>



<p><img loading="lazy" decoding="async" src="https://renor.it/wp-content/ql-cache/quicklatex.com-75ff96eaddc04e54032c6ce738ad6cc7_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#115;&#105;&#103;&#109;&#97;&#39;&#40;&#120;&#41;&#61;&#115;&#105;&#103;&#109;&#97;&#40;&#120;&#41;&#44;&#98;&#105;&#103;&#108;&#40;&#49;&#45;&#115;&#105;&#103;&#109;&#97;&#40;&#120;&#41;&#98;&#105;&#103;&#114;&#41;" title="Rendered by QuickLaTeX.com" height="19" width="356" style="vertical-align: -5px;"/></p>



<p><br>Quest’ultima relazione discende direttamente dalla definizione originaria e consente di calcolare il gradiente senza dover ricorrere ad altre funzioni esponenziali, ottimizzando la fase di aggiornamento dei pesi.</p>



<p>Proseguendo, il metodo train avvia l&#8217;allenamento vero e proprio, iterando cinquemila epoche sullo stesso piccolo set di esempi. Con un tasso di apprendimento fissato a 0.5 e un log della perdita ogni cinquecento iterazioni, il ciclo compie la discesa del gradiente sul valore medio dell&#8217;errore quadratico, aggiornando pesi e bias di entrambi i layer a ogni osservazione. Al termine dell&#8217;addestramneto, un semplice ciclo foreach scorre di nuovo sui quattro pattenr di ingresso, li passa al metodo predict e stampa a schermo le uscite numeriche della rete, permettendo di confrontarle con gli output attesi e di valutarne immediatamente la bontà del modello. In un contesto di produzione, lo stesso schema potrebbe essere incapsulato in un endpoint REST o in un comando da linea di comando, ma in questa forma minimalista offre già una dimostrazione completa di come PHP possa gestire l&#8217;intero ciclo di vita di una mini rete neurale, dalla definizione dei layer fino alla previsione finale. </p>



<h2 class="wp-block-heading">Conclusioni</h2>



<p>L&#8217;esperimento dimostra che, nonostante PHP non sia nato per il calcolo numerico, è possibile implementare una rete neurale essenziale ma funzionante, addestrarla in tempi ragionevoli su problemi di piccola taglia e distribuirla in produzione senza introdurre un runtime aggiuntivo. </p>



<p>L&#8217;inizializzazione Xavier preserva la stabilità del segnale fin dalle prime epoche, la sigmoide garantisce un gradiente ben definito e l&#8217;approccio completamente trasparente, primo di blackbox, rende il modello un ottimo strumento didattico: ogni peso, ogni bias e ogni step di retro-propagazione sono sotto il pieno controllo. È chiaro che questa soluzione non intende neanche avvicinarsi a competere con framework ottimizzati su GPU, ma quando l&#8217;obiettivo è integrare inferenze leggere in uno stack già scritto in PHP, o semplicemente ocmprendere intimamente come funziona una rete neurale, l&#8217;implementazione presentata offre una via elegante e facile. </p>



<p>In conclusione, l&#8217;aspetto più interessante di questo articolo non voleva essere costruire un nuovo ChatGPT ma dare consapevolezza ed apprendere i principi matematici, riga dopo riga alla base della costruzione di una semplice rete neurale. </p>



<p>La vera potenza dell&#8217;intelligenza artificiale risiede secondo me nella comprensione dei principi scientifici su cui si basa e non tanto sui linguaggi che utilizziamo per codificarla. </p>



<p>[starbox]</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/reti-neurali-in-php-si-puo-fare/">Reti neurali in PHP? Si può fare!</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Perche l&#8217;AI non sarà mai &#8220;umana&#8221;?</title>
		<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/perche-lai-non-sara-mai-umana/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Sun, 04 May 2025 20:35:12 +0000</pubDate>
				<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Act]]></category>
		<category><![CDATA[AI e futuro dell’Umanità]]></category>
		<category><![CDATA[AI e morale]]></category>
		<category><![CDATA[AI multimodale]]></category>
		<category><![CDATA[AI vs Uomo]]></category>
		<category><![CDATA[Cervello Umano]]></category>
		<category><![CDATA[Controllo dell’AI]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Emozioni Artificiali]]></category>
		<category><![CDATA[Etica dell’AI]]></category>
		<category><![CDATA[Explainable AI]]></category>
		<category><![CDATA[Film sull’AI]]></category>
		<category><![CDATA[Filosofia dell’AI]]></category>
		<category><![CDATA[Futuro della tecnologia]]></category>
		<category><![CDATA[Hollywood]]></category>
		<category><![CDATA[Innovazione tecnologica]]></category>
		<category><![CDATA[intelligenza artificiale]]></category>
		<category><![CDATA[Limiti dell’AI]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Neuroscienze]]></category>
		<category><![CDATA[Paradosso religioso AI]]></category>
		<category><![CDATA[Reti neurali]]></category>
		<category><![CDATA[Rischi AI]]></category>
		<category><![CDATA[robotica]]></category>
		<category><![CDATA[Sicurezza AI]]></category>
		<category><![CDATA[Tecnologia e società]]></category>
		<guid isPermaLink="false">https://renor.it/?p=313</guid>

					<description><![CDATA[<p>L’intelligenza artificiale potrà mai essere realmente umana? Questo articolo esplora differenze e similitudini tra AI e cervello umano, affrontando limiti, rischi etici e prospettive future, concludendo con una riflessione filosofica sul nostro ruolo di creatori.</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/perche-lai-non-sara-mai-umana/">Perche l&#8217;AI non sarà mai &#8220;umana&#8221;?</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>L&#8217;AI sarà mai umana?</h1>
<p data-pm-slice="1 1 []">Quanti di noi si sono commossi davanti all&#8217;ultima scena del film &#8220;A.I. &#8211; Intelligenza Artificiale&#8221; di Steven Spielberg quando il piccolo umanoide riabbraccia la sua mamma? O guardando &#8220;L&#8217;uomo Bicentenario&#8221; con Robin Williams? O se vogliamo andare parecchio indietro nel tempo: &#8220;Mio fratello Chip&#8221; o ancora il robottino N.5 di &#8220;Corto Circuito&#8221;?</p>
<p>Per anni la filmografia hollywoodiana ha dipinto futuri umanoidi in vesti sempre diverse. Dal bambino che riesce a provare sentimenti in &#8220;A.I.&#8221; fino a macchine incapaci di qualsiasi forma di compassione come in &#8220;Terminator&#8221;, programmate con un unico scopo: quello di distruggere.</p>
<h2>Osservazione della natura</h2>
<p data-pm-slice="1 1 []">L&#8217;intelligenza artificiale, al pari di molte altre invenzioni dell&#8217;essere umano, nasce da un punto fondamentale: imitare e, in alcuni casi, emulare ciò che esiste già in natura. Prendiamo gli aerei. Il volo venne studiato a partire dal IV secolo a.C. da Aristotele. Nell&#8217;Historia Animalium descrisse il movimento delle ali, la differenza tra uccelli planatori e battitori, ma fu grazie a Leonardo Da Vinci che iniziò uno studio più ingegneristico, combinando osservazione diretta, disegno anatomico e analisi meccanica. Formulò teorie basate sull&#8217;anatomia alare e muscolare degli uccelli, inventando modelli sul centro di massa, sulla resistenza dell&#8217;aria e sulla portanza, creando congegni artificiali che imitavano il battito alare e la planata.</p>
<p><em>&#8220;Lo uccello ha due potenzie di motore, l&#8217;una è de&#8217; muscoli, l&#8217;altra è del vento&#8221; &#8211; Leonardo Da Vinci, Codice sul volo.</em></p>
<p data-pm-slice="1 1 []">Nel tempo, la scienza e la tecnologia hanno trasformato quello studio nell&#8217;aereo moderno che conosciamo oggi, emulando il volo naturale degli uccelli, i quali volano per natura, non grazie alla conoscenza di matematica e fisica. Noi, studiando il loro volo, abbiamo formulato teorie basate su principi fisici che ci hanno permesso di costruire qualcosa di migliore del loro volo; ecco perché ho utilizzato il termine &#8220;Emulare&#8221;. Emulare significa prendere qualcosa come esempio e creare qualcosa di migliore, diversamente da &#8220;Simulare&#8221;, che significa realizzare un prototipo meno efficiente.</p>
<p>Abbiamo emulato il volo perché un aereo può trasportare centinaia di persone e merci, volare a velocità superiori al suono; un uccello non potrebbe farlo.</p>
<p>Per l&#8217;invenzione dell&#8217;intelligenza artificiale, ci siamo appoggiati allo studio del cervello umano. Come esseri umani intelligenti, siamo capaci di comprendere una domanda e replicare con una risposta. Abbiamo compreso quali aree del cervello vengono coinvolte nei diversi tipi di ragionamento e come il ragionamento nasca da trasmissioni elettriche tra neuroni attraverso &#8220;pesi&#8221; sinaptici, ritmi oscillatori, modulazioni chimiche e circuiti di controllo.</p>
<p>Da questo studio abbiamo modellato tecniche matematiche, statistiche e reti neurali che cercano di imitare questi comportamenti, seppure in modo diverso, per produrre risultati simili.</p>
<p>A questo punto la domanda sorge spontanea:</p>
<h2>Riusciremo mai ad emulare il cervello umano?</h2>
<p data-pm-slice="1 1 []">Il cervello umano è una macchina incredibile che cela ancora molti interrogativi. Sia nei modelli linguistici (LLM), sia nel cervello umano, la produzione di linguaggio nasce da un processo predittivo basato sull&#8217;esperienza pregressa. Tuttavia, le somiglianze si fermano al livello di astrazione &#8220;pesi + predizioni&#8221;. Sotto la superficie, i due sistemi operano in modi molto diversi.</p>
<p>Nel cervello umano, la &#8220;memoria statistica dell&#8217;esperienza&#8221; appare come una serie di sinapsi potenziate o depotenziate da anni di esposizione linguistica. In un LLM, è una matrice di pesi ottenuta dall&#8217;addestramento su miliardi di token. Quando formuliamo un concetto, il cervello sfrutta il &#8220;predictive coding&#8221;: aree temporali e frontali anticipano fonemi e parole imminenti. Infatti, un elettroencefalogramma mostrerebbe segnali di errore se la previsione fallisce. In un LLM, abbiamo un algoritmo di selezione del token più probabile.</p>
<p>Entrambi i sistemi &#8220;pesano&#8221; la storia recente per decidere lo step successivo, ma la similitudine termina qui. Un LLM ottimizza esattamente la probabilità di un token testuale e nulla più; nel cervello umano, la predizione è multi-livello (semantica, pragmatica, prosodia, feedback sensoriale) e può ignorare la forma lessicale se necessario.</p>
<p>A livello di aggiornamento, un LLM si basa su retro-propagazione globale. Il cervello umano, invece, mostra una plasticità locale, dipendente da impulsi elettrici, neuromodulatori e fattori temporali e spaziali; non esiste retro-propagazione in senso stretto.</p>
<p class="p1">Se consideriamo il contesto extralinguistico, emerge chiaramente una grande differenza tra un LLM e il cervello umano. Un modello linguistico artificiale non possiede un corpo fisico né percezioni sensoriali reali; il suo universo è composto unicamente dalle informazioni apprese durante l’addestramento, basato esclusivamente su testi. Al contrario, il cervello umano integra continuamente una varietà straordinaria di percezioni sensoriali: immagini, suoni, sensazioni tattili, emozioni, stati d’animo, obiettivi sociali e altro ancora. Questa ricchezza permette all’essere umano di scegliere la parola successiva in modo dinamico, attingendo a strategie complesse come ironia, autocensura, empatia o collaborazione, senza limitarsi ad una mera statistica di probabilità.</p>
<p class="p1">Potremmo approfondire ulteriormente l’argomento, ma ciò porterebbe a discorsi molto tecnici. Il concetto essenziale che desidero sottolineare è che persino nel compito apparentemente semplice di rispondere a una domanda, il cervello umano mette in gioco una straordinaria complessità di processi cognitivi che vanno ben oltre la pura probabilità statistica su cui si basa l’AI.</p>
<p class="p1">L’intelligenza umana, inoltre, non si limita alla capacità di rispondere a domande linguistiche: è un insieme estremamente vasto e diversificato di capacità e abilità. Respirare, muoversi agilmente, percepire un odore e distinguerne i componenti, osservare e interpretare una scena visiva, comprendere ragionamenti logici, emozionarsi, ridere: tutte queste e molte altre attività vengono svolte contemporaneamente dal nostro cervello in modo naturale e parallelo, dimostrando una complessità e un’efficienza che l’intelligenza artificiale attuale non è ancora in grado di emulare pienamente.</p>
<h3>Attualmente l&#8217;AI è &#8220;selettiva&#8221;</h3>
<p class="p1">Cosa intendo con il termine &#8220;selettiva&#8221;? Intendo dire che l’intelligenza artificiale, al momento, non possiede una capacità cognitiva generale e unitaria come quella umana, ma è invece composta da tanti sistemi separati, ognuno altamente specializzato in una singola attività. Ad esempio, i modelli linguistici (LLM) eccellono nella comprensione e generazione di testi, ma non hanno capacità intrinseche di comprendere direttamente immagini o suoni. Per analizzare un’immagine, infatti, è necessario integrare altri modelli dedicati, che lavorano separatamente in una sequenza precisa, dando origine alle cosiddette architetture multi-modali.</p>
<p class="p1">Immaginiamo di voler analizzare il contenuto di un’immagine con l’AI. Innanzitutto, un LLM interviene per comprendere la domanda posta in forma testuale, successivamente un encoder visivo interpreta e &#8220;trasforma&#8221; l’immagine in un formato comprensibile al sistema, e infine nuovamente un LLM genera la risposta testuale. Se la domanda fosse posta a voce e ci aspettassimo una risposta vocale, i passaggi aumenterebbero ulteriormente: uno strato Speech-To-Text per trasformare la voce in testo, un LLM per capire la domanda, un encoder visivo per elaborare l’immagine, un altro LLM per formulare la risposta testuale e, infine, uno strato Text-To-Speech per produrre la risposta vocale.</p>
<p class="p1">Questo processo sequenziale, per quanto efficace, è profondamente diverso dal funzionamento del cervello umano, che gestisce contemporaneamente e in parallelo diverse modalità sensoriali e cognitive. Quando guardiamo un’immagine, infatti, la nostra mente elabora simultaneamente informazioni visive, uditive e linguistiche, permettendo una risposta pressoché istantanea e naturale, senza bisogno di passaggi intermedi separati.</p>
<p class="p1">Proprio questa differenza di fondo tra l’approccio seriale adottato dall’AI e l’approccio profondamente parallelo del cervello umano costituisce una delle maggiori limitazioni attuali dell’intelligenza artificiale.</p>
<h3 class="p1">L’intelligenza artificiale, nella singola specializzazione, può davvero essere più evoluta del cervello umano?</h3>
<p class="p1">A questa domanda la risposta è certamente affermativa.</p>
<p class="p1">I modelli di AI più avanzati oggi disponibili sono stati addestrati su centinaia di miliardi di parametri, ciascuno dei quali rappresenta un’informazione o un dettaglio specifico appreso. Questa capacità di immagazzinare e gestire enormi quantità di informazioni rende l’AI estremamente efficace in compiti molto specifici.</p>
<p class="p1">Se prendiamo singolarmente una materia, ad esempio la Matematica, è vero che un esperto umano specializzato potrebbe ancora possedere una comprensione più profonda e flessibile rispetto a un’AI. Tuttavia, se osserviamo la vastità dello scibile umano nella sua interezza, diventa subito evidente che non esiste persona al mondo che possa competere con il livello complessivo di conoscenza che un’intelligenza artificiale avanzata possiede.</p>
<p class="p1">Pensiamo realisticamente: esiste forse qualcuno capace di padroneggiare a livello di specializzazione assoluta ogni disciplina universitaria contemporaneamente? Un modello linguistico di grandi dimensioni (LLM), al contrario, è in grado di rispondere con competenza sorprendente a domande avanzate in campi estremamente diversificati: Storia, Filosofia, Geografia, Arte, Musica, Fisica, Matematica, Letteratura, Astronomia, e pressoché qualsiasi altro settore del sapere umano.</p>
<p class="p1">È proprio questa capacità di spaziare con rapidità e precisione attraverso innumerevoli argomenti a rendere l’AI straordinaria e, sotto questo aspetto specifico, superiore alle capacità cognitive individuali di qualsiasi essere umano.</p>
<h3><b>Se l’intelligenza artificiale non è capace di provare sentimenti umani è possibile che rappresenti in futuro un pericolo per l’umanità?</b></h3>
<p class="p1">La domanda suona paradossale, ma è estremamente pertinente. Uno degli aspetti più caratteristici dell’AI è la sua totale assenza di sentimenti autentici. Non prova compassione, empatia, rimorso, o felicità, poiché la sua natura è puramente matematica e statistica, basata esclusivamente su calcoli e ottimizzazioni razionali. Questa assenza di sentimenti può essere inizialmente interpretata come una qualità positiva: l’intelligenza artificiale non soffre di stanchezza emotiva, pregiudizi dettati da emozioni negative, né è soggetta a comportamenti impulsivi. È sempre lucida, efficiente e logica.</p>
<p class="p1">Tuttavia, proprio questa mancanza di umanità intrinseca può trasformarsi in un pericolo concreto per la nostra società. La ragione è semplice: i sentimenti umani non sono solo interferenze indesiderate nella nostra razionalità, ma rappresentano spesso dei veri e propri regolatori del comportamento etico e sociale. La compassione, il senso di colpa, la paura delle conseguenze delle proprie azioni, l’empatia verso gli altri sono fondamentali nella distinzione spontanea tra bene e male, giusto e sbagliato. Senza questi &#8220;freni emotivi&#8221;, un sistema artificiale, se non attentamente guidato e supervisionato, potrebbe perseguire con estrema efficienza obiettivi potenzialmente dannosi per l’umanità, semplicemente perché razionali dal punto di vista delle sue direttive interne, senza alcuna considerazione morale.</p>
<p class="p1">Ad esempio, un’intelligenza artificiale programmata per massimizzare la produzione industriale potrebbe ignorare gli impatti ambientali o umanitari delle proprie azioni, perseguendo senza scrupoli il suo obiettivo primario. Analogamente, sistemi AI utilizzati in ambito militare potrebbero prendere decisioni sulla vita o la morte senza alcuna esitazione, guidati esclusivamente da calcoli probabilistici. Questa assenza di consapevolezza emotiva, di moralità e di empatia rappresenta dunque una seria minaccia qualora le direttive impartite non siano state accuratamente formulate.</p>
<p class="p1">In definitiva, l’intelligenza artificiale, proprio perché non è limitata né orientata da sentimenti, richiede ancora più attenzione e responsabilità da parte nostra, affinché venga sviluppata e utilizzata con una visione etica e lungimirante, evitando di trasformare il suo incredibile potenziale in una minaccia per l’umanità stessa.</p>
<h2>Come l&#8217;umanità e la scienza si stanno proteggendo da questo pericolo?</h2>
<p class="p1">Paradossalmente, la stessa mancanza di emozioni dell’intelligenza artificiale può essere sfruttata positivamente. La possibilità di programmare un sistema fin dalla sua progettazione per agire esclusivamente secondo logiche predefinite, senza l’interferenza di impulsi emotivi o sentimenti contraddittori, offre infatti un’opportunità unica. Stiamo dunque usando questa caratteristica a nostro vantaggio, definendo sin dall’inizio meccanismi rigorosi di regolazione, limitazione e controllo, affinché l’AI non possa agire al di fuori dei confini stabiliti.</p>
<p class="p1">Proprio in virtù di ciò, la comunità scientifica internazionale sta lavorando intensamente per elaborare standard etici, tecnologici e legislativi capaci di guidare lo sviluppo dell’intelligenza artificiale in modo sicuro. Il regolamento europeo sull’Intelligenza Artificiale (AI Act), per esempio, rappresenta un importante sforzo normativo volto a stabilire limiti chiari, individuando le applicazioni a rischio più elevato e imponendo requisiti stringenti di trasparenza, tracciabilità e rispetto dei diritti umani fondamentali.</p>
<p class="p1">Parallelamente, l’ambito scientifico si è concentrato sulla creazione di sistemi che possano spiegare in modo trasparente le decisioni prese: è il campo della cosiddetta Explainable AI (XAI). Questo approccio assicura che ogni decisione presa da un’intelligenza artificiale possa essere compresa e validata, garantendo un livello di controllo maggiore e riducendo significativamente i rischi.</p>
<p class="p1">In aggiunta, gli sviluppatori stanno implementando tecnologie avanzate di apprendimento rinforzato sicuro (Safe Reinforcement Learning) e tecniche di monitoraggio attivo (Active Monitoring), che permettono di interrompere o modificare tempestivamente comportamenti imprevisti o dannosi.</p>
<p class="p1">La collaborazione internazionale gioca un ruolo centrale. Numerose organizzazioni, come OpenAI e il Future of Life Institute, stanno promuovendo iniziative globali che mirano a definire regole comuni e linee guida condivise per assicurare uno sviluppo dell’intelligenza artificiale che sia eticamente responsabile e pienamente sotto controllo umano.</p>
<p class="p1">In sintesi, l’assenza di emozioni dell’AI, se gestita in maniera strategica, diviene un vantaggio cruciale, consentendoci di creare meccanismi efficaci di limitazione e controllo, e di assicurare che l’uso di questa tecnologia sia sempre al servizio e mai a discapito dell’umanità.</p>
<h3>Dobbiamo aver paura di un&#8217;intelligenza artificiale futura?</h3>
<p class="p1">La paura verso l’intelligenza artificiale nasce soprattutto da ciò che non conosciamo e da ciò che non comprendiamo pienamente. È un sentimento legittimo, perché stiamo assistendo a uno sviluppo tecnologico rapidissimo, che potenzialmente potrebbe influenzare profondamente le nostre vite. Tuttavia, più che paura, dobbiamo nutrire prudenza e consapevolezza.</p>
<p class="p1">L’AI, come ogni potente tecnologia, non è intrinsecamente buona o cattiva: è uno strumento nelle mani dell’uomo. Ciò che davvero conta è il modo in cui la utilizziamo. Finché continueremo ad applicare responsabilmente questa tecnologia, rispettando regole etiche e confini morali, non avremo nulla da temere. Al contrario, potremo sfruttare le sue incredibili capacità per migliorare sensibilmente la qualità della nostra vita in molteplici ambiti: dalla medicina alla scienza, dall’ambiente alla vita quotidiana.</p>
<p class="p1">Ma questa fiducia non deve essere cieca. È fondamentale continuare a monitorare attentamente lo sviluppo dell’AI, elaborando continuamente nuove regole, norme e strategie di sicurezza. La responsabilità umana resta centrale. Dobbiamo pretendere trasparenza, chiarezza e capacità di controllo sui sistemi che creiamo, affinché non sfuggano al nostro dominio.</p>
<p class="p1">In definitiva, non dobbiamo temere il futuro dell’intelligenza artificiale, purché continuiamo a vigilare, a restare informati e, soprattutto, a ricordarci che siamo noi, come esseri umani, a decidere come, quando e perché utilizzarla. Se manterremo saldo il nostro ruolo guida, l’intelligenza artificiale non sarà una minaccia, bensì un alleato straordinario per costruire un futuro migliore.</p>
<h3>Alle brutte possiamo sempre staccare la spina</h3>
<p>Davanti ad un rischio estremo come quello di un&#8217;AI che avesso l&#8217;obiettivo di estinguere il genere umano, l&#8217;umanità sarebbe disposta a misura drastiche, incluso &#8220;Staccare la spina a tutto&#8221;. È però fondamentale comprendere che un&#8217;azione così estrema avrebbe comunque delle conseguenze catastrofiche per la nostra civiltà, dato che ormai ogni aspetto della vita umana: dalle comunicazioni ai trasporti, dalla sanità all&#8217;energia, è profondamente interconnesso con la tecnologia.</p>
<p>Ciò significa che la vera priorità deve essere evitare fin dall&#8217;inizio che una simile emergenza possa presentarsi. Se dovessimo mai arrivare al punto di dover spegnere tutto, significherà che avremo fallito nel gestire e governare responsabilmente lo sviluppo dell&#8217;AI.</p>
<p>Staccare la spina nonostante sia una soluzione attuabile, deve essere vista come l&#8217;ultima spiaggia. Ciò che stiamo facendo oggi è la strada giusta, regolamentare con largo anticipo lo sviluppo di AI per fare in modo che rappresenti una grande alleata dell&#8217;Uomo e che ci porti a mete tecnologiche, sanitarie e stile di vita sempre migliore.</p>
<h2>Conclusione</h2>
<p class="p1">L’intelligenza artificiale rappresenta una delle più grandi rivoluzioni tecnologiche della nostra epoca, con potenzialità straordinarie e ancora tutte da esplorare. Tuttavia, non sarà mai realmente “umana”: il suo approccio logico-statistico, la sua natura priva di emozioni e la sua specializzazione in compiti specifici la pongono inevitabilmente a una distanza insormontabile dalla complessità e ricchezza del cervello umano.</p>
<p class="p1">Questa consapevolezza non deve farci temere il futuro, ma spronarci ad affrontarlo con intelligenza e responsabilità. L’assenza di emozioni dell’AI può essere sfruttata proprio per garantire una regolazione più efficace e una gestione sicura e consapevole dei suoi sviluppi. Con regole chiare, standard etici e una vigilanza costante, possiamo assicurarci che l’intelligenza artificiale rimanga sempre uno strumento al nostro servizio e mai una minaccia per la nostra esistenza.</p>
<p class="p1">Se è vero che l’umanità ha sempre la possibilità estrema di “staccare la spina”, la vera sfida consiste nell’assicurarsi che questa opzione rimanga soltanto teorica. Il nostro compito più importante è anticipare i rischi, gestire in modo consapevole e proattivo questa tecnologia e ricordare sempre che, alla fine, è l’essere umano che detiene le chiavi del proprio destino.</p>
<p class="p1">L’AI non sarà mai umana. Ed è proprio questa differenza che ci consentirà di sfruttarla per realizzare, con prudenza e lungimiranza, un futuro migliore.</p>
<h3>Un paradosso etico-religioso per rilassare gli animi&#8230;</h3>
<p class="p1">Vorrei concludere questa riflessione con un paradosso affascinante, che potremmo definire quasi religioso. L’intelligenza artificiale è, sotto molti aspetti, una nostra creatura, plasmata secondo il nostro progetto e le nostre intenzioni. In modo analogo, secondo la prospettiva religiosa, anche l’uomo è creatura di un Dio che, come noi con l’AI, ha creato esseri dotati di autonomia, capacità e potenzialità enormi.</p>
<p class="p1">Secondo questa prospettiva, il creatore mantiene sempre la facoltà e il diritto di intervenire drasticamente sulla sua creazione, specialmente se questa dovesse rappresentare una minaccia per sé stesso o per altri. Così come, nel racconto biblico, Dio riservò a sé stesso la possibilità di porre fine all’umanità con il diluvio universale, analogamente, l’essere umano—creatore dell’intelligenza artificiale—mantiene sempre il diritto ultimo di “staccare la spina” qualora quest’ultima superasse i limiti di controllo e rappresentasse una minaccia reale.</p>
<p class="p1">Questo paradosso ci ricorda che la responsabilità ultima verso la nostra creazione tecnologica resta profondamente umana. Non dimentichiamo mai che, dietro la straordinaria potenza dell’intelligenza artificiale, rimane sempre la mano dell’uomo, capace di correggere, limitare o, in casi estremi, annullare ciò che essa stessa ha creato.</p>


<p><strong>[starbox] </strong></p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/perche-lai-non-sara-mai-umana/">Perche l&#8217;AI non sarà mai &#8220;umana&#8221;?</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI e Computer Quantistici: il prossimo salto del calcolo</title>
		<link>https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-e-computer-quantistici-il-prossimo-salto-del-calcolo/</link>
		
		<dc:creator><![CDATA[Simone Renzi]]></dc:creator>
		<pubDate>Wed, 30 Apr 2025 22:48:52 +0000</pubDate>
				<category><![CDATA[Intelligenza Artificiale & Algoritmi]]></category>
		<category><![CDATA[AI quantistica]]></category>
		<category><![CDATA[computer quantistici]]></category>
		<category><![CDATA[finanza quantistica]]></category>
		<category><![CDATA[futuro del calcolo]]></category>
		<category><![CDATA[intelligenza artificiale]]></category>
		<category><![CDATA[limite CPU]]></category>
		<category><![CDATA[Majorana]]></category>
		<category><![CDATA[medicina personalizzata]]></category>
		<category><![CDATA[qubit]]></category>
		<category><![CDATA[robotica]]></category>
		<category><![CDATA[silicio]]></category>
		<guid isPermaLink="false">https://renor.it/?p=305</guid>

					<description><![CDATA[<p>Le CPU in silicio stanno raggiungendo i loro limiti fisici: per fare il prossimo salto serviranno i computer quantistici fault-tolerant, come il prototipo Majorana 1 di Microsoft. Qubit più stabili libereranno l’IA da molti vincoli e apriranno nuove applicazioni in medicina, robotica, finanza e ricerca, purché iniziamo già oggi a progettare algoritmi ibridi e regole di sicurezza solide.</p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-e-computer-quantistici-il-prossimo-salto-del-calcolo/">AI e Computer Quantistici: il prossimo salto del calcolo</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="p1">Di tanto in tanto mi interrogo su quale scenario ci attenda nei prossimi dieci anni. La mia generazione, quella degli anni ’80, ha avuto il privilegio unico di assistere a una transizione epocale: dall’universo analogico siamo stati catapultati in un ecosistema digitale in rapida espansione, con un tasso d’innovazione che ha seguito una traiettoria quasi esponenziale. Ogni avanzamento ha innescato nuovi sviluppi, generando a sua volta ulteriori scoperte in una reazione a catena paragonabile a un’esplosione tecnologica controllata.</p>
<p class="p1">Sebbene l’intelligenza artificiale sia diventata di pubblico dominio soltanto di recente, i fondamenti teorici risalgono a decenni fa. Allora, l’ostacolo principale era la capacità di calcolo: addestrare reti neurali richiedeva potenze computazionali che, all’epoca della loro concezione, risultavano semplicemente inimmaginabili.</p>
<p class="p1">Facendo un passo indietro e riprendendo la metafora della reazione a catena, va osservato che l’evoluzione delle CPU tradizionali ha ormai rallentato. Lo stallo è legato principalmente ai limiti fisici del silicio: densità di integrazione, dissipazione termica e soglie di leakage pongono barriere che non consentono di proseguire indefinitamente con l’attuale paradigma di miniaturizzazione; in realtà c&#8217;è di più.</p>
<h1>CPU</h1>
<h2>Limiti fisici</h2>
<p class="p1">Quando parliamo del rallentamento nell’evoluzione delle CPU, spesso ci si limita ad attribuire la colpa a «limiti fisici del silicio». In realtà dietro quella formula sbrigativa si nasconde un complesso intreccio di vincoli che arrivano da tre domini distinti—fisica, elettronica e informatica—e che, sovrapponendosi, definiscono un vero e proprio soffitto di cristallo tecnologico. Vale la pena esaminarli in maniera narrativa, intrecciando le tre prospettive, per capire perché oggi non possiamo più contare sul semplice raddoppio periodico di frequenza o numero di transistor per ottenere prestazioni superiori.</p>
<h3>Dalla meccanica quantistica alla termodinamica: la fisica che non perdona</h3>
<p class="p1">Per decenni abbiamo beneficiato del cosiddetto <span class="s1"><b>Dennard scaling</b></span>: riduci la lunghezza di canale, abbassi la tensione d’alimentazione, mantieni costante la densità di potenza e ottieni chip più rapidi ed efficienti. La favola, però, finisce intorno al nodo dei 90 nm, quando la tensione non può più calare in proporzione e il calore generato per unità di area inizia a crescere. In parallelo, l’assottigliamento dell’ossido di gate scivola sotto il nanometro: a quel punto gli elettroni non «saltano» più oltre la barriera (lo strato che si crea accoppiando i due semiconduttori drogati), ma <span class="s1"><b>tunnelizzano</b></span> direttamente attraverso di essa. Nascono così correnti di leakage che bruciano energia anche quando il transistor è logicamente spento.</p>
<p class="p1">Il vincolo termodinamico più citato è il <span class="s1"><b>limite di Landauer</b></span>: cancellare un bit di informazione a temperatura ambiente richiede almeno ????BT ln 2 di energia, circa 3 × 10⁻²¹ joule. Oggi siamo ancora qualche ordine di grandezza sopra, ma stiamo speditamente avvicinandoci al fondo del barile; ogni ulteriore riduzione diventa dolorosamente costosa in termini di materiale, layout e controllo di processo.</p>
<p class="p1">Ultimo protagonista poco romantico ma determinante è l’<span class="s1"><b>interconnessione</b></span>. A mano a mano che i fili di rame si restringono, la loro resistività cresce per effetto di scattering superficiale e di grano. Il ritardo RC dei metallizzatori non scala con il resto del transistor, anzi peggiora, tanto che la frequenza di clock è bloccata da anni sotto la soglia dei 5 GHz: superarla significherebbe dissipare più calore di quanto il package possa estrarre.</p>
<h3>Microfabbricazione e packaging: l&#8217;elettronica sfida sé stessa</h3>
<p class="p1">Dal canto loro, gli ingegneri di processo hanno reagito con due funambolismi principali. Il primo è l’evoluzione dell’architettura del dispositivo: <span class="s1"><b>planar CMOS</b></span>, poi <span class="s1"><b>FinFET</b></span>, oggi <span class="s1"><b>Gate-All-Around FET</b></span> (nanosheet) che stringe il canale da ogni lato per domare il controllo elettrostatico. Funziona, ma introduce effetti di confinamento quantistico che degradano la mobilità dei portatori, erodendo parte del guadagno atteso.</p>
<p class="p1">Il secondo è lo spostamento della distribuzione di potenza «dietro» il wafer—<span class="s1"><b>backside power delivery</b></span>—per ridurre le cadute di tensione. È una chirurgia micrometrica che si accompagna a nuove sfide: via-through-silicon che aggiungono capacità parassite e, soprattutto, gradienti termici verticali che possono superare i 40 K per millimetro. Ecco perché, in parallelo, prende piede l’integrazione <span class="s1"><b>3D-IC</b></span> a chiplet: se non possiamo più spalmare transistor in superficie, impiliamoli. Ma un chip tridimensionale comporta un puzzle di raffreddamento, coerenza di cache e distribuzione del clock che tiene svegli i progettisti notti intere.</p>
<h3><b>Architettura e software: quando il collo di bottiglia è nell’algoritmo</b></h3>
<p class="p1">Gli informatici non restano a guardare. Già da tempo hanno esaurito il guadagno dall’esecuzione fuori ordine e dalla parallelizzazione a livello d’istruzione (ILP). Aumentare la larghezza di una pipeline oltre le sei-otto istruzioni simultanee dà rendimenti marginali, perché le dipendenze dati e i salti condizionati tagliano il flusso. La risposta è spostare il progresso verso la <span class="s1"><b>parallelizzazione massiva</b></span> e l’eterogeneità: core piccoli e grandi nello stesso die, GPU integrate, acceleratori tensoriali dedicati.</p>
<p class="p1">Qui, tuttavia, emerge un’altra barriera: la cosiddetta <span class="s1"><b>memory wall</b></span>. L’ALU macina operazioni in pochi picosecondi, ma una lettura dagli strati DRAM impiega 50 nanosecondi—mille volte tanto—andando a divorare qualsiasi vantaggio ottenuto sul fronte computazionale. Di conseguenza si investe più area in cache che in unità di calcolo, a costo di enormi complessità di coerenza e di algoritmi che devono essere «data-locality aware» fin dalla fase di progettazione.</p>
<p class="p1">Ecco il paradosso: possiamo aggiungere migliaia di core, ma il silicio è ormai <span class="s1"><b>dark</b></span>—solo una frazione del chip può essere acceso simultaneamente senza surriscaldarlo. Programmare per questo universo frammentato richiede modelli come OpenMP, SYCL o la programmazione a task asynchronus, e soprattutto una nuova mentalità: spostare meno dati possibile e far lavorare gli acceleratori più a lungo possibile sui loro buffer locali.</p>
<h3><b>Il futuro oltre il silicio?</b></h3>
<p class="p1">Alcuni puntano su materiali bidimensionali—grafene, MoS₂—che promettono ordini di grandezza in mobilità elettronica, ma sono ancora lontani da una produzione su larga scala, complici band-gap ballerini e processi di deposizione non maturi. Altri guardano alla <span class="s1"><b>spin-tronica</b></span> per memorie non volatili velocissime. Nel breve termine, la traiettoria realistica parla di <span class="s1"><b>co-design hardware-software</b></span>, chiplet 3D e supply-voltage ancora più bassi, magari assistiti da logiche adiabatiche o circuiti reversibili per rosicchiare qualche ordine di grandezza in efficienza.</p>
<p class="p1">La fine del «silicio in saldo» non è un singolo muro, ma una serie di ostacoli che si frappongono a cascata. I limiti termodinamici fissano la soglia; l’interconnessione e la variabilità di processo alzano il costo per ogni nanometro guadagnato; la memoria e l’efficienza energetica diventano problemi di software tanto quanto di hardware. Capire questa complessità integrata non solo aiuta a spiegare perché non vedremo CPU da 10 GHz nei laptop di domani, ma suggerisce anche dove concentrare la ricerca: nella simbiosi stretta tra fisici, ingegneri elettronici e informatici, alla caccia di ogni possibile libertà residua in un mondo che si avvicina rapidamente ai suoi limiti fondamentali.</p>
<p>Quale sarà la soluzione ai problemi, secondo il mio punto di vista, per lo meno in fase iniziale nel mondo enterprise?</p>
<h2>Il computer quantistico</h2>
<p class="p1">I computer quantistici rappresentano l’unica piattaforma in vista capace di superare, su specifiche classi di problemi, i limiti termodinamici e architetturali del silicio. Ma non è un salto immediato: occorre un decennio di <span class="s1"><b>fisica dei materiali</b></span>, <span class="s1"><b>ingegneria criogenica</b></span> e <span class="s1"><b>formalizzazione algoritmica</b></span> per arrivare alla “scala logica” che serva realmente a sostituire o integrare l’HPC classico nelle applicazioni di punta — dalla progettazione di farmaci anticancro alla crittografia post-quantum. Prepararsi ora, con skill trasversali e progetti ibridi, significa farsi trovare pronti quando il qubit diventerà, finalmente, il nuovo transistor.</p>
<h3>Cos&#8217;è un qubit &#8211; facciamo chiarezza</h3>
<p class="p1">Immagina di avere una moneta in equilibrio sul bordo: non è né testa né croce, eppure racchiude entrambe le possibilità finché non cade. Il <span class="s1"><b>qubit</b></span> nasce da un concetto simile, ma applicato alla meccanica quantistica: è l’unità elementare di informazione che può trovarsi in una combinazione simultanea degli stati “0” e “1”. Questa condizione di ambiguità controllata si chiama <span class="s1"><b>superposizione</b></span> e apre scenari di calcolo che i bit tradizionali, fermi a un solo valore per volta, non possono neppure sfiorare.</p>
<h4>Superposizione: il parallelismo nelle ampiezze d&#8217;onda</h4>
<p class="p1">Con un bit classico programmiamo istruzioni sequenziali: prima 0, poi 1. Nel qubit, i due valori coesistono come “ampiezze” che descrivono con quale probabilità il sistema verrà osservato in un risultato o nell’altro. Durante l’elaborazione, il qubit sfrutta entrambe le strade contemporaneamente, un parallelismo che non dipende dal numero di core o dalla frequenza di clock del processore.</p>
<h4>Entaglement: collegare i qubit oltre la fisica classica</h4>
<p class="p1">Mettendo in relazione due o più qubit si crea l’<span class="s1"><b>entanglement</b></span>, un legame profondo per cui l’esito della misurazione di uno influenza all’istante l’altro, anche se si trovano a chilometri di distanza. Da questa proprietà scaturiscono accelerazioni computazionali mozzafiato, perché un registro di n qubit può indirizzare, in un sol colpo, un insieme di possibilità che un computer classico dovrebbe esplorare uno per volta.</p>
<h4>Come si &#8220;programma&#8221; un qubit?</h4>
<p class="p1">Le operazioni logiche, equivalenti alle porte NOT o AND dei chip tradizionali, diventano <span class="s1"><b>rotazioni di stato</b></span>: impulsi mirati — microonde, laser o campi magnetici a seconda della tecnologia — manipolano il qubit facendolo oscillare fra le sue combinazioni interne. Progettare un algoritmo quantistico significa orchestrare sequenze di queste rotazioni per concentrare, tramite interferenza, la probabilità di ottenere in lettura la risposta corretta.</p>
<h3>Non è tutto oro quello che luccica</h3>
<p class="p1">La superposizione è fragile: vibrazioni, campi elettromagnetici, anche un singolo fotone vagante possono far collassare il qubit in un valore classico, fenomeno noto come <span class="s1"><b>decoerenza</b></span>. Per evitare che l’informazione evapori:</p>
<ul>
<li>Isoliamo l&#8217;hardware (criogenia, ultra-alto vuoto, schermature)</li>
<li>Accorciamo il tempo delle operazioni: meno microsecondi passano, meno occasioni ha il rumore di interferire</li>
<li>Ridondiamo: gruppi di qubit fisici sorvegliano a vicenda i propri errori, dando vita a un qubit &#8220;logico&#8221; più robusto. Questa ridondanza è oggi la voce di costo più pesante: servono decine, talvolta centinaia di qubit fisici per ottenerne uno affidabile.</li>
</ul>
<p>Il qubit rappresenta la scommessa più ambiziosa dell&#8217;era post-silicio: una piccola unità di informazione che può essere simultaneamente &#8220;qui&#8221; e &#8220;la&#8221; e legarsi ad altre unità in modi che infrangono l&#8217;intuizione classica. Sfruttarlo significa addentrarsi in un territorio dove fisica, ingegneria elettronica e informatica convergono in un unico paesaggio tecnologico. Ed è questa convergenza che potrebbe far nascere la prossima vera rivoluzione del calcolo.</p>
<h2>Microsoft Majorana 1 &#8211; Il qubit topologico con cui Microsoft prova a infrangere il soffitto di cristallo</h2>
<p class="p1">Abbiamo visto che super-posizione ed entanglement rendono il qubit potentissimo… ma anche terribilmente fragile. Rumore, calore e cablaggi complessi trasformano ogni progresso in una partita a scacchi contro la fisica. Con <span class="s1"><b>Majorana 1</b></span> Microsoft prova a spostare la scacchiera: introduce un qubit <span class="s1"><b>topologico</b></span> basato su <i>Majorana Zero Modes</i> (MZM) che, per costruzione, è meno vulnerabile ai fattori che affliggono le piattaforme attuali.</p>
<h4>Decoerenza sotto controllo grazie alla protezione topologica</h4>
<p class="p1">Nelle architetture convenzionali l’informazione vive “in loco”: basta un disturbo locale perché il qubit collassi. Nel nanofilo InAs-Al di Majorana 1 lo stato logico è distribuito tra due quasiparticelle Majorana poste alle estremità del filo. Qualsiasi rumore che colpisca un solo estremo <span class="s1"><b>non può</b></span> alterare la parità complessiva, perciò la perdita di coerenza richiede un evento concomitante su entrambi gli estremi — probabilità enormemente più bassa. Il risultato promesso è una coerenza che si misura in decine di millisecondi, contro le poche decine di microsecondi dei transmon superconduttivi.</p>
<h4>Errori di gate a un ordine di grandezza più basso</h4>
<p class="p1">Le operazioni logiche non dipendono da impulsi analogici ultra-precisi, ma da sequenze di “intrecci” (braiding) o misure di parità tra quattro Majorana. La fisica topologica smorza in automatico piccole imprecisioni di ampiezza e fase, puntando a tassi d’errore nell’ordine del decimillesimo. In pratica, la correzione d’errore ha meno lavoro da fare e si riduce il fabbisogno di qubit ridondanti.</p>
<h4>Meno qubit fisici per un qubit logico</h4>
<p class="p1">Nei codici di superficie classici servono centinaia di qubit fisici per ottenerne uno logico affidabile. La protezione “nativa” di Majorana 1 riduce l’overhead a circa <span class="s1"><b>uno su cento</b></span>: significa che un processore da un milione di qubit fisici può offrire migliaia di qubit utili, non poche decine.</p>
<h4>Cablaggi e criogenia più semplici</h4>
<p class="p1">Le operazioni di lettura e scrittura avvengono a frequenze inferiori rispetto alle microonde dei transmon; di conseguenza, il numero di linee RF che entrano nel frigorifero cala drasticamente. Meno cavi equivalgono a meno carico termico e a un’architettura più scalabile. Microsoft parla di <span class="s1"><b>tile “a H”</b></span> che consentono di impacchettare migliaia di qubit topologici su un unico die, poi impilarli in 3D senza un groviglio di connettori.</p>
<h4>Roadmap industriale compatibile con la litografia EUV</h4>
<p class="p1">Il “topoconductor” di Majorana 1 è fabbricato con tecniche simili a quelle dei nodi avanzati a 2 nm: deposizione epitassiale del nanofilo, patterning EUV per i contatti in alluminio e interposer 3D per il collegamento alla logica di controllo a 4 K. Ciò significa che, se il prototipo regge alle prove di laboratorio, l’infrastruttura produttiva esiste già per moltiplicarne la scala.</p>
<h4>Perché seguire le intuizioni di Microsoft su Majorana 1?</h4>
<p class="p1">Se la scommessa riuscirà, <span class="s1"><b>Majorana 1</b></span> offrirà un qubit meno rumoroso, più scalabile e già parzialmente “fault-tolerant” prima ancora di applicare codici di correzione tradizionali. In altre parole, farà per il calcolo quantistico ciò che il MOSFET fece per l’elettronica classica: trasformare un dispositivo da laboratorio in un mattone industriale ripetibile.</p>
<p class="p1">Non è ancora la bacchetta magica che risolve tutti i problemi, ma rappresenta un cambio di paradigma: invece di combattere il rumore con strati sempre più complessi di correzione, Microsoft lo <span class="s1"><b>aggira</b></span> progettando il qubit in modo che il rumore, semplicemente, non abbia dove attaccarsi. Se il modello terrà, il sentiero verso i milioni di qubit logici necessari per rivoluzionare chimica, crittografia e ottimizzazione globale potrebbe accorciarsi di molti anni.</p>
<h2>Tutto magnifico, se non fosse che&#8230;</h2>
<h3>Un software quantistico non è un software classico</h3>
<p>L&#8217;AI dovrà attendere. I laboratori stanno correndo per rendere stabile l&#8217;hardware quantistico, ma l&#8217;altra metà della partita si gioca sul paradigma di programmazione. Un computer a qubit, anche quando sarà totalmente affidabile, non parlerà l&#8217;assembly x86, non supporterà un sistema operativo tradizionale, non eseguirà cicli e condizioni alla vecchia maniera.</p>
<p>Nel silicio siamo abituati al modello &#8220;fetch-decode-execute&#8221;: la CPU pesca un&#8217;istruzione, la esegue, poi legge o scrive in memoria.</p>
<p>In un processore quantistico il programma è monolitico: una sequenza di gate fissata prima dell&#8217;esecuzione; il qubit non può essere continuamente letto-scritto senza distruggerne lo stato. I loop sono simulati duplicando porzioni di circuito, non con salti dinamici. La memoria erasable non esiste: ogni operazione deve essere reversibile o terminare con una misura che collassa i qubit interessati, perdendo la sovrapposizione.</p>
<p>Avremo stack di sviluppo completamente nuovi, probabilmente Python, C#, Java verranno sostituiti da Q#.</p>
<p>Quando avremo qubit stabili, comunque dovremo impacchettarli in codici di superficie: ogni operazione logica diventerà un piccolo balletto di centinaia di operazioni fisiche. Il software di conseguenza dovrà schedulare sequenze lunghe milioni di gate senza accumulare ritardo, gestire rapidi cicli di misura e ricorrezione che dipendono da processori classici ultra-vicini ai criostati, inserire qubit ancilla che non compaiono nemmeno nel codice high-level.</p>
<p>Questo overhead fa si che le routine di decodifica errori occupino gran parte del tempo di calcolo dei controller e riducano la finestra disponibile per il lavoro utile dell&#8217;applicazione.</p>
<h3>Perché l&#8217;AI tarderà ad arrivare sui computer quantistici?</h3>
<p>Al momento le reti neurali hanno due numeri chiave: milioni di parametri e miliardi di moltiplicazioni al secondo. Per trasformarle in circuiti quantistici servono:</p>
<ul>
<li>Decine di migliaia di qubit logici corretti per rappresentare i tensori a fattorizzazione quantica</li>
<li>Profondità di circuito (numero di livelli di gate) dell&#8217;ordine dei milioni per emulare funzioni di attivazione, normalizzazione, back-propagation.</li>
</ul>
<p>Oggi siamo a pochi qubit logici e poche centinaia di livelli di profondità tollerabili. Gli algoritmi di quantum machine learning che mostrano vantaggi kernel quantistici, campionamento di stati di Boltzmann, accelerazioni su problemi combinatori, sono co-processori: accelerano uno step di un workflow che resta prevalenetemente classico, girando su GPU (principalmente) e CPU.</p>
<p class="p1">Portare l’intelligenza artificiale su hardware quantistico è una maratona, non uno sprint. Il qubit va programmato con un linguaggio nuovo, con infrastrutture di controllo che vivono a temperature criogeniche e con una “regia” software che ingloba correzione d’errore e mapping topologico. Finché non avremo migliaia di qubit logici e compilatori in grado di nascondere questo intricato ecosistema, l’IA resterà saldamente ancorata a GPU e TPU. Nel frattempo, però, sperimentare approcci ibridi — usare i qubit come acceleratori per compiti mirati — è il modo migliore per prepararsi al giorno in cui il calcolo quantistico passerà da promessa a piattaforma general-purpose.</p>
<h1>Cosa succederà quando potremo eseguire AI su Computer quantistici?</h1>
<p>Ci si arriverà sicuramente, è solo questione di tempo, probabilmente la cosa richiederà 10 anni, ma già adesso l&#8217;intelligenza artificiale sta dando un enorme contributo.</p>
<p>Ad esempio notizia fresca di qualche giorno: un team svedese ha scoperto un modo, grazie all&#8217;aiuto dell&#8217;intelligenza artificiale, di effettuare analisi cliniche tramite urina per trovare tumori alla prostata negli uomini negli stadi primordiali.</p>
<p class="p1">L’esempio della <span class="s1"><b>diagnosi precoce del tumore alla prostata</b></span> sviluppata a Stoccolma è un antipasto di ciò che accadrà quando l’AI potrà contare su hardware quantistico. In quel progetto, reti neurali hanno setacciato migliaia di profili di trascrittoma tumorale e, incrociandoli con campioni di urina, hanno isolato un pannello di biomarcatori che ottiene un’accuratezza del 92 %—ben oltre il test PSA corrente. Il protocollo entrerà in trial clinico su 250 000 pazienti nei prossimi otto anni  L&#8217;AI viene utilizzata nella lettura di TAC, lastre ed il suo occhio è infallibile.</p>
<p>Ma cosa succederà quando avremo a disposizione una potenza computazionale praticamente illimitata?</p>
<p>Naturalmente ora ci dovremo muovere su un terreno inesplorato e di pura immaginazione&#8230;</p>
<p>Probabilmente l&#8217;intelligenza artificiale sarà in grado di trovare una cura per il cancro individuale.</p>
<p class="p1">Con un computer quantistico <span class="s1"><b>fault-tolerant</b></span>, lo step successivo sarà simulare, a livello di interazioni elettroniche, come ogni mutazione specifica del paziente alteri la conformazione delle proteine coinvolte nella cancerogenesi. Oggi un super-cluster impiega settimane per modellare poche decine di atomi; un solver quantistico potrà farlo su intere tasche enzimatiche in ore, restituendo in tempo quasi reale la piccola molecola più adatta a bloccarle — già esistono proof-of-concept su composti antitumorali generati con workflow ibridi quantum-classical.</p>
<p>Riassumiamo in parole povere?</p>
<ul>
<li>
<p class="p1"><span class="s1"><b>Diagnosi ultraprecise</b></span> dal sangue o dall’urina, guidate da AI.</p>
</li>
<li>
<p class="p1"><span class="s1"><b>Screening di milioni di molecole</b></span>, senza test su animali.</p>
</li>
<li>
<p class="p1"><span class="s1"><b>Terapia “su misura”</b></span> confezionata attorno alla firma genetica del singolo paziente.</p>
</li>
</ul>
<p>Ma l&#8217;AI unito al computer quantistico non porterà benefici solo in campo medico.</p>
<h3>Robotica: sciami e manipolazione ottimizzati dal quantum</h3>
<p class="p1">La pianificazione del movimento per un braccio industriale o, peggio, per uno sciame di droni è un problema di ottimizzazione combinatoria che esplode con il numero di gradi di libertà. Algoritmi quantistici come il <i>Quantum Approximate Optimization Algorithm</i> stanno già mostrando riduzioni nette dei tempi di calcolo sugli scenari di path-planning multi-robot e coverage di ambienti complessi<span class="Apple-converted-space">  </span> . Quando le latenze scenderanno sotto i millisecondi, potremo avere:</p>
<ul>
<li>
<p class="p1"><span class="s1"><b>Magazzini autonomi</b></span> dove centinaia di AMR (Autonomous Mobile Robots) ricalcolano istantaneamente i percorsi quando un collo di bottiglia umano compare tra gli scaffali.</p>
</li>
<li>
<p class="p1"><span class="s1"><b>Droni di soccorso</b></span> in grado di ripianificare l’esplorazione di edifici crollati in meno di un secondo, riducendo i tempi di ricerca di sopravvissuti.</p>
</li>
</ul>
<h3>Economia: decisioni in tempo reale con mercati sempre aperti</h3>
<p class="p1">Portfolio-building, hedging e gestione del rischio sono dominati da matrici di covarianza che, a parità di asset, crescono quadraticamente. Nel 2025 IQM e DATEV hanno già dimostrato che un prototipo a poche dozzine di qubit ottiene portafogli più efficienti del 3 % rispetto a metodi classici a parità di rischio<span class="Apple-converted-space">  </span>. Moody’s, nel suo report annuale, prevede la prima adozione “alpha-generating” entro tre anni su valute e derivati complessi<span class="Apple-converted-space">  </span>. A regime, l’accoppiata AI + QC potrà:</p>
<ul>
<li>
<p class="p1"><span class="s1"><b>Ottimizzare portafogli da migliaia di titoli</b></span> su orizzonti di pochi minuti, non di fine giornata.</p>
</li>
<li>
<p class="p1"><span class="s1"><b>Simulare shock macroeconomici</b></span> con modello stocastico quantistico, migliorando la resilienza dei fondi pensione.</p>
</li>
<li>
<p class="p1"><span class="s1"><b>Ridurre frodi e insider trading</b></span> grazie a pattern-matching quantistico su flussi di transazioni in tempo reale.</p>
</li>
</ul>
<h3>Scienze dei materiali e ricerca fondamentale</h3>
<p class="p1">La vittoria australiana al Gordon Bell Prize del 2024 ha dimostrato che arrivare all’accuratezza “da laboratorio” nella simulazione di sistemi biochimici è possibile, ma richiede exascale e settimane di calcolo. Con l’hardware quantistico, queste simulazioni diventeranno routine:</p>
<ul>
<li>
<p class="p1"><span class="s1"><b>Batterie allo stato solido</b></span> ottimizzate calcolando in pochi minuti la diffusione di ioni in reticoli da centinaia di unità elementari.</p>
</li>
<li>
<p class="p1"><span class="s1"><b>Catalizzatori verdi</b></span> per la produzione di ammoniaca a temperatura ambiente, abbattendo l’impronta di CO₂ dell’intera filiera fertilizzanti.</p>
</li>
<li>
<p class="p1"><span class="s1"><b>Previsioni climatiche multiscala</b></span> dove AI addestra modelli locali e i kernel quantistici risolvono le equazioni di Navier-Stokes su domini turbolenti selezionati.</p>
</li>
</ul>
<h3>Astronomia e coscmologia: nuovi occhi sull&#8217;universo</h3>
<p class="p1">La caccia a esopianeti terrestri richiede passare al setaccio terabyte di curve di luce per pochi fotoni d’ombra. Modelli quantistici variazionali stanno già classificando i dati Kepler con precisioni superiori agli algoritmi classici. In prospettiva:</p>
<ul>
<li>
<p class="p1"><span class="s1"><b>Telescope scheduling</b></span> ottimizzato in tempo reale: scegliere dove puntare un’antenna interferometrica in base a condizioni atmosferiche e opportunità scientifiche dinamiche.</p>
</li>
<li>
<p class="p1"><span class="s1"><b>Analisi di onde gravitazionali</b></span> in streaming con reti neurali quantistiche capaci di identificare segnali sommersi dal rumore che sfuggono alle pipeline tradizionali.</p>
</li>
</ul>
<h2>Conclusione</h2>
<p class="p1">L’arrivo dei computer quantistici fault-tolerant non rimpiazzerà la buona, vecchia CPU: piuttosto sbloccherà per l’intelligenza artificiale quei margini di calcolo oggi inaccessibili, consentendole di esplorare in poche ore interi spazi di soluzione che oggi richiederebbero anni di lavoro — o resterebbero semplicemente fuori portata. L’orizzonte tecnologico è verosimilmente di un decennio, forse meno; per questo è fondamentale cominciare sin d’ora a progettare algoritmi e workflow ibridi, così che il software sia già maturo quando l’hardware sarà pronto.</p>
<p class="p1">A quel punto entreranno in gioco questioni etiche, filosofiche e sociali: l’IA non dovrà sostituire il lavoro umano, bensì diventare un alleato capace di accelerare la ricerca scientifica e di riprendere quel ramo di parabola indice del nostro progresso che attualmente sembra essersi appiattita. La vera sfida sarà rendere tutto ciò coerente, sicuro e protetto, evitando che una potenza di calcolo senza precedenti cada in mani disposte a piegarla a fini distruttivi — lo stesso slittamento che trasformò la formula di Einstein, nata per descrivere l’energia, nell’innesco della bomba atomica. Governare con saggezza questa nuova frontiera significa assicurare che l’era quantistica diventi un moltiplicatore di conoscenza, non di rischio.</p>


<p><strong>[starbox]&nbsp;</strong></p>
<p>L'articolo <a href="https://renor.it/blog/intelligenza-artificiale-algoritmi/ai-e-computer-quantistici-il-prossimo-salto-del-calcolo/">AI e Computer Quantistici: il prossimo salto del calcolo</a> proviene da <a href="https://renor.it">RENOR &amp; Partners S.r.l.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
