Prima di cambiare l’AI, controlliamo che cosa sta misurando
Un sistema segnala che un ambiente è più caldo del solito. Il responsabile vede più allarmi e pensa di riaddestrare il modello. Ma il cambiamento potrebbe essere nella stanza, nel sensore o nel software che converte la lettura. Come distinguere le cause prima di spendere tempo sul problema sbagliato? Costruiremo un esempio numerico completo per capire quando una verifica del sensore viene prima dell’aggiornamento dell’AI e quali informazioni servono per decidere.
Il caso è interamente sintetico: temperature e riferimenti sono numeri scelti dall’autore, non letture di uno strumento. Nessun microcontrollore, sensore, modello AI o sistema di allarme è stato provato. Il codice eseguito stima una semplice relazione tra riferimento e lettura, la inverte e controlla quattro valori separati. Non fornisce una procedura di certificazione né dimostra prestazioni su un dispositivo. La distinzione tra calcolo e misura accompagnerà tutti i risultati.
Una lettura non racconta da sola la causa
Supponiamo di leggere 22 °C. Nel mondo A la temperatura è 20 °C e lo strumento aggiunge un errore costante di 2 °C. Nel mondo B la temperatura è davvero 22 °C e lo strumento non aggiunge nulla. Il numero osservato è identico. Un algoritmo che riceve soltanto quel numero non può distinguere questi due mondi senza altre ipotesi o informazioni. Non è un difetto di addestramento: è una mancanza di informazione, chiamata non identificabilità della causa.
Un riferimento indipendente può rompere l’ambiguità. Deve però misurare la stessa grandezza nelle stesse condizioni rilevanti: due sonde in punti diversi possono leggere temperature diverse senza che nessuna sia guasta. Sincronizzazione, posizione e tempo di stabilizzazione fanno parte del confronto. Indipendente non significa infallibile: anche il riferimento ha incertezza e può condividere errori con lo strumento. Nel nostro conto ideale il valore di riferimento è assunto noto per isolare il meccanismo, non perché tale perfezione esista in reparto.
Due modi diversi di sbagliare
Un sensore può aggiungere sempre lo stesso scarto oppure amplificare le variazioni. Per separarli usiamo una retta con due parametri: intercetta a e pendenza b. Se riferimento e lettura sono espressi in gradi Celsius, a ha unità °C mentre b è senza unità. L’errore e rappresenta la parte non spiegata dalla retta. NIST presenta questa famiglia tra i modelli di taratura; qui scegliamo il caso affine come ipotesi didattica, non come legge di ogni sensore.
Leggiamola con numeri: a=2 °C e b=1,1 trasformano 20 °C in 24 °C prima del piccolo errore e. A 40 °C la lettura diventa 46 °C. Togliere soltanto due gradi correggerebbe l’intercetta, lasciando l’errore di scala: a 40 otterremmo ancora 44. Un singolo confronto a una sola temperatura non basta a distinguere bene pendenza e intercetta. Servono livelli diversi e verifiche dell’ipotesi che la relazione resti valida nell’intervallo di uso.
Costruire i dati e stimare la correzione
Usiamo cinque riferimenti sintetici: 0, 10, 20, 30 e 40 °C. Per ciascuno generiamo due letture dalla relazione 2+1,1x, aggiungendo una volta −0,2 e una volta +0,2 °C. Sono dieci punti deterministici, con simmetria costruita apposta: non un campione casuale o una prova di ripetibilità. Il codice conserva tutti i punti e non elimina osservazioni scomode. La simmetria rende trasparente il recupero dei parametri, ma rende il risultato molto più facile di una taratura reale.
Per scegliere una retta dobbiamo definire che cosa significa «si adatta ai punti». Minimizzare la somma dei quadrati degli scarti verticali significa penalizzare maggiormente gli scarti grandi. Scriviamo J come somma di [yᵢ−a−bxᵢ]². Questo criterio tratta x come noto; se l’incertezza del riferimento non è trascurabile, quella scelta può essere inadeguata. Non trasformiamo il metodo più semplice in un’autorizzazione a ignorare le condizioni sperimentali.
Le ultime due espressioni si ottengono annullando le derivate di J rispetto ad a e b: la prima impone scarto medio nullo, la seconda scarto non correlato con x dopo il centramento. Il denominatore misura quanto variano i riferimenti: se tutti coincidono è zero e la pendenza non è identificabile. Nel nostro esempio le medie sono 20 e 24 °C; il numeratore è 2200 °C² e il denominatore 2000 °C². Otteniamo b=1,1 e a=2 °C, come verificato dal programma.
Dalla lettura al valore corretto: invertire la domanda
Finora abbiamo previsto che cosa legge lo strumento dato un riferimento. In esercizio chiediamo il contrario: quale valore corrisponde alla lettura ricevuta? Risolvendo la retta rispetto a x, sottraiamo l’intercetta e dividiamo per la pendenza. Il simbolo x̂ indica una stima, non una verità esatta. L’inversione richiede b diverso da zero. Se b è molto piccolo, anche un piccolo errore della lettura viene amplificato dalla divisione: non è un problema che una formula elegante elimina.
Per controllare il calcolo usiamo quattro riferimenti nuovi, 5, 15, 25 e 35 °C, assenti dalla stima. Generiamo le letture dalla stessa relazione, ma con scarti alternati +0,11 e −0,11 °C. La prima lettura è 7,61 e viene corretta a 5,1, quindi resta un errore di +0,1 °C. I quattro punti restano dentro l’intervallo dei riferimenti: non è una prova di extrapolazione. Sono un controllo indipendente dai punti di stima, ma non una validazione su strumenti indipendenti.
| Riferimento °C | Lettura °C | Corretto °C | Errore grezzo °C | Errore corretto °C |
|---|---|---|---|---|
| 5 | 7.61 | 5.1 | 2.61 | 0.1 |
| 15 | 18.39 | 14.9 | 3.39 | -0.1 |
| 25 | 29.61 | 25.1 | 4.61 | 0.1 |
| 35 | 40.39 | 34.9 | 5.39 | -0.1 |
La tabella riporta °C per tutte le colonne; l’errore è stima meno riferimento. Per riassumere senza cancellare i segni usiamo anche l’errore assoluto medio, MAE dall’inglese mean absolute error: sommiamo i valori assoluti e dividiamo per quattro. Sulle letture grezze vale 4 °C, su quelle corrette 0,1 °C. Il programma esegue entrambi i calcoli. Il miglioramento era favorito dalla costruzione dei dati e non prevede quanto migliorerà un sensore reale o l’accuratezza di un modello AI.

Nel grafico sinistro ogni punto mostra una lettura meno il riferimento: lo scarto aumenta con la temperatura, indizio compatibile con l’errore di scala costruito. A destra gli errori dei quattro controlli passano da valori positivi di diversi gradi a ±0,1. Le scale verticali sono uguali per rendere confrontabile la grandezza; non trasformano questi quattro punti in una distribuzione statistica. Un grafico delle sole letture sembrerebbe quasi perfettamente lineare e nasconderebbe quanto conta lo scarto per una decisione.
Correggere un bias non rende preciso uno strumento rumoroso
Bias indica uno scostamento sistematico; precisione riguarda la dispersione di misure ripetute in condizioni definite. Sono problemi diversi. NIST, discutendo gli insuccessi della taratura, avverte che la correzione non risolve una scarsa precisione o cambiamenti incontrollati nel tempo. Nel nostro esempio la variabilità è scelta, piccola e simmetrica; non abbiamo stimato deriva giornaliera, isteresi o dipendenza da umidità. Una correzione fissa può diventare sbagliata se la relazione fisica cambia dopo averla stimata.
Non proponiamo di cancellare automaticamente gli scarti grandi. Una lettura insolita può rivelare un collegamento intermittente, un cambiamento reale o un riferimento non stabilizzato. Prima di escluderla occorrono motivazione e tracciabilità. Anche la retta va messa in discussione: residui curvi possono segnalare una relazione non affine. Aggiungere parametri può adattare meglio gli stessi punti senza rendere affidabili nuove misure. Il confronto decisivo usa condizioni e punti non impiegati per scegliere la correzione.
Se domani cambia lo scarto, la vecchia correzione può fallire
Mettiamo alla prova proprio l’ipotesi di stabilità. Aggiungiamo 0,55 °C alle quattro letture di controllo, senza ristimare i coefficienti. La correzione precedente divide anche questo cambiamento per 1,1: ogni stima si sposta quindi di +0,5 °C. Gli errori diventano +0,6, +0,4, +0,6 e +0,4 °C; il MAE sale a 0,5 °C. Anche questi sono risultati calcolati su dati costruiti, non una deriva osservata. Il caso mostra perché conservare una correzione non significa poter dimenticare il confronto con un riferimento.
L’inversione permette anche di leggere la sensibilità locale: se i coefficienti restano fissi, uno scarto di 0,2 °C della lettura induce circa 0,1818 °C nella stima, perché dividiamo per 1,1. Non è l’incertezza totale della misura. Non comprende l’incertezza di a e b, il riferimento, la posizione delle sonde o la validità della retta. Confondere una sensibilità con un intervallo di accuratezza porterebbe a dichiarare una qualità che il nostro esempio non misura. È un’altra distinzione da mantenere prima di confrontare schede e algoritmi.
Una decisione operativa richiede poi una tolleranza motivata dal compito. Uno scarto accettabile per descrivere l’andamento di una stanza può non esserlo per un altro processo: qui non scegliamo soglie universali. Se il margine rispetto alla decisione è piccolo, la domanda utile è quanto resta incerto il valore, non quante cifre decimali stampa il software. Il codice può produrre molti decimali perché il calcolo è preciso; il dato fisico non diventa altrettanto preciso. Per questo i risultati vengono presentati con unità e ipotesi, senza promettere una taratura pronta per l’uso.
Dove cambia la decisione su un dispositivo embedded
Embedded significa che il software vive in un dispositivo dedicato, spesso con memoria, energia e tempo limitati. La correzione affine richiede una sottrazione e una divisione per campione; non richiede riaddestrare una rete. Questo descrive il numero di operazioni, non la latenza misurata: sul dispositivo contano rappresentazione numerica, librerie e acquisizione. I due coefficienti non sono l’intera RAM necessaria al sistema. Non riportiamo millisecondi, watt o joule perché non li abbiamo misurati.
Una modifica al punto in cui viene applicata la correzione cambia il significato dei dati che il modello riceve. Se i dati storici erano già corretti, correggerli di nuovo aggiunge un errore. Se il modello era stato addestrato sulle letture grezze, cambiare scala agli ingressi può alterarne le decisioni: va rivalutata l’intera catena con etichette indipendenti. Versione dei coefficienti, unità, intervallo di validità e versione del modello devono quindi accompagnare le registrazioni. Non basta sostituire due numeri e osservare meno allarmi.
Prima dell’AI confrontiamo anche una soluzione senza modello: una regola su una grandezza fisica correttamente misurata può essere sufficiente per un requisito semplice. Viceversa una taratura non ripara un cambiamento reale nella relazione fra temperatura e risultato di processo. Se il sensore è coerente con riferimenti indipendenti ma la previsione peggiora su nuovi casi etichettati, riaddestramento, nuove variabili o manutenzione del processo tornano ipotesi ragionevoli. Non esiste una scelta universale: le evidenze devono distinguere il guasto di misura dal cambiamento del compito.
Che cosa abbiamo dimostrato, e che cosa manca
Abbiamo dimostrato con un controesempio che una sola lettura non identifica la causa; poi verificato numericamente una correzione affine su dati sintetici separati. Non abbiamo dimostrato che un sensore reale stia derivando o che un modello vada riaddestrato. La decisione pratica è raccogliere un confronto indipendente prima di intervenire alla cieca. Un miglioramento della misura e un miglioramento del compito finale sono due verifiche distinte: entrambi devono essere documentati quando si cambia una catena operativa.
Restano necessarie prove su intervallo reale, riferimenti con incertezza dichiarata, ripetizioni distanziate nel tempo e condizioni ambientali pertinenti. Su hardware bisogna inoltre verificare conversioni, precisione numerica, gestione di dati fuori intervallo e possibilità di ripristinare una configurazione precedente. Il caso non riguarda una decisione clinica o un dispositivo di sicurezza. EL-AI non viene presentata come produttrice di sensori né come titolare di queste prove: l’interesse editoriale per l’embedded non documenta prodotti o installazioni disponibili.
Il codice allegato usa Decimal per rendere esatti gli ingressi decimali scelti. Crea dieci coppie, calcola medie e somme, stima i due parametri, poi controlla quattro punti e il controesempio. La complessità è lineare nel numero delle coppie; la lista conservata cresce anch’essa linearmente. Non è una libreria per microcontrollori e non misura la loro memoria. Le asserzioni documentano che l’aritmetica attesa è stata eseguita; non sostituiscono prove metrologiche, statistiche o di integrazione.
NIST/SEMATECH e-Handbook — Models for instrument calibration, section 2.3.6.1.
NIST/SEMATECH e-Handbook — Data collection, section 2.3.6.2.
NIST/SEMATECH e-Handbook — What can go wrong with calibration, section 2.3.6.4.
NIST/SEMATECH e-Handbook — Data analysis and model validation, section 2.3.6.5.
NIST/SEMATECH e-Handbook — Linear Least Squares Regression, section 4.1.4.1.
from decimal import Decimal as D
from pathlib import Path
import json,sys
# Entirely synthetic temperatures and reference values, not hardware measurements.
train=[(D(x),D('1.1')*D(x)+D(2)+e) for x in [0,10,20,30,40] for e in [D('-.2'),D('.2')]]
xbar=sum(x for x,y in train)/len(train);ybar=sum(y for x,y in train)/len(train)
b=sum((x-xbar)*(y-ybar) for x,y in train)/sum((x-xbar)**2 for x,y in train)
a=ybar-b*xbar
assert a==2 and b==D('1.1')
test=[]
for x,e in zip([5,15,25,35],[D('.11'),D('-.11'),D('.11'),D('-.11')]):
x=D(x);y=D('1.1')*x+2+e;corrected=(y-a)/b
test.append(dict(referenceC=str(x),readingC=str(y),correctedC=str(corrected),rawErrorC=str(y-x),correctedErrorC=str(corrected-x)))
raw=sum(abs(D(t['rawErrorC'])) for t in test)/len(test)
corrected=sum(abs(D(t['correctedErrorC'])) for t in test)/len(test)
assert raw==4 and corrected==D('.1')
# One reading admits distinct physical explanations without an independent reference.
assert D(20)+2==D(22)+0
shifted=[(D(t['readingC'])+D('.55')-a)/b-D(t['referenceC']) for t in test]
shiftedMAE=sum(abs(e) for e in shifted)/len(shifted)
assert shifted==[D('.6'),D('.4'),D('.6'),D('.4')] and shiftedMAE==D('.5')
assert sum((x-xbar)**2 for x,y in train)==2000
assert sum((x-xbar)*(y-ybar) for x,y in train)==2200
r=dict(shiftedErrorsC=[str(e) for e in shifted],shiftedMAEC=str(shiftedMAE),readingSensitivityForPointTwo=str(D('.2')/b),python=sys.version.split()[0],seed=None,scope='Synthetic affine calibration arithmetic, no hardware, no AI training, no certification or model accuracy benchmark',training=[dict(referenceC=str(x),readingC=str(y)) for x,y in train],interceptC=str(a),slope=str(b),test=test,rawMAEC=str(raw),correctedMAEC=str(corrected),identifiabilityCounterexample=dict(observedC='22',worldA=dict(trueC='20',offsetC='2'),worldB=dict(trueC='22',offsetC='0')))
Path(__file__).with_name('results.json').write_text(json.dumps(r,indent=2),encoding='utf8')
print(json.dumps(r))
Codice, dati e istruzioni · JSON. Calcoli didattici eseguiti con Python 3.14.0; figure con Matplotlib 3.11.2. Analisi con assistenza AI, senza dichiarare peer review o revisione umana. Copertina originale ImageGen, illustrativa: non documenta persone, sedi o installazioni EL-AI. Fonti consultate il 30 ottobre 2026.

