Thuật toán đơn giản để phát hiện ngoại lệ trực tuyến của chuỗi thời gian chung


88

Tôi đang làm việc với một lượng lớn chuỗi thời gian. Các chuỗi thời gian này về cơ bản là các phép đo mạng cứ sau 10 phút và một số trong số chúng là định kỳ (tức là băng thông), trong khi một số khác không (tức là lượng lưu lượng định tuyến).

Tôi muốn một thuật toán đơn giản để thực hiện "phát hiện ngoại lệ" trực tuyến. Về cơ bản, tôi muốn giữ trong bộ nhớ (hoặc trên đĩa) toàn bộ dữ liệu lịch sử cho từng chuỗi thời gian và tôi muốn phát hiện bất kỳ ngoại lệ nào trong một kịch bản trực tiếp (mỗi lần lấy một mẫu mới). Cách tốt nhất để đạt được những kết quả này là gì?

Tôi hiện đang sử dụng một trung bình di động để loại bỏ một số tiếng ồn, nhưng sau đó thì sao? Những điều đơn giản như độ lệch chuẩn, điên, ... đối với toàn bộ tập dữ liệu không hoạt động tốt (tôi không thể giả sử chuỗi thời gian là ổn định) và tôi muốn một cái gì đó "chính xác" hơn, lý tưởng là một hộp đen như:

double out_d_dection (double * vector, double value);

trong đó vectơ là mảng kép chứa dữ liệu lịch sử và giá trị trả về là điểm bất thường cho "giá trị" mẫu mới.


1
Để rõ ràng, đây là câu hỏi ban đầu trên SO: stackoverflow.com/questions/3390458/NH
Matt Parker

1
Tôi nghĩ chúng ta nên khuyến khích người đăng bài đăng liên kết như một phần của câu hỏi nếu họ đã đăng cùng một câu hỏi tại một trang web SE khác.

vâng, bạn hoàn toàn đúng. Lần sau tôi sẽ đề cập rằng tin nhắn được gạch chéo.
gianluca

Tôi cũng đề nghị bạn kiểm tra các liên kết Liên quan khác ở phía bên phải của trang. Đây là một câu hỏi phổ biến và nó đã đưa ra một loạt các câu hỏi trước đây. Nếu họ không thỏa đáng, tốt nhất là cập nhật câu hỏi của bạn về các chi tiết cụ thể về tình huống của bạn.
Andy W

Bắt tốt, @Andy! Hãy hợp nhất câu hỏi này với câu hỏi khác.
whuber

Câu trả lời:


75

Dưới đây là một hàm R đơn giản sẽ tìm thấy các ngoại lệ chuỗi thời gian (và tùy chọn hiển thị chúng trong một âm mưu). Nó sẽ xử lý chuỗi thời gian theo mùa và không theo mùa. Ý tưởng cơ bản là tìm các ước tính mạnh mẽ về xu hướng và các thành phần theo mùa và trừ chúng. Sau đó tìm các ngoại lệ trong phần dư. Thử nghiệm cho các ngoại lệ còn lại giống như đối với boxplot tiêu chuẩn - các điểm lớn hơn 1,5IQR ở trên hoặc dưới các tứ phân vị trên và dưới được giả định là các ngoại lệ. Số lượng IQR trên / dưới các ngưỡng này được trả về dưới dạng "điểm số" ngoại lệ. Vì vậy, điểm số có thể là bất kỳ số dương nào, và sẽ bằng không đối với những người không ngoại lệ.

Tôi nhận ra rằng bạn không thực hiện điều này trong R, nhưng tôi thường thấy một hàm R là một nơi tốt để bắt đầu. Sau đó, nhiệm vụ là dịch nó sang bất kỳ ngôn ngữ nào được yêu cầu.

tsoutliers <- function(x,plot=FALSE)
{
    x <- as.ts(x)
    if(frequency(x)>1)
        resid <- stl(x,s.window="periodic",robust=TRUE)$time.series[,3]
    else
    {
        tt <- 1:length(x)
        resid <- residuals(loess(x ~ tt))
    }
    resid.q <- quantile(resid,prob=c(0.25,0.75))
    iqr <- diff(resid.q)
    limits <- resid.q + 1.5*iqr*c(-1,1)
    score <- abs(pmin((resid-limits[1])/iqr,0) + pmax((resid - limits[2])/iqr,0))
    if(plot)
    {
        plot(x)
        x2 <- ts(rep(NA,length(x)))
        x2[score>0] <- x[score>0]
        tsp(x2) <- tsp(x)
        points(x2,pch=19,col="red")
        return(invisible(score))
    }
    else
        return(score)
}

+1 từ tôi, xuất sắc. Vậy> 1,5 X phạm vi liên phân vị là định nghĩa đồng thuận của một ngoại lệ cho chuỗi phụ thuộc thời gian? Đó sẽ là tốt đẹp để có một tài liệu tham khảo độc lập quy mô.
doug

Các thử nghiệm ngoại lệ là trên phần dư, vì vậy hy vọng sự phụ thuộc thời gian là nhỏ. Tôi không biết về sự đồng thuận, nhưng boxplots thường được sử dụng để phát hiện ngoại lệ và dường như hoạt động khá tốt. Có những phương pháp tốt hơn nếu ai đó muốn làm cho chức năng trở nên lạ hơn một chút.
Rob Hyndman

Thực sự cảm ơn sự giúp đỡ của bạn, tôi thực sự đánh giá cao. Bây giờ tôi khá bận rộn trong công việc, nhưng tôi sẽ thử nghiệm một cách tiếp cận như của bạn càng sớm càng tốt, và tôi sẽ quay lại với những cân nhắc cuối cùng của mình về vấn đề này. Người ta chỉ nghĩ: trong chức năng của bạn, từ những gì tôi thấy, tôi phải chỉ định thủ công tần số của chuỗi thời gian (khi xây dựng nó) và thành phần thời vụ chỉ được xem xét khi tần số lớn hơn 1. Có cách nào mạnh mẽ không để đối phó với điều này tự động?
gianluca

1
Có, tôi đã giả sử tần số được biết và chỉ định. Có các phương pháp để ước tính tần số tự động, nhưng điều đó sẽ làm phức tạp chức năng đáng kể. Nếu bạn cần ước tính tần suất, hãy thử đặt một câu hỏi riêng về nó - và có lẽ tôi sẽ cung cấp câu trả lời! Nhưng nó cần nhiều không gian hơn tôi có sẵn trong một bình luận.
Rob Hyndman

2
@Marcin, tôi khuyên bạn nên tự đâm vào nó. Có thể dán giải pháp của bạn tại gist.github.com và đăng câu hỏi SO khi bạn hoàn thành, để người khác kiểm tra công việc của bạn?
Ken Williams

27

Một giải pháp tốt sẽ có một số thành phần, bao gồm:

  • Sử dụng một cửa sổ kháng, di chuyển trơn tru để loại bỏ sự không cố định.

  • Thể hiện lại dữ liệu gốc sao cho phần dư tương ứng với độ mịn được phân bổ đối xứng. Do tính chất của dữ liệu của bạn, có khả năng căn bậc hai hoặc logarit của chúng sẽ cung cấp các phần dư đối xứng.

  • Áp dụng các phương pháp biểu đồ kiểm soát, hoặc ít nhất là tư duy biểu đồ kiểm soát, cho phần dư.

Theo như cách cuối cùng, tư duy biểu đồ kiểm soát cho thấy các ngưỡng "thông thường" như 2 SD hoặc 1,5 lần IQR ngoài các bộ tứ hoạt động kém vì chúng kích hoạt quá nhiều tín hiệu ngoài tầm kiểm soát sai. Mọi người thường sử dụng 3 SD trong công việc biểu đồ kiểm soát, gấp 2,5 (hoặc thậm chí 3) lần IQR ngoài các tứ phân vị sẽ là điểm khởi đầu tốt.

Tôi đã ít nhiều vạch ra bản chất của giải pháp của Rob Hyndman trong khi thêm vào đó hai điểm chính: nhu cầu tiềm năng để thể hiện lại dữ liệu và sự khôn ngoan của việc bảo thủ hơn trong việc báo hiệu một ngoại lệ. Tuy nhiên, tôi không chắc chắn rằng Loess tốt cho một máy dò trực tuyến, bởi vì nó không hoạt động tốt ở các điểm cuối. Thay vào đó, bạn có thể sử dụng một cái gì đó đơn giản như bộ lọc trung vị chuyển động (như trong làm mịn kháng Tukey). Nếu các ngoại lệ không xuất hiện theo cụm, bạn có thể sử dụng một cửa sổ hẹp (5 điểm dữ liệu, có lẽ, sẽ bị phá vỡ chỉ với một cụm từ 3 ngoại lệ trở lên trong một nhóm 5).

Khi bạn đã thực hiện phân tích để xác định biểu hiện lại dữ liệu tốt, có thể bạn sẽ không cần phải thay đổi biểu thức lại. Do đó, trình phát hiện trực tuyến của bạn thực sự chỉ cần tham chiếu các giá trị gần đây nhất (cửa sổ mới nhất) bởi vì nó hoàn toàn không sử dụng dữ liệu trước đó. Nếu bạn có chuỗi thời gian thực sự dài, bạn có thể đi xa hơn để phân tích tự tương quan và tính thời vụ (chẳng hạn như biến động hàng ngày hoặc hàng tuần) để cải thiện quy trình.


3
Đây là một câu trả lời phi thường cho phân tích thực tế. Không bao giờ có thể nghĩ cần phải thử 3 IQR ngoài các bộ tứ.
John Robertson

3
@ John, 1.5 IQR là đề xuất ban đầu của Tukey cho những người râu dài nhất trên boxplot và 3 IQR là đề xuất của anh ta về việc đánh dấu các điểm là "vượt xa" (một đoạn ngắn trong cụm từ phổ biến của 60). Điều này được tích hợp vào nhiều thuật toán boxplot. Khuyến nghị được phân tích trên lý thuyết trong Hoaglin, Mosteller, & Tukey, Hiểu phân tích dữ liệu mạnh mẽ và khám phá.
whuber

Điều này xác nhận dữ liệu chuỗi thời gian tôi đã cố gắng phân tích. Cửa sổ trung bình và cũng là một độ lệch chuẩn của cửa sổ. ((x - avg) / sd)> 3 dường như là những điểm tôi muốn gắn cờ là ngoại lệ. Ít nhất cũng cảnh báo là ngoại lệ, tôi gắn cờ bất cứ thứ gì cao hơn 10 sd là ngoại lệ lỗi cực đoan. Vấn đề tôi gặp phải là chiều dài cửa sổ lý tưởng là gì? Tôi đang chơi với bất cứ thứ gì trong khoảng 4-8 điểm dữ liệu.
Josh Đỉnh cao

1
@Neo Đặt cược tốt nhất của bạn có thể là thử nghiệm một tập hợp con dữ liệu của bạn và xác nhận kết luận của bạn với các bài kiểm tra trong phần còn lại. Bạn cũng có thể tiến hành xác thực chéo chính thức hơn (nhưng cần có sự chăm sóc đặc biệt với dữ liệu chuỗi thời gian do sự phụ thuộc lẫn nhau của tất cả các giá trị).
whuber

17

(Câu trả lời này đã trả lời một câu hỏi trùng lặp (hiện đã đóng) tại Phát hiện các sự kiện nổi bật , trong đó trình bày một số dữ liệu ở dạng đồ họa.)


Phát hiện ngoại lệ phụ thuộc vào bản chất của dữ liệu và vào những gì bạn sẵn sàng thừa nhận về chúng. Phương pháp mục đích chung dựa trên số liệu thống kê mạnh mẽ. Tinh thần của phương pháp này là đặc trưng hóa phần lớn dữ liệu theo cách không bị ảnh hưởng bởi bất kỳ ngoại lệ nào và sau đó chỉ ra bất kỳ giá trị riêng lẻ nào không phù hợp với đặc tính đó.

Bởi vì đây là một chuỗi thời gian, nó thêm vào sự phức tạp của việc cần (phát hiện lại) các ngoại lệ trên cơ sở liên tục. Nếu điều này được thực hiện khi chuỗi mở ra, thì chúng tôi chỉ được phép sử dụng dữ liệu cũ hơn để phát hiện, không phải dữ liệu trong tương lai! Hơn nữa, vì bảo vệ chống lại nhiều thử nghiệm lặp đi lặp lại, chúng tôi muốn sử dụng một phương pháp có tỷ lệ dương tính giả rất thấp.

Những cân nhắc này đề nghị chạy một cửa sổ di chuyển đơn giản, mạnh mẽ kiểm tra ngoại lệ đối với dữ liệu . Có nhiều khả năng, nhưng một khả năng đơn giản, dễ hiểu và dễ thực hiện dựa trên MAD đang chạy: độ lệch tuyệt đối trung vị so với trung vị. Đây là một thước đo mạnh mẽ của sự thay đổi trong dữ liệu, gần giống với độ lệch chuẩn. Một đỉnh cao bên ngoài sẽ là một số MAD hoặc lớn hơn trung bình.

Vẫn còn một số điều chỉnh cần thực hiện : độ lệch của phần lớn dữ liệu nên được xem là bao xa và thời gian quay ngược thời gian bao lâu? Hãy để những điều này làm tham số cho thử nghiệm. Đây là một Rtriển khai được áp dụng cho dữ liệu (với để mô phỏng dữ liệu) với các giá trị tương ứng :n = 1150 yx=(1,2,,n)n=1150y

# Parameters to tune to the circumstances:
window <- 30
threshold <- 5

# An upper threshold ("ut") calculation based on the MAD:
library(zoo) # rollapply()
ut <- function(x) {m = median(x); median(x) + threshold * median(abs(x - m))}
z <- rollapply(zoo(y), window, ut, align="right")
z <- c(rep(z[1], window-1), z) # Use z[1] throughout the initial period
outliers <- y > z

# Graph the data, show the ut() cutoffs, and mark the outliers:
plot(x, y, type="l", lwd=2, col="#E00000", ylim=c(0, 20000))
lines(x, z, col="Gray")
points(x[outliers], y[outliers], pch=19)

Áp dụng cho một tập dữ liệu như đường cong màu đỏ được minh họa trong câu hỏi, nó tạo ra kết quả này:

Âm mưu

Dữ liệu được hiển thị bằng màu đỏ, cửa sổ 30 ngày của ngưỡng trung bình + 5 * MAD màu xám và các ngoại lệ - đơn giản là các giá trị dữ liệu trên đường cong màu xám - màu đen.

(Ngưỡng chỉ có thể được tính bắt đầu ở cuối cửa sổ ban đầu. Đối với tất cả dữ liệu trong cửa sổ ban đầu này, ngưỡng đầu tiên được sử dụng: đó là lý do tại sao đường cong màu xám nằm giữa x = 0 và x = 30.)

Tác động của việc thay đổi các tham số là (a) tăng giá trị windowsẽ có xu hướng làm phẳng đường cong màu xám và (b) tăng thresholdsẽ làm tăng đường cong màu xám. Biết được điều này, người ta có thể lấy một phân đoạn dữ liệu ban đầu và nhanh chóng xác định các giá trị của các tham số tách biệt tốt nhất các đỉnh ngoài với phần còn lại của dữ liệu. Áp dụng các giá trị tham số này để kiểm tra phần còn lại của dữ liệu. Nếu một biểu đồ cho thấy phương thức đang xấu đi theo thời gian, điều đó có nghĩa là bản chất của dữ liệu đang thay đổi và các tham số có thể cần điều chỉnh lại.

Lưu ý rằng phương pháp này ít giả định về dữ liệu: chúng không phải được phân phối bình thường; họ không cần phải thể hiện bất kỳ định kỳ; họ thậm chí không phải là không tiêu cực. Tất cả những gì nó giả định là dữ liệu hành xử theo những cách tương đối hợp lý theo thời gian và các đỉnh ngoại vi cao hơn rõ rệt so với phần còn lại của dữ liệu.


Nếu bất cứ ai muốn thử nghiệm (hoặc so sánh một số giải pháp khác với giải pháp được cung cấp ở đây), đây là mã tôi đã sử dụng để tạo dữ liệu như những gì được hiển thị trong câu hỏi.

n.length <- 1150
cycle.a <- 11
cycle.b <- 365/12
amp.a <- 800
amp.b <- 8000

set.seed(17)
x <- 1:n.length
baseline <- (1/2) * amp.a * (1 + sin(x * 2*pi / cycle.a)) * rgamma(n.length, 40, scale=1/40)
peaks <- rbinom(n.length, 1,  exp(2*(-1 + sin(((1 + x/2)^(1/5) / (1 + n.length/2)^(1/5))*x * 2*pi / cycle.b))*cycle.b))
y <- peaks * rgamma(n.length, 20, scale=amp.b/20) + baseline

Đây là một giải pháp thực sự thú vị và tôi đánh giá cao rằng tôi có thể thực hiện nó mà không cần sử dụng R (chỉ sử dụng JavaScript đơn giản trong một ứng dụng web). Cảm ơn!
hgoebl

15

Nếu bạn lo lắng về các giả định với bất kỳ phương pháp cụ thể nào, một cách tiếp cận là đào tạo một số người học về các tín hiệu khác nhau, sau đó sử dụng các phương pháp tập hợp và tổng hợp qua "phiếu" từ người học của bạn để phân loại ngoại lệ.

BTW, điều này có thể đáng đọc hoặc đọc lướt qua vì nó tham khảo một vài cách tiếp cận vấn đề.


5

Tôi đoán mô hình chuỗi thời gian tinh vi sẽ không hiệu quả với bạn vì cần có thời gian để phát hiện các ngoại lệ sử dụng phương pháp này. Do đó, đây là một cách giải quyết:

  1. Trước tiên, hãy thiết lập các mẫu lưu lượng truy cập 'bình thường' trong một năm dựa trên phân tích thủ công dữ liệu lịch sử chiếm thời gian trong ngày, ngày trong tuần so với cuối tuần, tháng trong năm, v.v.

  2. Sử dụng đường cơ sở này cùng với một số cơ chế đơn giản (ví dụ: đường trung bình được đề xuất bởi Carlos) để phát hiện các ngoại lệ.

Bạn cũng có thể muốn xem lại tài liệu kiểm soát quy trình thống kê cho một số ý tưởng.


1
Vâng, đây chính xác là những gì tôi đang làm: cho đến bây giờ tôi tự chia tín hiệu thành các khoảng thời gian, để cho mỗi tín hiệu đó tôi có thể xác định khoảng tin cậy trong đó tín hiệu được coi là đứng yên và do đó tôi có thể sử dụng các phương pháp tiêu chuẩn như vậy là độ lệch chuẩn, ... Vấn đề thực sự là tôi không thể quyết định mô hình dự kiến ​​cho tất cả các tín hiệu tôi phải phân tích, và đó là lý do tại sao tôi đang tìm kiếm thứ gì đó thông minh hơn.
gianluca

Đây là một ý tưởng: Bước 1: Thực hiện và ước tính mô hình chuỗi thời gian chung trên cơ sở một lần dựa trên dữ liệu lịch sử. Điều này có thể được thực hiện ngoại tuyến. Bước 2: Sử dụng mô hình kết quả để phát hiện các ngoại lệ. Bước 3: Ở một số tần số (có lẽ mỗi tháng?), Hiệu chỉnh lại mô hình chuỗi thời gian (điều này có thể được thực hiện ngoại tuyến) để phát hiện bước 2 của các ngoại lệ không đi quá nhiều so với các mẫu lưu lượng truy cập hiện tại. Điều đó sẽ làm việc cho bối cảnh của bạn?

Vâng, điều này có thể làm việc. Tôi đã suy nghĩ về một cách tiếp cận tương tự (tính toán lại đường cơ sở mỗi tuần, có thể cần nhiều CPU nếu bạn có hàng trăm chuỗi thời gian đơn biến để phân tích). Câu hỏi khó thực sự của BTW là "thuật toán kiểu hộp đen tốt nhất để mô hình hóa một tín hiệu hoàn toàn chung chung, xem xét nhiễu, ước tính xu hướng và tính thời vụ là gì?". AFAIK, mọi cách tiếp cận trong văn học đều yêu cầu giai đoạn "điều chỉnh tham số" thực sự khó khăn và phương pháp tự động duy nhất tôi tìm thấy là mô hình ARIMA của Hyndman ( robjhyndman.com/software/forecast ). Tui bỏ lỡ điều gì vậy?
gianluca

Xin lưu ý rằng tôi không quá lười biếng trong việc điều tra các tham số này, vấn đề là các giá trị này cần được đặt theo mẫu dự kiến ​​của tín hiệu và trong kịch bản của tôi, tôi không thể đưa ra bất kỳ giả định nào.
gianluca

Các mô hình ARIMA là các mô hình chuỗi thời gian cổ điển có thể được sử dụng để phù hợp với dữ liệu chuỗi thời gian. Tôi sẽ khuyến khích bạn khám phá việc áp dụng các mô hình ARIMA. Bạn có thể đợi Rob trực tuyến và có lẽ anh ấy sẽ hòa nhập với một số ý tưởng.

5

Điều chỉnh dữ liệu theo mùa sao cho một ngày bình thường trông gần bằng phẳng hơn. Bạn có thể lấy mẫu 5:00 chiều ngày hôm nay và trừ hoặc chia trung bình của 30 ngày trước đó vào lúc 5:00 chiều. Sau đó nhìn qua độ lệch chuẩn N (được đo bằng cách sử dụng dữ liệu được điều chỉnh trước) cho các ngoại lệ. Điều này có thể được thực hiện riêng cho "mùa" hàng tuần và hàng ngày.


Một lần nữa, điều này hoạt động khá tốt nếu tín hiệu được cho là có tính thời vụ như vậy, nhưng nếu tôi sử dụng chuỗi thời gian hoàn toàn khác (tức là thời gian khứ hồi TCP trung bình theo thời gian), phương pháp này sẽ không hoạt động (vì nó sẽ tốt hơn để xử lý cái đó với trung bình toàn cầu đơn giản và độ lệch chuẩn sử dụng cửa sổ trượt chứa dữ liệu lịch sử).
gianluca

1
Trừ khi bạn sẵn sàng thực hiện mô hình chuỗi thời gian chung (mang lại nhược điểm của nó về độ trễ, v.v.) Tôi bi quan rằng bạn sẽ tìm thấy một triển khai chung, đồng thời đủ đơn giản để làm việc cho tất cả các loại chuỗi thời gian.

Một nhận xét khác: Tôi biết một câu trả lời tốt có thể là "vì vậy bạn có thể ước tính tính chu kỳ của tín hiệu và quyết định thuật toán sử dụng theo nó", nhưng tôi không tìm thấy giải pháp thực sự tốt cho vấn đề khác này (tôi đã chơi một bit với phân tích quang phổ bằng cách sử dụng DFT và phân tích thời gian bằng cách sử dụng chức năng tự tương quan, nhưng chuỗi thời gian của tôi chứa rất nhiều nhiễu và các phương pháp như vậy cho một số kết quả điên rồ nhất thời gian)
gianluca

Một nhận xét cho nhận xét cuối cùng của bạn: đó là lý do tại sao tôi đang tìm kiếm một cách tiếp cận chung chung hơn, nhưng tôi cần một loại "hộp đen" vì tôi không thể đưa ra bất kỳ giả định nào về tín hiệu được phân tích, và do đó tôi không thể tạo ra "Bộ tham số tốt nhất cho thuật toán học tập".
gianluca

@gianluca Như bạn đã xác định cấu trúc ARIMA cơ bản có thể che dấu sự bất thường. Công thức pf không chính xác có thể gây ra các biến như giờ trong ngày, ngày trong tuần, hiệu ứng ngày lễ, vv cũng có thể che dấu sự bất thường. Câu trả lời khá rõ ràng bạn cần có một phương pháp tốt để phát hiện hiệu quả sự bất thường. Trích lời Bacon, "Đối với bất cứ ai biết các cách của Tự nhiên sẽ dễ dàng nhận thấy những sai lệch của cô ấy và mặt khác, bất cứ ai biết những sai lệch của cô ấy sẽ mô tả chính xác hơn các cách của cô ấy."
IrishStat

3

Một cách khác để tiếp cận được Rob Hyndman vạch ra sẽ là sử dụng Dự báo Holt-Winters . Các dải tin cậy có nguồn gốc từ Holt-Winters có thể được sử dụng để phát hiện các ngoại lệ. Dưới đây là một bài viết mô tả cách sử dụng Holt-Winters cho "Phát hiện hành vi sai lệch trong chuỗi thời gian để giám sát mạng". Một triển khai cho RRDTool có thể được tìm thấy ở đây .


2

Phân tích quang phổ phát hiện định kỳ trong chuỗi thời gian đứng yên. Cách tiếp cận miền tần số dựa trên ước tính mật độ phổ là cách tiếp cận tôi muốn giới thiệu như bước đầu tiên của bạn.

Nếu trong một khoảng thời gian nhất định, sự bất thường có nghĩa là một đỉnh cao hơn nhiều so với điển hình của khoảng thời gian đó thì chuỗi có sự bất thường như vậy sẽ không ổn định và phân tích quang phổ sẽ không phù hợp. Nhưng giả sử bạn đã xác định khoảng thời gian có sự bất thường, bạn sẽ có thể xác định xấp xỉ chiều cao cực đại bình thường và sau đó có thể đặt ngưỡng ở một mức nào đó trên mức trung bình đó để chỉ định các trường hợp bất thường.


2
Bạn có thể giải thích làm thế nào giải pháp này sẽ phát hiện "bất thường cục bộ"? Trình bày một ví dụ làm việc sẽ vô cùng hữu ích. (Thành thật mà nói, tôi khuyên bạn nên làm điều này bởi vì khi thực hiện một bài tập như vậy tôi tin rằng bạn sẽ khám phá ra rằng đề xuất của bạn không hiệu quả để phát hiện ngoại lệ. Nhưng tôi có thể sai ...)
whuber

1
@whuber Phân tích quang phổ sẽ chỉ xác định vị trí của tất cả các đỉnh. Bước tiếp theo sẽ phù hợp với mô hình chuỗi yime sử dụng thuật ngữ sin và cosin với tần số được xác định từ phân tích quang phổ và biên độ ước tính từ dữ liệu. Nếu bất thường có nghĩa là các đỉnh có biên độ rất cao thì tôi nghĩ rằng một ngưỡng trên biên độ sẽ phù hợp. Nếu bất thường cục bộ có nghĩa là trong một khoảng thời gian, biên độ đôi khi lớn hơn đáng kể so với khác, thì chuỗi này không ổn định và phân tích quang phổ sẽ không bị khủng bố.
Michael Chernick

1
Tôi không theo dõi kết luận về việc thiếu văn phòng phẩm. Ví dụ, tổng của dạng sóng hình sin thông thường và quy trình điểm Poisson được đánh dấu sẽ đứng yên, nhưng nó sẽ không thể hiện bất kỳ tính tuần hoàn nào bạn tìm kiếm. Tuy nhiên, bạn sẽ tìm thấy một số đỉnh mạnh trong biểu đồ, nhưng chúng sẽ cho bạn biết không có gì liên quan đến các đỉnh dữ liệu bất thường được giới thiệu bởi thành phần quy trình Poisson.
whuber

1
Một chuỗi thời gian đứng yên có một giá trị trung bình không đổi. Nếu cực đại của một thành phần định kỳ có thể thay đổi theo thời gian, nó có thể khiến giá trị trung bình thay đổi theo thời gian và do đó các cơn bão sẽ không cố định.
Michael Chernick

2

Vì là dữ liệu chuỗi thời gian, bộ lọc theo cấp số nhân đơn giản http://en.wikipedia.org/wiki/Exponential_smoothing sẽ làm mịn dữ liệu. Đây là một bộ lọc rất tốt vì bạn không cần phải tích lũy các điểm dữ liệu cũ. Hãy so sánh mỗi mới được làm nhẵn giá trị dữ liệu với nó unsmoothed giá trị. Khi độ lệch vượt quá ngưỡng xác định trước nhất định (tùy thuộc vào những gì bạn tin là ngoại lệ trong dữ liệu của bạn), thì ngoại lệ của bạn có thể dễ dàng được phát hiện.

Trong CI sẽ thực hiện như sau đối với mẫu 16 bit thời gian thực (tôi tin rằng điều này được tìm thấy ở đâu đó tại đây <Giải thích - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order -iir-xấp xỉ-to-a-di chuyển-trung bình-bộ lọc >)

#define BITS2 2     //< This is roughly = log2( 1 / alpha ), depending on how smooth you want your data to be

short Simple_Exp_Filter(int new_sample) 
{static int filtered_sample = 0;
long local_sample = sample << 16; /*We assume it is a 16 bit sample */
filtered_sample += (local_sample - filtered_sample) >> BITS2;   
return (short) ((filtered_sample+0x8000) >> 16); //< Round by adding .5 and truncating.   
}


int main()
{
newly_arrived = function_receive_new_sample();
filtered_sample = Simple_Exp_Filter(newly_arrived);
if (abs(newly_arrived - filtered_sample)/newly_arrived > THRESHOLD)
    {
    //AN OUTLIER HAS BEEN FOUND
    }
 return 0;   
}

1

Bạn có thể sử dụng độ lệch chuẩn của các phép đo N cuối cùng (bạn phải chọn một N phù hợp). Điểm số dị thường tốt sẽ là số đo độ lệch chuẩn so với trung bình di động.


Cảm ơn phản hồi của bạn, nhưng điều gì sẽ xảy ra nếu tín hiệu thể hiện tính thời vụ cao (nghĩa là rất nhiều phép đo mạng được đặc trưng bởi mẫu hàng ngày và hàng tuần cùng một lúc, ví dụ như đêm so với ngày hoặc cuối tuần so với ngày làm việc)? Một cách tiếp cận dựa trên độ lệch chuẩn sẽ không hoạt động trong trường hợp đó.
gianluca

Ví dụ: nếu tôi nhận được một mẫu mới cứ sau 10 phút và tôi đang thực hiện phát hiện ngoại lệ về việc sử dụng băng thông mạng của một công ty, về cơ bản vào lúc 6 giờ chiều, biện pháp này sẽ giảm xuống (đây là mô hình bình thường dự kiến) và độ lệch chuẩn được tính trên cửa sổ trượt sẽ không thành công (vì chắc chắn nó sẽ kích hoạt cảnh báo). Đồng thời, nếu biện pháp rơi xuống lúc 4 giờ chiều (lệch khỏi đường cơ sở thông thường), đây là một ngoại lệ thực sự.
gianluca

1

những gì tôi làm là nhóm các phép đo theo giờ và ngày trong tuần và so sánh độ lệch chuẩn của điều đó. Vẫn không đúng cho những thứ như ngày lễ và mùa hè / mùa đông nhưng hầu hết đều đúng.

Nhược điểm là bạn thực sự cần phải thu thập một năm hoặc lâu hơn dữ liệu để có đủ để stddev bắt đầu có ý nghĩa.


Cảm ơn bạn, đó chính xác là những gì tôi đã cố gắng tránh (có rất nhiều mẫu làm đường cơ sở), vì tôi muốn một cách tiếp cận thực sự phản ứng (ví dụ: phát hiện trực tuyến, có thể là "bẩn", sau 1-2 tuần của đường cơ sở)
gianluca

0

Tôi đề nghị chương trình dưới đây, có thể được thực hiện trong một ngày hoặc lâu hơn:

Đào tạo

  • Thu thập càng nhiều mẫu bạn có thể giữ trong bộ nhớ
  • Xóa các ngoại lệ rõ ràng bằng cách sử dụng độ lệch chuẩn cho từng thuộc tính
  • Tính toán và lưu trữ ma trận tương quan và giá trị trung bình của từng thuộc tính
  • Tính toán và lưu trữ khoảng cách Mahalanobis của tất cả các mẫu của bạn

Tính "vượt trội":

Đối với mẫu duy nhất mà bạn muốn biết "sự vượt trội" của nó:

  • Lấy phương tiện, ma trận hiệp phương sai và khoảng cách Mahalanobis từ đào tạo
  • Tính khoảng cách Mahalanobis "d" cho mẫu của bạn
  • Trả về phần trăm trong đó "d" rơi (sử dụng khoảng cách Mahalanobis từ đào tạo)

Đó sẽ là điểm số ngoại lệ của bạn: 100% là một ngoại lệ cực đoan.


Tái bút Khi tính toán khoảng cách Mahalanobis , sử dụng ma trận tương quan, không phải ma trận hiệp phương sai. Điều này mạnh hơn nếu các phép đo mẫu khác nhau về đơn vị và số lượng.


0

Đối với trường hợp người ta phải nhanh chóng tính toán các ngoại lệ, người ta có thể sử dụng ý tưởng của Rob Hyndman và Mahito Sugiyama ( https://github.com/BorgwardtLab/sampling-outlier-detection , thư viện (spout trước), hàm qsp) để tính toán các ngoại lệ như sau:

library(spoutlier)
rapidtsoutliers <- function(x,plot=FALSE,seed=123)
{
    set.seed(seed)
    x <- as.numeric(x)
    tt <- 1:length(x)
    qspscore <- qsp(x)
    limit <- quantile(qspscore,prob=c(0.95))
    score <- pmax((qspscore - limit),0)
    if(plot)
    {
        plot(x,type="l")
        x2 <- ts(rep(NA,length(x)))
        x2[score>0] <- x[score>0]
        tsp(x2) <- tsp(x)
        points(x2,pch=19,col="red")
        return(invisible(score))
    }
    else
        return(score)
}

0

phát hiện bất thường đòi hỏi phải xây dựng một phương trình mô tả kỳ vọng. Phát hiện can thiệp có sẵn trong cả môi trường phi nhân quả và nguyên nhân. Nếu một người có một loạt dự đoán như giá thì mọi thứ có thể hơi phức tạp. Các phản hồi khác ở đây dường như không tính đến nguyên nhân có thể gán được do các chuỗi dự đoán do người dùng chỉ định như giá cả và do đó có thể bị sai sót. Số lượng bán có thể phụ thuộc vào giá cả, có thể giá trước đó và có lẽ số lượng được bán trong quá khứ. Cơ sở để phát hiện sự bất thường (xung, xung theo mùa, thay đổi mức độ và xu hướng thời gian địa phương) được tìm thấy trong https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf


Liên kết không hoạt động, bạn có thể vui lòng sửa nó. Cảm ơn
Pankaj Joshi

xong ..................
IrishStat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.