Mỗi dòng có chuẩn riêng
Một ngưỡng chung cho mọi cảm biến luôn sai: nhiệt độ lò khác nhiệt độ kho. Thay vào đó, mỗi dòng tự học trung bình và độ dao động của chính nó trong một cửa sổ gần nhất.
Điểm z
Mỗi giá trị mới được đo bằng việc nó cách trung bình bao nhiêu lần độ lệch chuẩn. Vượt ngưỡng thì báo. Ngưỡng thấp thì nhạy nhưng hay báo nhầm; ngưỡng cao thì ít nhầm nhưng dễ bỏ sót.
const m = sum / WIN;
const v = Math.max(1e-6, sq / WIN - m * m); // phương sai
const z = (x - m) / Math.sqrt(v);
if (Math.abs(z) > thr) alert(sensor, z);Tính tăng dần: không tính lại cả cửa sổ
Giữ hai con số chạy: tổng và tổng bình phương. Khi điểm mới vào, cộng nó vào; khi điểm cũ nhất rời cửa sổ, trừ nó ra. Mỗi điểm dữ liệu chỉ tốn vài phép tính, bất kể cửa sổ dài bao nhiêu.
const old = win[head];
if (filled) { sum -= old; sq -= old * old; }
win[head] = x; head = (head + 1) % WIN;
sum += x; sq += x * x;Khi nào cần nhiều hơn
- Dữ liệu có chu kỳ ngày, tuần: so với cùng giờ hôm trước thay vì vài phút trước
- Nhiều cảm biến liên quan nhau: xét chúng cùng lúc thay vì từng dòng
- Xu hướng trôi chậm: thêm bước khử xu hướng trước khi tính điểm z
Trong thí nghiệm trên trang, 720 điểm mỗi giây được xử lý hoàn toàn trên trình duyệt; sự cố chèn vào được phát hiện ngay ở điểm dữ liệu kế tiếp.