วิธีวัดการกระจายเวลาในการตอบสนอง

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

[12, 15, 19, ..., 57, 120]

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

คุณช่วยฉันสร้างเมตริกที่เหมาะสมจากข้อมูลนี้ได้ไหม


person Evgeny Lazin    schedule 27.01.2015    source แหล่งที่มา
comment
คุณกำลังพยายามหาค่าเฉลี่ยที่ไม่รวมค่าผิดปกติหรือไม่?   -  person shuttle87    schedule 27.01.2015
comment
อย่างแน่นอน. ฉันต้องการค่าผิดปกติ แต่นี่เป็นเรื่องง่าย   -  person Evgeny Lazin    schedule 27.01.2015
comment
ดูเหมือนคุณต้องการค่าเฉลี่ยเคลื่อนที่ คุณอาจแยกค่าผิดปกติจำนวนหนึ่งออกจากค่าเฉลี่ยดังกล่าวได้   -  person shuttle87    schedule 27.01.2015
comment
ฉันต้องสร้างการวัดเดี่ยวจากรายการตัวเลขนี้ นี่คือตัวเลขเวลาแฝงจากหนึ่งวัน และฉันวางแผนที่จะรวมการวัดนี้เพื่อช่วงเวลาที่กว้างขึ้นและวิเคราะห์ ใช่ สามารถใช้ค่าเฉลี่ยเคลื่อนที่ได้ แต่ในตอนแรกฉันต้องสร้างหน่วยเมตริกจากรายการตัวเลขนี้ก่อน   -  person Evgeny Lazin    schedule 27.01.2015
comment
อาจเป็นไปได้ที่จะคิดค้นวิธีอนุมานพารามิเตอร์สำหรับการแจกแจงเฉพาะจากค่าสูงสุดที่คุณมีอยู่ จากนั้นตัวเลขที่คุณรายงานเพียงตัวเดียวอาจเป็น (เช่น) เปอร์เซ็นไทล์ที่ 95 หรือ 99 ของการกระจายโดยประมาณ ฉันไม่รู้ว่านั่นเป็นปัญหาที่ได้รับการแก้ไขแล้วหรือไม่ คุณอาจทราบได้โดยถามที่ stats.stackexchange.com ดูเหมือนจะเป็นปัญหาที่น่าสนใจ ซึ่งค่อนข้างแย่เกินไป เนื่องจากฉันแน่ใจว่าคุณไม่ต้องการปัญหา น่าสนใจ   -  person Robert Dodier    schedule 28.01.2015
comment
คุณมีการประทับเวลาที่มีการบันทึกตัวเลข [12, 15, 19, ..., 57, 120] หรือไม่? ฉันสงสัยว่าการมีสิ่งเหล่านี้จะทำให้ได้สูตรง่ายขึ้น   -  person Robert Dodier    schedule 28.01.2015
comment
เป็นเรื่องดีที่มีปัญหาที่น่าสนใจ ณ จุดนี้ ฉันตัดสินใจที่จะบันทึกองค์ประกอบ N บนสุดของแต่ละอาร์เรย์ (หนึ่งอาร์เรย์ต่อวันสำหรับแต่ละพารามิเตอร์) และตีความว่าเป็นจุดในพื้นที่หลายมิติ เป็นไปได้ที่จะจัดกลุ่มข้อมูลสำหรับแต่ละพารามิเตอร์โดยใช้ knn และค้นหาค่าผิดปกติ แต่ควรตรวจสอบหรือข้อมูลจริงก่อน ฉันกำลังศึกษาข้อเสนอของคุณเช่นกัน อย่างไรก็ตาม ข้อมูลไม่เพียงพอที่จะตัดสินว่าอะไรดีกว่าหรือแย่กว่านั้น   -  person Evgeny Lazin    schedule 28.01.2015
comment
ใช่แล้ว ฉันมีการประทับเวลา   -  person Evgeny Lazin    schedule 28.01.2015
comment
@Lazin Clustering เพื่อค้นหาค่าผิดปกติดูเหมือนจะไม่ใช่แนวทางที่ถูกต้อง เนื่องจากจะละเว้นค่าที่ถูกละเว้น ซึ่งมีข้อมูลบางอย่าง (กล่าวคือ เวลาแฝงน้อยกว่าค่าสูงสุดล่าสุด) ค่าที่ละเว้นเหล่านี้จะมีความสำคัญมากขึ้นเรื่อยๆ เมื่อวันดำเนินไป เนื่องจากเมื่อใกล้สิ้นสุดวัน ค่าส่วนใหญ่จะน้อยกว่าค่าสูงสุดล่าสุด   -  person Robert Dodier    schedule 28.01.2015
comment
ฉันจะลองใช้แนวทางของคุณเมื่อฉันมีข้อมูลมากขึ้น ฉันมีข้อมูลเพียงไม่กี่วันแล้ว :(   -  person Evgeny Lazin    schedule 29.01.2015


คำตอบ (2)


สมมติว่าคุณมีการประทับเวลาสำหรับตัวเลขที่รายงาน คุณสามารถสร้างฟังก์ชันความน่าจะเป็นสำหรับการแจกแจงแบบพาราเมตริก ค้นหาการประมาณค่าพารามิเตอร์ความน่าจะเป็นสูงสุด จากนั้นคำนวณควอนไทล์ที่เหมาะสม (0.95, 0.99, 0.999 อะไรก็ได้) แล้วรายงานว่าเป็นรายวัน เบอร์มันแย่แค่ไหน ฉันพูดว่าการแจกแจงแบบอิงพารามิเตอร์เพราะฉันไม่รู้ว่าจะทำสิ่งนี้แบบไม่อิงพารามิเตอร์ได้อย่างไร

เมื่อพิจารณาจากการประทับเวลาของตัวเลขที่รายงาน และสมมติว่ามีการติดตามเวลาแฝงหนึ่งครั้งต่อนาที คุณจะทราบได้ว่ามีเวลาแฝงที่สังเกตได้กี่ครั้งที่ถูกละเว้นจากรายงาน มันเป็นเพียงจำนวนนาทีจากหมายเลขที่รายงานหนึ่งไปยังหมายเลขถัดไป สำหรับตัวเลขที่รายงานแต่ละตัว x_i จะมีคำว่า p(x_i | a) ในฟังก์ชันความน่าจะเป็น โดยที่ p คือความหนาแน่นของความน่าจะเป็น และ a แสดงถึงพารามิเตอร์ทั้งหมด (อย่างน้อยหนึ่งตัว) สำหรับจำนวนแต่ละจำนวนที่ไม่ได้รายงาน จะมีคำว่า P(x_i | a) ในฟังก์ชันความน่าจะเป็น โดยที่ P คือฟังก์ชันการแจกแจงสะสม และ x_i คือจำนวนที่รายงานล่าสุด คำศัพท์ทั้งหมดสำหรับตัวเลขที่ไม่ได้รายงานในช่องว่างเดียวระหว่างตัวเลขที่รายงานสามารถรวบรวมไว้ในเทอมเดียว P(x_i | a)^n_i โดยที่ n_i คือจำนวนของตัวเลขที่ไม่ได้รายงานในช่องว่างที่ x_i เป็นจุดสิ้นสุดด้านซ้าย และ x_{i + 1} คือจุดสิ้นสุดที่ถูกต้อง

โดยสรุปฟังก์ชันความน่าจะเป็นคือ

L(a) = product(p(x_i | a), i, 1, n) * product(P(x_i | a)^n_i, i, 1, n)

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

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

มีข้อสันนิษฐานที่ไม่ได้ระบุทุกประเภทที่นี่ สามารถกรอกรายละเอียดได้หากมีผู้สนใจ

person Robert Dodier    schedule 28.01.2015

นี่คือแนวทางอื่น ซึ่งไม่มีพารามิเตอร์ คุณสามารถผูกฟังก์ชันการแจกแจงสะสมเชิงประจักษ์ไว้ด้านบนและด้านล่างได้: ระหว่าง x_i และ x_{i + 1} (1) มันถูกผูกไว้ด้านล่างด้วยเศษส่วนของค่าที่น้อยกว่าหรือเท่ากับ x_i อย่างแน่นอน และ (2) คือ ล้อมรอบด้วยเศษส่วนของค่าที่มากกว่า x_i อย่างแน่นอน

ขอบเขตเหล่านี้อาจจะหลวมมาก การกลับค่า cdf เชิงประจักษ์ จะนำไปสู่ขอบเขตที่กว้างมากในควอนไทล์ ซึ่งหมายความว่าขอบเขตของคุณสำหรับสิ่งที่ถือเป็น "ค่าผิดปกติ" จะเป็นที่รู้จักในช่วงที่ค่อนข้างกว้างเท่านั้น คุณอาจตั้งสมมติฐานที่ง่ายขึ้น เช่น สมมติว่า c.d.f. เป็นเส้นตรงแบบแยกส่วนระหว่าง x_i และ x_{i + 1} เพื่อให้ได้ค่าคะแนน

(1) เป็นเพียงจำนวนค่าทั้งหมด (ทั้งที่รายงานและละเว้น) ก่อนที่จะสังเกต x_{i + 1} หารด้วยจำนวนค่าทั้งหมดตลอดทั้งวัน (2) เป็นเพียง 1 ลบ (จำนวนค่าที่รายงานหลัง x_i (เนื่องจากค่าเหล่านี้เป็นเพียงค่าเดียวที่เรารู้ว่ามากกว่า x_i) หารด้วยจำนวนค่าทั้งหมดตลอดทั้งวัน)

แก้ไข: แก้ไขแล้ว (2)

person Robert Dodier    schedule 28.01.2015