ELAI S.r.l.

La IA detecta más anomalías: ¿y si cambió el sensor?

Antes de reentrenar la IA, distingue cambios reales y errores de medida: ejemplo completo de calibración, controles separados y límites con datos sintéticos.

La IA detecta más anomalías: ¿y si cambió el sensor?

Antes de cambiar la IA, revisemos qué está midiendo

Un sistema avisa de que una sala está más caliente de lo habitual. El responsable ve más alarmas y piensa en reentrenar el modelo. Pero el cambio puede estar en la sala, el sensor o el software que convierte su lectura. ¿Cómo distinguir las causas antes de trabajar en el problema equivocado? Desarrollaremos un ejemplo numérico completo para entender cuándo revisar el sensor precede a actualizar la IA y qué información permite decidir.

El caso es totalmente sintético: temperaturas y referencias son cifras elegidas por el autor, no lecturas instrumentales. No se probaron microcontroladores, sensores, modelos de IA ni alarmas. El código ejecutado estima una relación sencilla entre referencia y lectura, la invierte y comprueba cuatro valores aparte. No es una certificación ni demuestra rendimiento en un dispositivo. Todos los resultados mantienen la diferencia entre cálculo y medida.

Una lectura no identifica por sí sola su causa

Supongamos una lectura de 22 °C. En el mundo A la temperatura es 20 °C y el instrumento añade un error constante de 2 °C. En el B la temperatura es realmente 22 °C y el instrumento no añade nada. El número observado coincide. Un algoritmo que solo recibe ese número no puede distinguir ambos mundos sin más hipótesis o información. No es un defecto de entrenamiento: falta información, una no identificabilidad de la causa.

observed = true_value + offset 22 = 20 + 2 = 22 + 0

Una referencia independiente puede romper la ambigüedad, pero debe medir la misma magnitud en condiciones relevantes iguales. Sondas en posiciones distintas pueden leer temperaturas diferentes sin estar averiadas. Sincronización, ubicación y estabilización forman parte de la comparación. Independiente no significa infalible: la referencia tiene incertidumbre y puede compartir errores. En el cálculo ideal suponemos conocido el valor de referencia para aislar el mecanismo, no porque exista esa perfección en planta.

Dos formas distintas de equivocarse

Un sensor puede añadir siempre el mismo desplazamiento o amplificar los cambios. Los separamos con una recta de intercepto a y pendiente b. Si referencia y lectura están en grados Celsius, a tiene unidad °C y b no tiene unidad. El error e es la parte no explicada por la recta. NIST incluye esta familia entre los modelos de calibración; elegimos el caso afín como supuesto didáctico, no como ley universal.

y = a + b*x + e

Con a=2 °C y b=1,1, 20 °C se convierten en 24 °C antes del pequeño error e; 40 °C pasan a 46 °C. Restar dos grados corrige el intercepto, pero deja el error de escala: a 40 aún obtendríamos 44. Una comparación a una sola temperatura no separa adecuadamente pendiente e intercepto. Se necesitan niveles distintos y comprobar la validez en el intervalo de uso.

Construir los datos y estimar la corrección

Usamos cinco referencias sintéticas: 0, 10, 20, 30 y 40 °C. Para cada una generamos dos lecturas con 2+1,1x, añadiendo −0,2 y +0,2 °C. Son diez puntos deterministas, de simetría deliberada, no muestras aleatorias ni pruebas de repetibilidad. El código conserva todos los puntos. Esa simetría facilita entender la recuperación de parámetros, pero hace el resultado mucho más sencillo que una calibración real.

Para elegir una recta definimos qué significa ajustarse a los puntos. Minimizar los cuadrados de las desviaciones verticales penaliza más las desviaciones grandes. J es la suma de [yᵢ−a−bxᵢ]². El criterio trata x como conocido; si su incertidumbre es importante puede ser inadecuado. Un método sencillo no autoriza a ignorar las condiciones experimentales.

J(a,b) = sum_i (y_i-a-b*x_i)^2 b_hat = sum_i((x_i-x_mean)*(y_i-y_mean)) / sum_i((x_i-x_mean)^2) a_hat = y_mean - b_hat*x_mean

Las expresiones resultan de anular las derivadas de J respecto a a y b: una impone residuo medio nulo y la otra ausencia de correlación con x centrada. El denominador mide la dispersión de referencias; si todas coinciden es cero y no se identifica la pendiente. Las medias son 20 y 24 °C; numerador 2200 °C² y denominador 2000 °C². Obtenemos b=1,1 y a=2 °C, comprobados por el programa.

De la lectura al valor corregido: invertir la pregunta

Hasta ahora predecíamos la lectura desde una referencia. En uso preguntamos lo contrario: qué valor corresponde a la lectura recibida. Despejamos x restando el intercepto y dividiendo por la pendiente. x̂ es una estimación, no verdad exacta. La inversión exige b distinto de cero. Si b es muy pequeño amplifica errores pequeños de lectura; una fórmula elegante no elimina ese problema.

x_hat = (y-a_hat)/b_hat y = 7.61 degC => x_hat = (7.61-2)/1.1 = 5.1 degC

Comprobamos con referencias nuevas de 5, 15, 25 y 35 °C, ausentes del ajuste. Generamos lecturas con la misma relación y desviaciones alternas +0,11 y −0,11 °C. La primera es 7,61, corregida a 5,1: queda +0,1 °C de error. Los cuatro valores están dentro del intervalo; no prueban extrapolación. Son puntos separados del ajuste, no validación en instrumentos independientes.

Referencia °CLectura °CCorregido °CError bruto °CError corregido °C
57.615.12.610.1
1518.3914.93.39-0.1
2529.6125.14.610.1
3540.3934.95.39-0.1

Todas las columnas están en °C; el error es estimación menos referencia. También calculamos el error absoluto medio, MAE: sumar valores absolutos y dividir entre cuatro, conservando aparte los signos. Las lecturas brutas dan 4 °C y las corregidas 0,1 °C. El programa calcula ambos. La construcción favorece la mejora; no predice cuánto mejorará un sensor real ni la exactitud de una IA.

MAE = (1/n)*sum_i abs(estimate_i-reference_i) raw_MAE = 4.00 degC ; corrected_MAE = 0.10 degC
Datos totalmente sintéticos: a la izquierda, desviaciones de diez lecturas de ajuste; a la derecha, errores de cuatro controles separados antes y después de corregir. Ejes en °C, sin medidas de hardware.
Datos totalmente sintéticos: a la izquierda, desviaciones de diez lecturas de ajuste; a la derecha, errores de cuatro controles separados antes y después de corregir. Ejes en °C, sin medidas de hardware.

El panel izquierdo representa lectura menos referencia: la desviación crece con la temperatura, coherente con el error de escala construido. A la derecha, los cuatro errores pasan de varios grados positivos a ±0,1. Las escalas verticales iguales permiten comparar magnitudes, no convierten cuatro puntos en una distribución estadística. Dibujar solo las lecturas parecería casi perfectamente lineal y ocultaría la importancia de la desviación.

Corregir el sesgo no vuelve preciso un instrumento ruidoso

Sesgo es desviación sistemática; precisión describe la dispersión de medidas repetidas en condiciones definidas. Son distintos. NIST advierte, al tratar fallos de calibración, que corregir no resuelve poca precisión ni cambios incontrolados en el tiempo. La variabilidad aquí es elegida, pequeña y simétrica; no estimamos deriva diaria, histéresis ni dependencia de humedad. La corrección fija puede fallar si después cambia la relación física.

No proponemos borrar automáticamente desviaciones grandes. Una lectura inusual puede revelar una conexión intermitente, un cambio real o una referencia sin estabilizar. Excluirla exige motivo y trazabilidad. También debe cuestionarse la recta: residuos curvos pueden indicar una relación no afín. Más parámetros ajustan mejor los mismos puntos sin garantizar nuevas medidas. La comparación decisiva usa condiciones y puntos no empleados para elegir la corrección.

Si mañana cambia el desplazamiento, puede fallar la corrección anterior

Probemos la estabilidad: añadimos 0,55 °C a las cuatro lecturas sin reajustar coeficientes. La corrección anterior divide ese cambio por 1,1 y desplaza cada estimación +0,5 °C. Los errores son +0,6, +0,4, +0,6 y +0,4 °C; el MAE sube a 0,5 °C. Son cálculos sobre datos construidos, no deriva observada. Conservar la corrección no elimina la necesidad de comparar con referencias.

delta_x_hat = delta_y/b_hat = 0.55/1.1 = 0.5 degC MAE_after_assumed_offset_change = 0.5 degC

La inversión muestra además sensibilidad local: con coeficientes fijos, una desviación de lectura de 0,2 °C induce unos 0,1818 °C en la estimación al dividir por 1,1. No es incertidumbre total. Excluye incertidumbre de coeficientes y referencia, posición de sondas y validez del modelo. Confundir sensibilidad con un intervalo de exactitud atribuye una calidad no medida. Debe conservarse esta distinción al comparar placas y algoritmos.

La decisión operativa necesita una tolerancia justificada por la tarea. Una desviación aceptable para describir la tendencia de una sala puede no servir para otro proceso; no fijamos umbrales universales. Cerca de una decisión importa la incertidumbre restante, no cuántos decimales imprime el software. La precisión aritmética no vuelve igualmente precisos los datos físicos. Por eso mantenemos unidades e hipótesis sin prometer una calibración lista para usar.

Dónde cambia la decisión en un dispositivo embebido

Embebido significa que el software vive en un dispositivo dedicado, a menudo con memoria, energía y tiempo limitados. La corrección afín requiere una resta y una división por muestra, no reentrenar una red. Es un recuento de operaciones, no latencia medida: importan representación numérica, bibliotecas y adquisición. Dos coeficientes no son toda la RAM del sistema. No damos milisegundos, vatios ni julios porque no los medimos.

Cambiar dónde se aplica la corrección cambia el significado de la entrada al modelo. Corregir datos históricos ya corregidos añade error. Si el modelo aprendió con lecturas brutas, cambiar su escala puede alterar decisiones: hay que reevaluar la cadena con etiquetas independientes. Versión de coeficientes, unidades, intervalo válido y versión del modelo deben acompañar los registros. Cambiar dos números y ver menos alarmas no basta.

También comparemos una solución sin IA: una regla sobre una magnitud bien medida puede bastar para un requisito sencillo. En cambio, calibrar no repara un cambio real entre temperatura y resultado del proceso. Si el sensor concuerda con referencias independientes pero empeora la predicción en casos nuevos etiquetados, reentrenar, añadir variables o mantener el proceso vuelven a ser hipótesis razonables. No hay elección universal: la evidencia debe separar fallo de medida y cambio de tarea.

Qué hemos establecido y qué falta

El contraejemplo establece que una lectura no identifica la causa; después comprobamos numéricamente la corrección afín en valores sintéticos aparte. No demostramos deriva real ni necesidad de reentrenar. La decisión práctica es obtener una comparación independiente antes de intervenir a ciegas. Mejorar la medida y mejorar la tarea final son comprobaciones distintas; deben documentarse ambas al cambiar una cadena operativa.

Faltan pruebas en el intervalo real, referencias con incertidumbre declarada, repeticiones separadas en el tiempo y condiciones ambientales pertinentes. En hardware hay que comprobar conversiones, precisión numérica, datos fuera de rango y reversión de configuraciones. No tratamos decisiones clínicas ni un dispositivo de seguridad. EL-AI no se presenta como fabricante de sensores ni autora de pruebas: el interés editorial por sistemas embebidos no documenta productos o instalaciones disponibles.

El código usa Decimal para conservar exactamente las entradas decimales. Crea diez pares, calcula medias y sumas, estima dos parámetros y comprueba cuatro puntos y el contraejemplo. La complejidad y la lista guardada crecen linealmente con los pares. No es una biblioteca para microcontroladores ni mide memoria del dispositivo. Las aserciones documentan la aritmética ejecutada; no sustituyen pruebas metrológicas, estadísticas o de integración.

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))

Código, datos e instrucciones · JSON. Cálculos didácticos ejecutados con Python 3.14.0; figuras con Matplotlib 3.11.2. Análisis asistido por IA, sin afirmar revisión por pares ni humana. Portada original ImageGen ilustrativa: no documenta personas, sedes ni instalaciones de EL-AI. Fuentes consultadas el 30 de octubre de 2026.