อัลกอริทึมง่าย ๆ สำหรับการตรวจหาค่าผิดปกติทางออนไลน์ของอนุกรมเวลาทั่วไป


88

ฉันทำงานกับอนุกรมเวลาจำนวนมาก อนุกรมเวลาเหล่านี้โดยทั่วไปแล้วการวัดเครือข่ายมาทุก ๆ 10 นาทีและบางส่วนนั้นเป็นระยะ (เช่นแบนด์วิดท์) ในขณะที่บางส่วนไม่ได้เป็น (เช่นปริมาณการรับส่งข้อมูลเส้นทาง)

ฉันต้องการอัลกอริทึมง่าย ๆ สำหรับการทำแบบออนไลน์ โดยทั่วไปฉันต้องการเก็บไว้ในหน่วยความจำ (หรือบนดิสก์) ข้อมูลประวัติทั้งหมดสำหรับแต่ละชุดเวลาและฉันต้องการตรวจสอบค่าผิดปกติใด ๆ ในสถานการณ์สด (ทุกครั้งที่มีการสุ่มตัวอย่างใหม่) วิธีที่ดีที่สุดในการบรรลุผลลัพธ์เหล่านี้คืออะไร?

ฉันกำลังใช้ค่าเฉลี่ยเคลื่อนที่เพื่อลบเสียงรบกวน แต่แล้วจะทำอย่างไรต่อไป สิ่งที่เรียบง่ายเช่นค่าเบี่ยงเบนมาตรฐาน, บ้า, ... กับชุดข้อมูลทั้งหมดทำงานได้ไม่ดี (ฉันไม่สามารถคิดว่าอนุกรมเวลาคงที่) และฉันต้องการบางสิ่งที่ "แม่นยำ" ยิ่งกว่าเดิมกล่องดำแบบ:

double outlier_detection (double * vector, double value);

โดยที่ vector คืออาร์เรย์ของ double ที่มีข้อมูลประวัติและค่าส่งคืนคือคะแนนความผิดปกติสำหรับ "value" ตัวอย่างใหม่


1
เพียงเพื่อความชัดเจนนี่เป็นคำถามเดิมใน SO: stackoverflow.com/questions/3390458/ …
Matt Parker

1
ฉันคิดว่าเราควรสนับสนุนให้ผู้โพสต์โพสต์ลิงก์เป็นส่วนหนึ่งของคำถามหากพวกเขาโพสต์คำถามเดียวกันที่ไซต์ SE อื่น

ใช่คุณพูดถูก ครั้งต่อไปฉันจะพูดถึงว่ามีการข้ามข้อความ
gianluca

ฉันขอแนะนำให้คุณตรวจสอบลิงค์ที่เกี่ยวข้องอื่น ๆ ทางด้านขวาของหน้า นี่เป็นคำถามที่ได้รับความนิยมและเกิดขึ้นในคำถามที่หลากหลายก่อนหน้านี้ หากพวกเขาไม่พอใจที่ดีที่สุดคือการปรับปรุงคำถามของคุณเกี่ยวกับสถานการณ์เฉพาะของคุณ
Andy W

เยี่ยมมาก @Andy! ลองรวมคำถามนี้เข้ากับอีกคำถามหนึ่ง
whuber

คำตอบ:


75

นี่คือฟังก์ชั่น R ที่ง่ายซึ่งจะหาค่าผิดปกติของอนุกรมเวลา (และเลือกแสดงในพล็อต) มันจะจัดการซีรีย์ตามฤดูกาลและไม่ใช่ฤดูกาล แนวคิดพื้นฐานคือการหาการประมาณการที่มีประสิทธิภาพของแนวโน้มและส่วนประกอบตามฤดูกาลแล้วลบออก จากนั้นหาค่าผิดปกติในส่วนที่เหลือ การทดสอบค่าผิดปกติที่เหลืออยู่นั้นเหมือนกับค่ากล่องมาตรฐาน - คะแนนสูงกว่า 1.5IQR ด้านบนหรือด้านล่างควอไทล์บนและล่างจะถือว่าเป็นค่าผิดปกติ จำนวน IQR สูงกว่าหรือต่ำกว่าขีด จำกัด เหล่านี้จะถูกส่งคืนเป็น "คะแนน" ที่ผิดปกติ ดังนั้นคะแนนอาจเป็นจำนวนบวกใด ๆ และจะเป็นศูนย์สำหรับค่าผิดปกติ

ฉันรู้ว่าคุณไม่ได้ใช้สิ่งนี้ใน R แต่ฉันมักจะพบว่าฟังก์ชั่น R เป็นจุดเริ่มต้นที่ดี จากนั้นภารกิจคือการแปลสิ่งนี้เป็นภาษาใดก็ตามที่จำเป็น

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 จากฉันยอดเยี่ยม ดังนั้น 1.5 X inter-quartile range คือคำจำกัดความที่ฉันทามติของ outlier สำหรับอนุกรมที่ขึ้นกับเวลา นั่นคงจะดีถ้ามีการอ้างอิงที่ไม่ขึ้นกับขนาด
doug

การทดสอบค่าที่เหลืออยู่นั้นเป็นค่าที่เหลือดังนั้นหวังว่าการพึ่งพาเวลาจะน้อย ฉันไม่รู้เกี่ยวกับฉันทามติ แต่ boxplots มักใช้สำหรับการตรวจหาค่าผิดปกติและดูเหมือนจะทำงานได้ดีพอสมควร มีวิธีการที่ดีกว่าถ้ามีคนต้องการให้ฟังก์ชั่นนี้เป็นนักเล่นตัวน้อย
Rob Hyndman

ขอบคุณจริงๆสำหรับความช่วยเหลือของคุณฉันซาบซึ้งจริงๆ ตอนนี้ฉันค่อนข้างยุ่งอยู่กับการทำงาน แต่ฉันจะทดสอบวิธีการของคุณโดยเร็วที่สุดเท่าที่จะเป็นไปได้และฉันจะกลับมาพร้อมกับข้อควรพิจารณาขั้นสุดท้ายเกี่ยวกับปัญหานี้ มีเพียงความคิดเดียว: ในฟังก์ชั่นของคุณจากสิ่งที่ฉันเห็นฉันต้องระบุความถี่ของอนุกรมเวลาด้วยตนเอง (เมื่อสร้างมัน) และองค์ประกอบตามฤดูกาลนั้นจะพิจารณาเฉพาะเมื่อความถี่มากกว่า 1 มีวิธีที่แข็งแกร่งหรือไม่ จัดการกับสิ่งนี้โดยอัตโนมัติ
gianluca

1
ใช่ฉันสันนิษฐานว่าเป็นที่รู้จักและระบุความถี่แล้ว มีวิธีการประมาณความถี่โดยอัตโนมัติ แต่จะทำให้ฟังก์ชั่นมีความซับซ้อนมาก หากคุณต้องการประเมินความถี่ลองถามคำถามแยกต่างหากเกี่ยวกับเรื่องนี้และฉันอาจจะให้คำตอบ! แต่มันต้องการพื้นที่มากกว่าที่ฉันมีในความคิดเห็น
Rob Hyndman

2
@Marcin ฉันขอแนะนำให้คุณแทงด้วยตัวเอง อาจวางโซลูชันของคุณที่ gist.github.com และโพสต์คำถาม SO เมื่อคุณทำเสร็จแล้วเพื่อให้คนอื่นตรวจสอบงานของคุณ?
เคนวิลเลียมส์

27

ทางออกที่ดีจะมีส่วนผสมหลายอย่างรวมไปถึง:

  • ใช้หน้าต่างที่ทนและเคลื่อนไหวได้อย่างราบรื่น

  • แสดงข้อมูลดั้งเดิมอีกครั้งเพื่อให้ส่วนที่เหลือที่เกี่ยวกับความเรียบเนียนมีการกระจายแบบสมมาตรโดยประมาณ เมื่อพิจารณาจากข้อมูลของคุณเป็นไปได้ว่าสแควร์รูทหรือลอการิทึมของพวกเขาจะให้ส่วนที่เหลือสมมาตร

  • ใช้วิธีการแผนภูมิควบคุมหรืออย่างน้อยควบคุมแผนภูมิความคิดกับส่วนที่เหลือ

การคิดแผนภูมิควบคุมแสดงให้เห็นว่าเกณฑ์ "ธรรมดา" เช่น 2 SD หรือ 1.5 เท่าของ IQR ที่เกินจากควอไทล์นั้นทำงานได้ไม่ดีนักเนื่องจากสัญญาณเหล่านี้ส่งสัญญาณผิดพลาดจากการควบคุมมากเกินไป ผู้คนมักจะใช้ 3 SD ในการควบคุมการทำงานของชาร์ตดังนั้น 2.5 (หรือ 3) เมื่อคูณ IQR เกินควอไทล์จะเป็นจุดเริ่มต้นที่ดี

ฉันได้อธิบายลักษณะของ Rob Hyndman มากขึ้นหรือน้อยลงในขณะที่เพิ่มสองประเด็นสำคัญ: ความต้องการที่อาจเกิดขึ้นเพื่อแสดงข้อมูลอีกครั้งและภูมิปัญญาของการอนุรักษ์นิยมมากขึ้นในการส่งสัญญาณค่าผิดปกติ ฉันไม่แน่ใจว่า Loess นั้นดีสำหรับเครื่องตรวจจับออนไลน์เพราะมันทำงานได้ไม่ดีในจุดสิ้นสุด คุณอาจจะใช้บางอย่างที่เรียบง่ายเหมือนกับฟิลเตอร์มัธยฐานที่เคลื่อนไหว (เช่นเดียวกับในการปรับให้เรียบของ Tukey) หากค่าผิดปกติไม่เกิดขึ้นคุณสามารถใช้หน้าต่างแคบ ๆ (จุดข้อมูล 5 จุดซึ่งอาจจะพังลงด้วยค่าผิดพลาด 3 ครั้งขึ้นไปภายในกลุ่ม 5)

เมื่อคุณทำการวิเคราะห์เพื่อหาการแสดงออกที่ดีของข้อมูลมันไม่น่าเป็นไปได้ที่คุณจะต้องเปลี่ยนการแสดงออกอีกครั้ง ดังนั้นเครื่องมือตรวจจับออนไลน์ของคุณจำเป็นต้องอ้างอิงค่าล่าสุดเท่านั้น (หน้าต่างล่าสุด) เพราะจะไม่ใช้ข้อมูลก่อนหน้าเลย หากคุณมีซีรีส์เป็นเวลานานคุณสามารถไปวิเคราะห์ความสัมพันธ์และฤดูกาลอัตโนมัติ (เช่นความผันผวนที่เกิดขึ้นรายวันหรือรายสัปดาห์) เพื่อปรับปรุงขั้นตอน


3
นี่คือคำตอบพิเศษสำหรับการวิเคราะห์เชิงปฏิบัติ ไม่เคยมีความคิดที่ต้องการลอง 3 IQR เกินควอไทล์
John Robertson

3
@John, 1.5 IQR เป็นคำแนะนำดั้งเดิมของ Tukey สำหรับเคราที่ยาวที่สุดบน boxplot และ 3 IQR เป็นคำแนะนำของเขาสำหรับการทำเครื่องหมายคะแนนว่า "ไกลออกไป" (riff ของวลี 60 ยอดนิยม) สิ่งนี้สร้างขึ้นในอัลกอริทึม boxplot จำนวนมาก ข้อเสนอแนะนี้ได้รับการวิเคราะห์ทางทฤษฎีใน Hoaglin, Mosteller, & Tukey, การทำความเข้าใจการวิเคราะห์ข้อมูลที่แข็งแกร่งและสำรวจ
whuber

นี่เป็นการยืนยันข้อมูลอนุกรมเวลาที่ฉันพยายามวิเคราะห์ ค่าเฉลี่ยของหน้าต่างและค่าเบี่ยงเบนมาตรฐานของหน้าต่าง ((x - avg) / sd)> 3 ดูเหมือนจะเป็นจุดที่ฉันต้องการตั้งค่าสถานะเป็นค่าผิดปกติ อย่างน้อยก็เตือนว่าเป็นคนผิดฉันทำเครื่องหมายสิ่งที่สูงกว่า 10 sd เป็นข้อผิดพลาดร้ายแรง ปัญหาที่ฉันพบคือความยาวหน้าต่างที่เหมาะสมที่สุดคืออะไร ฉันกำลังเล่นกับอะไรระหว่างจุดข้อมูล 4-8
Josh Peak

1
@Neo ทางออกที่ดีที่สุดของคุณคือการทดสอบกับชุดย่อยของข้อมูลของคุณและยืนยันข้อสรุปของคุณด้วยการทดสอบในส่วนที่เหลือ คุณสามารถทำการตรวจสอบข้ามได้อย่างเป็นทางการมากขึ้นเช่นกัน (แต่จำเป็นต้องมีการดูแลเป็นพิเศษกับข้อมูลอนุกรมเวลาเนื่องจากการพึ่งพาซึ่งกันและกันของค่าทั้งหมด)
whuber

17

(คำตอบนี้ตอบคำถามที่ซ้ำกัน (ปิดแล้ว) ที่การตรวจจับเหตุการณ์ที่โดดเด่นซึ่งนำเสนอข้อมูลบางส่วนในรูปแบบกราฟิก)


การตรวจจับที่ผิดปกติขึ้นอยู่กับลักษณะของข้อมูลและสิ่งที่คุณยินดีที่จะพิจารณา วิธีการทั่วไปนั้นใช้สถิติที่มีประสิทธิภาพ จิตวิญญาณของวิธีนี้คือการจำแนกลักษณะของข้อมูลจำนวนมากในลักษณะที่ไม่ได้รับอิทธิพลจากค่าผิดปกติใด ๆ และจากนั้นชี้ไปที่ค่าของแต่ละบุคคลที่ไม่เหมาะสมภายในลักษณะนั้น

เนื่องจากนี่เป็นอนุกรมเวลาจึงเพิ่มความซับซ้อนของความต้องการตรวจสอบค่าผิดปกติอย่างต่อเนื่อง หากสิ่งนี้จะต้องทำในฐานะซีรีส์ที่แผ่ออกไปเราจะได้รับอนุญาตให้ใช้ข้อมูลเก่าสำหรับการตรวจจับไม่ใช่ข้อมูลในอนาคต! ยิ่งกว่านั้นเพื่อเป็นการป้องกันการทดสอบซ้ำหลายครั้งเราต้องการใช้วิธีการที่มีอัตราการบวกผิดพลาดต่ำมาก

พิจารณาเหล่านี้ขอแนะนำให้ทำงานง่าย, การทดสอบการย้ายหน้าต่างขอบเขตที่แข็งแกร่งกว่าข้อมูล มีความเป็นไปได้มากมาย แต่ง่าย ๆ เข้าใจง่ายและนำไปปฏิบัติได้ง่ายขึ้นอยู่กับ MAD ที่ทำงานอยู่: ค่าเบี่ยงเบนสัมบูรณ์แบบมัธยฐานจากค่ามัธยฐาน นี่คือการวัดความแปรปรวนที่แข็งแกร่งอย่างมากภายในข้อมูลซึ่งคล้ายกับค่าเบี่ยงเบนมาตรฐาน ยอดเขาที่อยู่ไกลออกไปจะเป็น MAD หลายแห่งหรือมากกว่าค่าเฉลี่ย

Rx=(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)

นำไปใช้กับชุดข้อมูลเช่นโค้งสีแดงที่แสดงในคำถามมันสร้างผลลัพธ์นี้:

พล็อต

ข้อมูลจะแสดงเป็นสีแดงหน้าต่าง 30 วันของค่ามัธยฐาน +5 * MAD เป็นสีเทาและค่าผิดปกติซึ่งเป็นเพียงค่าข้อมูลเหล่านั้นเหนือเส้นโค้งสีเทา - ในสีดำ

(ขีด จำกัด สามารถคำนวณได้เฉพาะจุดเริ่มต้นที่ส่วนท้ายของหน้าต่างเริ่มต้นสำหรับข้อมูลทั้งหมดภายในหน้าต่างเริ่มต้นนี้จะใช้ขีด จำกัด แรก: นั่นเป็นสาเหตุที่ทำให้เส้นโค้งสีเทาแบนระหว่าง x = 0 และ x = 30)

ผลของการเปลี่ยนพารามิเตอร์คือ (a) การเพิ่มค่าของwindowจะมีแนวโน้มที่จะทำให้เส้นโค้งสีเทาเรียบและ (b) การเพิ่มขึ้นthresholdจะเพิ่มเส้นโค้งสีเทา เมื่อรู้สิ่งนี้ผู้ใช้สามารถแบ่งส่วนเริ่มต้นของข้อมูลและระบุค่าของพารามิเตอร์ที่แยกส่วนที่อยู่ห่างไกลออกจากส่วนที่เหลือของข้อมูลได้อย่างรวดเร็วที่สุด ใช้ค่าพารามิเตอร์เหล่านี้เพื่อตรวจสอบข้อมูลที่เหลือ หากพล็อตแสดงให้เห็นว่าวิธีการเลวลงเมื่อเวลาผ่านไปนั่นหมายถึงลักษณะของข้อมูลที่มีการเปลี่ยนแปลงและพารามิเตอร์อาจต้องปรับใหม่

ขอให้สังเกตว่าวิธีการนี้น้อยเกี่ยวกับข้อมูล:พวกเขาไม่จำเป็นต้องกระจายตามปกติ พวกเขาไม่จำเป็นต้องแสดงเป็นระยะ ๆ ; พวกเขาไม่จำเป็นต้องเป็นคนที่ไม่เป็นลบ ทั้งหมดจะถือว่าเป็นข้อมูลที่ทำงานในลักษณะที่คล้ายกันในช่วงเวลาที่เหมาะสมและยอดเขาที่อยู่ไกลกว่าอย่างเห็นได้ชัดกว่าส่วนที่เหลือของข้อมูล


หากใครต้องการทดลอง (หรือเปรียบเทียบโซลูชันอื่น ๆ กับที่เสนอที่นี่) นี่คือรหัสที่ฉันใช้ในการผลิตข้อมูลเหมือนที่แสดงในคำถาม

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

นี่เป็นทางออกที่น่าสนใจจริง ๆ และฉันขอขอบคุณที่ฉันสามารถใช้งานได้โดยไม่ต้องใช้ R (แค่ใช้ JavaScript ธรรมดาในเว็บแอปพลิเคชัน) ขอบคุณ!
hgoebl

15

หากคุณกังวลเกี่ยวกับการตั้งสมมติฐานด้วยวิธีการใดวิธีหนึ่งวิธีหนึ่งคือการฝึกอบรมผู้เรียนจำนวนมากเกี่ยวกับสัญญาณที่แตกต่างกันจากนั้นใช้วิธีการรวมกลุ่มและรวมเหนือ "การลงคะแนน" จากผู้เรียนของคุณ

BTW นี่อาจจะคุ้มค่าที่จะอ่านหรืออ่านข้อมูลเพราะมันอ้างถึงปัญหาสองสามประการ


5

ฉันเดาว่ารุ่นอนุกรมเวลาที่ซับซ้อนจะไม่ทำงานสำหรับคุณเพราะเวลาที่ใช้ในการตรวจจับค่าผิดปกติโดยใช้วิธีการนี้ ดังนั้นนี่คือวิธีแก้ปัญหา:

  1. ขั้นแรกสร้างรูปแบบการเข้าชม 'ปกติ' พื้นฐานสำหรับหนึ่งปีจากการวิเคราะห์ด้วยตนเองของข้อมูลในอดีตซึ่งคิดตามช่วงเวลาของวัน, วันธรรมดาและวันหยุดสุดสัปดาห์, เดือนของปีเป็นต้น

  2. ใช้พื้นฐานนี้พร้อมกับกลไกง่ายๆ (เช่นค่าเฉลี่ยเคลื่อนที่ที่คาร์ลอสแนะนำ) เพื่อตรวจหาค่าผิดปกติ

คุณอาจต้องการทบทวนเอกสารการควบคุมกระบวนการเชิงสถิติสำหรับแนวคิดบางอย่าง


1
ใช่นี่คือสิ่งที่ฉันกำลังทำอยู่: จนถึงตอนนี้ฉันแบ่งสัญญาณออกเป็นช่วง ๆ ด้วยตนเองเพื่อให้แต่ละช่วงเวลาฉันสามารถกำหนดช่วงความมั่นใจซึ่งสัญญาณควรจะหยุดนิ่งและดังนั้นฉันจึงสามารถใช้วิธีมาตรฐานเช่น เป็นค่าเบี่ยงเบนมาตรฐาน ... ปัญหาที่แท้จริงคือฉันไม่สามารถตัดสินใจรูปแบบที่คาดหวังสำหรับสัญญาณทั้งหมดที่ฉันต้องวิเคราะห์และนั่นคือเหตุผลที่ฉันกำลังมองหาบางสิ่งที่ชาญฉลาดมากขึ้น
gianluca

นี่เป็นแนวคิดหนึ่ง: ขั้นตอนที่ 1: นำไปใช้และประเมินโมเดลอนุกรมเวลาทั่วไปโดยใช้ข้อมูลครั้งเดียวตามข้อมูลประวัติ สามารถทำได้แบบออฟไลน์ ขั้นตอนที่ 2: ใช้โมเดลผลลัพธ์เพื่อตรวจจับค่าผิดปกติ ขั้นตอนที่ 3: ที่ความถี่ (อาจจะทุกเดือนหรือไม่) ให้ปรับเทียบรุ่นอนุกรมเวลาอีกครั้ง (ซึ่งสามารถทำได้แบบออฟไลน์) เพื่อให้การตรวจจับขั้นตอนที่ 2 ของคุณไม่พบว่ามีค่าผิดปกติมากเกินไปกับรูปแบบการจราจรปัจจุบัน สิ่งนี้จะใช้ได้กับบริบทของคุณหรือไม่

ใช่สิ่งนี้อาจใช้ได้ ฉันกำลังคิดเกี่ยวกับวิธีการที่คล้ายกัน (คำนวณค่าพื้นฐานทุกสัปดาห์ซึ่งอาจเป็น CPU มากถ้าคุณมีอนุกรมเวลาหลายร้อยแบบที่ไม่ได้ทำการวิเคราะห์) BTW คำถามที่ยากจริงคือ "อัลกอริธึมสไตล์ blackbox ที่ดีที่สุดสำหรับการสร้างแบบจำลองสัญญาณทั่วไปโดยสมบูรณ์เมื่อพิจารณาจากเสียงการประมาณค่าแนวโน้มและฤดูกาล" AFAIK ทุกวิธีในวรรณคดีต้องใช้เฟส "การปรับพารามิเตอร์" ยากมากและวิธีอัตโนมัติเดียวที่ฉันพบคือโมเดล ARIMA โดย Hyndman ( robjhyndman.com/software/forecast ) ฉันพลาดอะไรไปรึเปล่า?
gianluca

โปรดจำไว้ว่าฉันไม่ขี้เกียจสำหรับการตรวจสอบพารามิเตอร์เหล่านี้ประเด็นคือค่าเหล่านี้จำเป็นต้องตั้งค่าตามรูปแบบที่คาดหวังของสัญญาณและในสถานการณ์ของฉันฉันไม่สามารถทำการสันนิษฐานได้
gianluca

รุ่น ARIMA เป็นรุ่นอนุกรมเวลาคลาสสิกที่สามารถใช้ให้พอดีกับข้อมูลอนุกรมเวลา ฉันอยากแนะนำให้คุณสำรวจแอปพลิเคชั่นของแบบจำลอง ARIMA คุณสามารถรอให้ Rob ออนไลน์ได้และบางทีเขาจะพูดสอดกับความคิดบางอย่าง

5

ปรับข้อมูลตามฤดูกาลเพื่อให้วันปกติดูใกล้เคียงกับฤดูกาลมากขึ้น คุณสามารถสุ่มตัวอย่างวันนี้เวลา 17.00 น. แล้วลบหรือหารค่าเฉลี่ยของ 30 วันก่อนหน้านี้เวลา 17.00 น. จากนั้นดูส่วนเบี่ยงเบนมาตรฐาน N ที่ผ่านมา (วัดโดยใช้ข้อมูลที่ปรับค่าไว้ล่วงหน้า) เพื่อหาค่าผิดปกติ สิ่งนี้สามารถทำได้แยกต่างหากสำหรับ "ฤดูกาล" รายสัปดาห์และรายวัน


อีกครั้งวิธีนี้ใช้งานได้ดีถ้าสัญญาณควรมีฤดูกาลตามนั้น แต่ถ้าฉันใช้อนุกรมเวลาที่แตกต่างไปจากเดิมอย่างสิ้นเชิง (เช่นเวลาเฉลี่ยในการปัดเศษ TCP ตลอดเวลา) วิธีนี้จะไม่ทำงาน (เนื่องจากจะดีกว่า เพื่อจัดการกับสิ่งนั้นด้วยค่าเฉลี่ยทั่วโลกและส่วนเบี่ยงเบนมาตรฐานโดยใช้หน้าต่างบานเลื่อนที่มีข้อมูลประวัติ)
gianluca

1
เว้นแต่คุณจะยินดีที่จะใช้โมเดลอนุกรมเวลาทั่วไป (ซึ่งนำมาซึ่งข้อเสียในแง่ของเวลาแฝง ฯลฯ ) ฉันมองโลกในแง่ร้ายว่าคุณจะพบการใช้งานทั่วไปซึ่งในเวลาเดียวกันนั้นง่ายพอที่จะทำงานให้กับอนุกรมเวลาทุกประเภท

ความคิดเห็นอื่น: ฉันรู้ว่าคำตอบที่ดีอาจเป็น "ดังนั้นคุณอาจประมาณช่วงเวลาของสัญญาณและตัดสินใจใช้อัลกอริทึมที่จะใช้ตามนั้น" แต่ฉันไม่พบวิธีแก้ปัญหาที่ดีจริง ๆ สำหรับปัญหาอื่น (ฉันเล่น บิตที่มีการวิเคราะห์สเปกตรัมโดยใช้ DFT และการวิเคราะห์เวลาโดยใช้ฟังก์ชั่นอัต แต่อนุกรมเวลาของฉันมีจำนวนมากของเสียงและวิธีการดังกล่าวให้บางบ้า mosts ผลของเวลา)
Gianluca

ความคิดเห็นเกี่ยวกับความคิดเห็นล่าสุดของคุณ: นั่นเป็นเหตุผลที่ฉันกำลังมองหาวิธีทั่วไปมากขึ้น แต่ฉันต้องการ "กล่องดำ" เพราะฉันไม่สามารถทำการสันนิษฐานเกี่ยวกับสัญญาณที่วิเคราะห์ได้ดังนั้นฉันจึงไม่สามารถสร้าง "ชุดพารามิเตอร์ที่ดีที่สุดสำหรับอัลกอริทึมการเรียนรู้"
gianluca

@gianluca ในขณะที่คุณได้ intimated โครงสร้าง ARIMA พื้นฐานสามารถปกปิดความผิดปกติ การกำหนดสูตรที่ไม่ถูกต้องอาจทำให้ตัวแปรต่าง ๆ เช่นชั่วโมงของวัน, วันต่อสัปดาห์, เอฟเฟกต์วันหยุดและอื่น ๆ สามารถปกปิดความผิดปกติได้เช่นกัน คำตอบนั้นค่อนข้างชัดเจนว่าคุณต้องมีความมั่นใจในการตรวจจับความผิดปกติได้อย่างมีประสิทธิภาพ ในการอ้างอิงเบคอน "สำหรับใครก็ตามที่รู้วิธีของธรรมชาติจะสังเกตเห็นความเบี่ยงเบนของเธอได้ง่ายขึ้นและในทางกลับกันใครก็ตามที่รู้ว่าการเบี่ยงเบนของเธอจะอธิบายวิถีชีวิตของเธอได้อย่างแม่นยำมากขึ้น"
IrishStat

3

ทางเลือกในการวิธีการที่ระบุไว้โดยร็อบ Hyndman จะใช้โฮลท์ฤดูหนาวพยากรณ์ แถบความเชื่อมั่นที่ได้รับจากโฮลท์ - วินเทอร์สามารถใช้เพื่อตรวจจับค่าผิดปกติ นี่คือกระดาษที่อธิบายวิธีใช้โฮลท์ - วินเทอร์สำหรับ "การตรวจจับพฤติกรรมอเบอร์เทนท์ในซีรีย์เวลาสำหรับการตรวจสอบเครือข่าย" การดำเนินการสำหรับ rrdtool สามารถพบได้ที่นี่


2

การวิเคราะห์สเปกตรัมตรวจจับเป็นระยะในอนุกรมเวลาคงที่ แนวทางโดเมนความถี่ที่อิงกับการประมาณความหนาแน่นสเปกตรัมเป็นวิธีที่ฉันอยากจะแนะนำในขั้นตอนแรกของคุณ

หากในบางช่วงความผิดปกติหมายถึงจุดสูงสุดที่สูงกว่าปกติในช่วงเวลานั้นชุดที่มีความผิดปกติดังกล่าวจะไม่เป็นการหยุดนิ่งและการมองเห็นไม่ชัด แต่สมมติว่าคุณได้ระบุช่วงเวลาที่มีความผิดปกติคุณควรจะสามารถกำหนดได้ว่าอะไรคือความสูงสูงสุดปกติและจากนั้นสามารถตั้งค่าขีด จำกัด ในระดับที่สูงกว่าค่าเฉลี่ยเพื่อกำหนดกรณีที่ผิดปกติ


2
คุณช่วยอธิบายได้ว่าวิธีแก้ปัญหานี้จะตรวจพบ "ความผิดปกติในท้องถิ่น" ได้อย่างไร การนำเสนอตัวอย่างการทำงานจะเป็นประโยชน์อย่างยิ่ง (พูดตามตรงฉันขอแนะนำให้คุณทำเช่นนี้เพราะในการออกกำลังกายแบบนี้ฉันเชื่อว่าคุณจะค้นพบว่าคำแนะนำของคุณไม่มีประสิทธิภาพสำหรับการตรวจจับที่ผิดปกติ แต่ฉันอาจผิด ... )
whuber

1
@whuber การวิเคราะห์สเปกตรัมจะระบุได้ว่าจุดสูงสุดทั้งหมดอยู่ที่ใด ขั้นตอนต่อไปคือเพื่อให้พอดีกับแบบจำลอง yime โดยใช้คำว่าไซน์และโคไซน์กับความถี่ที่กำหนดจากการวิเคราะห์สเปกตรัมและแอมพลิจูดที่ประมาณจากข้อมูล หากความผิดปกติหมายถึงยอดเขาที่มีแอมพลิจูดสูงมากฉันคิดว่าเกณฑ์ของแอมพลิจูดจะเหมาะสม หากความผิดปกติของท้องที่หมายความว่าในช่วงระยะเวลาหนึ่งแอมพลิจูดบางครั้งมีขนาดใหญ่กว่าชุดอื่นอย่างชัดเจนชุดนั้นจะไม่อยู่กับที่และการวิเคราะห์สเปกตรัมจะไม่น่ากลัว
Michael Chernick

1
ฉันไม่ทำตามข้อสรุปเกี่ยวกับการขาดความคงที่ ตัวอย่างเช่นผลรวมของรูปคลื่นไซน์ปกติและกระบวนการจุดปัวซงที่ทำเครื่องหมายจะคงที่ แต่จะไม่แสดงช่วงเวลาที่คุณต้องการ อย่างไรก็ตามคุณจะพบจุดสูงสุดที่แข็งแกร่งใน periodogram แต่พวกเขาจะบอกคุณว่าไม่มีอะไรเกี่ยวข้องกับจุดยอดข้อมูลที่ผิดปกติที่นำเสนอโดยองค์ประกอบกระบวนการ Poisson
whuber

1
อนุกรมเวลาคงที่มีค่าเฉลี่ยคงที่ หากจุดสูงสุดสำหรับองค์ประกอบตามระยะเวลาสามารถเปลี่ยนแปลงได้ตลอดเวลาสามารถเพิ่มค่าเฉลี่ยในการเปลี่ยนแปลงเมื่อเวลาผ่านไปดังนั้น seires จะไม่ใช่ค่าคงที่
Michael Chernick

2

เนื่องจากเป็นข้อมูลอนุกรมเวลาตัวกรองเอ็กซ์โปเนนเชียลอย่างง่ายhttp://en.wikipedia.org/wiki/Exponential_smoothingจะทำให้ข้อมูลราบรื่นขึ้น มันเป็นตัวกรองที่ดีมากเนื่องจากคุณไม่จำเป็นต้องสะสมจุดข้อมูลเก่า เปรียบเทียบค่าข้อมูลที่ได้รับการเรียบใหม่ทุกครั้งกับค่าที่ไม่ลื่น เมื่อค่าเบี่ยงเบนเกินกว่าเกณฑ์ที่กำหนดไว้ล่วงหน้า (ขึ้นอยู่กับสิ่งที่คุณเชื่อว่ามีค่าผิดปกติในข้อมูลของคุณ) คุณสามารถตรวจพบค่าเริ่มต้นได้ง่าย

ใน CI จะทำสิ่งต่อไปนี้สำหรับตัวอย่าง 16 บิตแบบเรียลไทม์ (ฉันเชื่อว่านี่จะอยู่ที่ไหนสักแห่งที่นี่ <คำอธิบาย - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order -iir-approximation-to-a-moving-average-filter >)

#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

คุณสามารถใช้ค่าเบี่ยงเบนมาตรฐานของการวัด N ครั้งสุดท้าย (คุณต้องเลือก N ที่เหมาะสม) คะแนนความผิดปกติที่ดีจะเป็นค่าเบี่ยงเบนมาตรฐานที่วัดจากค่าเฉลี่ยเคลื่อนที่


ขอบคุณสำหรับการตอบกลับของคุณ แต่ถ้าสัญญาณมีฤดูกาลสูง (เช่นการวัดเครือข่ายจำนวนมากมีรูปแบบรายวันและรายสัปดาห์ในเวลาเดียวกันเช่นกลางคืนหรือวันหยุดสุดสัปดาห์หรือวันทำงาน) วิธีการตามค่าเบี่ยงเบนมาตรฐานจะไม่ทำงานในกรณีนั้น
gianluca

ตัวอย่างเช่นถ้าฉันได้รับตัวอย่างใหม่ทุก ๆ 10 นาทีและฉันกำลังทำการตรวจสอบค่าใช้จ่ายแบนด์วิดท์เครือข่ายของ บริษัท โดยทั่วไปเวลา 18.00 น. มาตรการนี้จะล้มลง (นี่เป็นรูปแบบปกติโดยรวม) และ ค่าเบี่ยงเบนมาตรฐานที่คำนวณผ่านหน้าต่างแบบเลื่อนจะล้มเหลว (เพราะจะทำให้เกิดการแจ้งเตือนอย่างแน่นอน) ในเวลาเดียวกันถ้าการวัดล้มลงที่ 16:00 (เบี่ยงเบนไปจากพื้นฐานปกติ) นี่เป็นค่าที่แท้จริง
gianluca

1

สิ่งที่ฉันทำคือจัดกลุ่มการวัดตามชั่วโมงและวันในสัปดาห์และเปรียบเทียบส่วนเบี่ยงเบนมาตรฐานของสิ่งนั้น ยังคงไม่ถูกต้องสำหรับสิ่งต่าง ๆ เช่นวันหยุดและฤดูร้อน / ฤดูหนาวตามฤดูกาล แต่ส่วนใหญ่จะถูกต้อง

ข้อเสียคือคุณต้องรวบรวมข้อมูลหนึ่งปีหรือมากกว่านั้นเพื่อให้เพียงพอเพื่อให้ stddev เริ่มมีเหตุผล


ขอบคุณนั่นคือสิ่งที่ฉันพยายามหลีกเลี่ยง (มีตัวอย่างจำนวนมากเป็นพื้นฐาน) เพราะฉันต้องการวิธีการตอบโต้ที่แท้จริง (เช่นการตรวจสอบออนไลน์อาจจะ "สกปรก" หลังจากผ่านไป 1-2 สัปดาห์ของพื้นฐาน)
gianluca

0

ฉันแนะนำโครงการด้านล่างซึ่งควรนำไปใช้ในหนึ่งวันหรือมากกว่านั้น:

การอบรม

  • รวบรวมตัวอย่างมากเท่าที่คุณสามารถเก็บไว้ในหน่วยความจำ
  • ลบค่าผิดปกติที่เห็นได้ชัดโดยใช้ค่าเบี่ยงเบนมาตรฐานสำหรับแต่ละแอตทริบิวต์
  • คำนวณและเก็บเมทริกซ์สหสัมพันธ์และค่าเฉลี่ยของแต่ละแอตทริบิวต์
  • คำนวณและเก็บระยะทาง Mahalanobisของตัวอย่างทั้งหมดของคุณ

กำลังคำนวณ "ความผิดปกติ":

สำหรับตัวอย่างเดียวที่คุณต้องการทราบว่า "ความผิดปกติ" ของมัน:

  • ดึงค่าเฉลี่ย, เมทริกซ์ความแปรปรวนร่วมและระยะทาง Mahalanobisจากการฝึกอบรม
  • คำนวณระยะทาง Mahalanobis "d" สำหรับตัวอย่างของคุณ
  • ส่งกลับค่าเปอร์เซ็นต์ไทล์ที่ตก "d" (โดยใช้ระยะทาง Mahalanobis จากการฝึกฝน)

นั่นจะเป็นคะแนนนอกของคุณ: 100% เป็นคะแนนที่สูงมาก


PS ในการคำนวณระยะทาง Mahalanobisใช้เมทริกซ์สหสัมพันธ์ไม่ใช่เมทริกซ์ความแปรปรวนร่วม สิ่งนี้จะแข็งแกร่งกว่านี้หากการวัดตัวอย่างแตกต่างกันในหน่วยและจำนวน


0

สำหรับกรณีที่ต้องคำนวณค่าผิดปกติอย่างรวดเร็วใคร ๆ ก็สามารถใช้ความคิดของ Rob Hyndman และ Mahito Sugiyama ( https://github.com/BorgwardtLab/sampling-outlier-detection , ไลบรารี (spoutlier), function qsp) ค่าผิดปกติดังต่อไปนี้:

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

การตรวจจับความผิดปกตินั้นต้องการการสร้างสมการซึ่งอธิบายถึงความคาดหวัง การตรวจจับสิ่งรบกวนนั้นมีให้ในทั้งการตั้งค่าที่ไม่ใช่สาเหตุและสาเหตุ หากมีชุดพยากรณ์เช่นราคาสิ่งต่างๆอาจมีความซับซ้อนเล็กน้อย การตอบสนองอื่น ๆ ที่นี่ดูเหมือนจะไม่ได้คำนึงถึงสาเหตุที่กำหนดได้เนื่องมาจากชุดพยากรณ์ที่ผู้ใช้ระบุเช่นราคาและอาจมีข้อบกพร่อง จำนวนที่ขายอาจขึ้นอยู่กับราคาบางทีราคาก่อนหน้าและปริมาณที่ขายในอดีต พื้นฐานสำหรับการตรวจจับความผิดปกติ (พัลส์, พัลส์ตามฤดูกาล, การเลื่อนระดับและแนวโน้มเวลาท้องถิ่น) พบได้ใน https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf


ลิงค์ไม่ทำงานคุณช่วยแก้ไขได้ไหม ขอบคุณ
Pankaj Joshi

เสร็จสิ้น ..................
IrishStat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.