การประเมินค่าเฉลี่ยที่แข็งแกร่งด้วย O (1) การปรับปรุงประสิทธิภาพ


9

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

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

ฉันขอขอบคุณข้อเสนอแนะสำหรับสถิติที่มีประสิทธิภาพซึ่งสามารถคำนวณ / อัปเดตได้อย่างมีประสิทธิภาพ


ทำไมไม่ใช้เฉพาะส่วนเริ่มต้นของข้อมูลเช่น 100 หรือ 1,000 แรกหรืออะไรก็ตามเพื่อสร้าง "รั้ว" สำหรับการคัดกรองค่าผิดปกติ? คุณไม่จำเป็นต้องอัปเดตอีกครั้งดังนั้นจึงไม่จำเป็นต้องบำรุงรักษาโครงสร้างข้อมูลเพิ่มเติม
whuber

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

1
นั่นคือการสังเกตที่สำคัญ มันบอกเป็นนัยว่าคุณต้องระมัดระวังมากกว่าปกติเพราะในขั้นต้นคุณจะได้รับการประเมินค่า "สูง" โดยเฉลี่ย ด้วยการอัปเดตการประมาณการดังกล่าวอย่างต่อเนื่องคุณสามารถเลิกใช้ค่าที่ต่ำกว่าทั้งหมดได้ ดังนั้นคุณจะต้องมีโครงสร้างข้อมูลที่ส่วนสำคัญของการกระจายข้อมูลทั้งหมดจะถูกบันทึกและปรับปรุงเป็นระยะ ดูหัวข้อของเราด้วยคำหลัก "ออนไลน์" และ "ควอนไทล์" สำหรับแนวคิด สองคนที่มีแนวโน้มดังกล่าวเป็นที่stats.stackexchange.com/questions/3372และstats.stackexchange.com/q/3377
whuber

ฉันจะเสนอเงินรางวัล แต่ฉันไม่มีชื่อเสียงพอ
Jason S

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

คำตอบ:


4

วิธีนี้ใช้ข้อเสนอแนะโดย @Innuo ในความคิดเห็นกับคำถาม:

คุณสามารถบำรุงรักษาชุดย่อยสุ่มที่สุ่มตัวอย่างขนาด 100 หรือ 1,000 จากข้อมูลทั้งหมดที่เห็น ชุดนี้และที่เกี่ยวข้อง "รั้ว" สามารถปรับปรุงในเวลาO(1)

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


อัลกอริทึมนี้ยอมรับว่าเป็นอินพุตสตรีมข้อมูล x(t), t=1,2,, ขนาดตัวอย่าง mและแสดงผลสตรีมของตัวอย่าง s(t) ซึ่งแต่ละอันเป็นตัวแทนของประชากร X(t)=(x(1),x(2),,x(t)). โดยเฉพาะสำหรับ1it, s(i) เป็นตัวอย่างสุ่มขนาดง่าย ๆ m จาก X(t) (ไม่ต้องเปลี่ยนใหม่)

เพื่อสิ่งนี้จะเกิดขึ้นมันพอเพียงกับทุกคน m- องค์ประกอบย่อยของ {1,2,,t} มีโอกาสเท่ากันในการเป็นดัชนีของ x ใน s(t). นี่แสดงถึงโอกาสที่x(i), 1i<t, อยู่ใน s(t) เท่ากับ m/t ให้ tm.

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

อัลกอริทึมจะใช้เวลามากกว่า t=m+1. สมมติว่าเหนี่ยวนำs(t) เป็นตัวอย่างแบบง่าย ๆ ของ X(t) สำหรับ t>m. ตั้งค่าไว้ชั่วคราวs(t+1)=s(t). ปล่อยU(t+1) เป็นตัวแปรสุ่มแบบสม่ำเสมอ (เป็นอิสระจากตัวแปรก่อนหน้าใด ๆ ที่ใช้ในการสร้าง s(t)) ถ้าU(t+1)m/(t+1) จากนั้นแทนที่องค์ประกอบที่เลือกแบบสุ่มของ s โดย x(t+1). นั่นคือขั้นตอนทั้งหมด!

เห็นได้ชัดว่า x(t+1) มีความน่าจะเป็น m/(t+1) ของการอยู่ใน s(t+1). ยิ่งกว่านั้นโดยสมมติฐานการปฐมนิเทศx(i) มีความน่าจะเป็น m/t ของการอยู่ใน s(t) เมื่อไหร่ it. ด้วยความน่าจะเป็นm/(t+1)×1/m = 1/(t+1) มันจะถูกลบออกจาก s(t+1)ดังนั้นความน่าจะเป็นที่เหลือจะเท่ากับ

mt(11t+1)=mt+1,

ตรงตามที่ต้องการ จากการเหนี่ยวนำดังนั้นความน่าจะเป็นทั้งหมดที่รวมของx(i) ใน s(t)ถูกต้องและชัดเจนว่าไม่มีความสัมพันธ์พิเศษระหว่างการรวมเหล่านั้น นั่นเป็นการพิสูจน์ว่าอัลกอริทึมนั้นถูกต้อง

ประสิทธิภาพของอัลกอริธึมคือ O(1) เพราะในแต่ละขั้นตอนจะมีการคำนวณตัวเลขสุ่มมากที่สุดสองหมายเลขและมีองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบของอาร์เรย์ mค่าจะถูกแทนที่ ข้อกำหนดด้านการจัดเก็บข้อมูลคือO(m).

โครงสร้างข้อมูลสำหรับอัลกอริทึมนี้ประกอบด้วยกลุ่มตัวอย่าง s พร้อมกับดัชนี t ของประชากร X(t)ว่ามันเป็นตัวอย่าง เริ่มแรกเราจะs=X(m) และดำเนินการตามอัลกอริทึมสำหรับ t=m+1,m+2,. นี่คือการRดำเนินการปรับปรุง(s,t) ด้วยค่า x ผลิต (s,t+1). (การโต้เถียงnเล่นบทบาทของtและsample.sizeเป็นm. ดัชนีt จะถูกดูแลโดยผู้เรียก)

update <- function(s, x, n, sample.size) {
  if (length(s) < sample.size) {
    s <- c(s, x)
  } else if (runif(1) <= sample.size / n) {
    i <- sample.int(length(s), 1)
    s[i] <- x
  }
  return (s)
}

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

n <- 10^3
x <- sapply(1:(7*n), function(t) cos(pi*t/n) + 2*floor((1+t)/n))
n.sample <- 50
s <- x[1:(n.sample-1)]
online <- sapply(n.sample:length(x), function(i) {
  s <<- update(s, x[i], i, n.sample)
  summary(s)})
actual <- sapply(n.sample:length(x), function(i) summary(x[1:i]))

ณ จุดนี้onlineเป็นลำดับของการประมาณค่าเฉลี่ยที่ผลิตโดยการบำรุงรักษาตัวอย่างการรัน50ค่าในขณะที่actualเป็นลำดับของการประมาณค่าเฉลี่ยที่ผลิตจากข้อมูลทั้งหมดที่มีในแต่ละช่วงเวลา เนื้อเรื่องแสดงข้อมูล (เป็นสีเทา), actual(เป็นสีดำ) และสองแอพพลิเคชั่นที่เป็นอิสระของขั้นตอนการสุ่มตัวอย่างนี้ (เป็นสี) ข้อตกลงอยู่ในข้อผิดพลาดการสุ่มตัวอย่างที่คาดไว้:

plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")

รูป


สำหรับตัวประมาณค่าเฉลี่ยที่มีประสิทธิภาพโปรดค้นหาเว็บไซต์ของเรา และข้อกำหนดที่เกี่ยวข้อง ความเป็นไปได้ที่ควรค่าแก่การพิจารณาคือ Winsorized Mean และ M-estimators


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

@ user603 "การปฏิเสธเกณฑ์" หรือวิธีการที่มีประสิทธิภาพใด ๆ ที่ใช้ในการประมาณค่าเฉลี่ยนั้นไม่เกี่ยวข้อง: เลือกวิธีการใดก็ได้ที่คุณต้องการประเมินค่าเฉลี่ย (ไม่ใช่วิธีที่มีประสิทธิภาพทั้งหมดทำงานด้วยการลบ thresholds และการปฏิเสธข้อมูล BTW) สิ่งนี้จะทำในรหัสของคำตอบของฉันโดยแทนที่summaryด้วยตัวแปรที่มีประสิทธิภาพ
whuber

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

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

3

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

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

สังหรณ์ใจโดยใช้ค่าเฉลี่ย μt1 และความแปรปรวน σt12 เป็นอินพุตคุณสามารถพิจารณาว่าการสังเกตใหม่ ณ เวลาใด tเป็นสิ่งที่เกินความจริงด้วยจำนวนของวิธีการ ใครจะประกาศxt ค่าผิดเพี้ยนถ้ามันอยู่นอกค่าเบี่ยงเบนมาตรฐานจำนวนหนึ่ง μt1 (ได้รับ σเสื้อ-12)แต่สิ่งนี้อาจมีปัญหาหากข้อมูลไม่เป็นไปตามสมมติฐานการกระจาย หากคุณต้องการไปถนนสายนี้ถ้าคุณคิดว่าจุดใหม่ไม่ใช่ค่าที่ผิดและต้องการรวมไว้ในค่าเฉลี่ยโดยไม่ลืมอัตราพิเศษ ถ้าอย่างนั้นคุณก็ทำได้ดีกว่า:

μเสื้อ=เสื้อ-1เสื้อμเสื้อ-1+1เสื้อxเสื้อ

ในทำนองเดียวกันคุณจะต้องอัพเดทความแปรปรวนแบบเรียกซ้ำ:

σเสื้อ2=เสื้อ-1เสื้อσเสื้อ-12+1เสื้อ-1(xเสื้อ-μเสื้อ)2

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

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

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

ฉันคิดว่าแนวทางในบรรทัดเหล่านี้จะนำไปสู่การอัปเดตที่เร็วที่สุดสำหรับปัญหาของคุณ


1
การใช้แผนภูมิควบคุมเป็นแนวคิดที่น่าสนใจ ดูเหมือนว่ามันอาจเป็นเรื่องยากที่จะเอาชนะความท้าทายที่ระบุไว้ในความคิดเห็นคำถาม ในกรณีที่ไม่อยู่นิ่งหากคุณ "ลืม" ค่าเก่าดูเหมือนว่าเป็นไปได้การประมาณการอาจมีอคติสูง ตัวอย่างเช่นคำแนะนำของคุณจะทำงานอย่างไรในกระแสข้อมูลที่ได้รับจากxเสื้อ=cos(πเสื้อ/106)+2เสื้อ/106? (สิ่งนี้จะค่อยๆลดลงอย่างมากทันใดนั้นก็กระโดดและเพิ่มขึ้นอย่าง
ช้า

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

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

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

@Innuo โพสต์ความคิดเห็นสั้น ๆ ที่stats.stackexchange.com/questions/56494/…ขอแนะนำให้ใช้ตัวอย่างแบบสุ่มของข้อมูลที่สังเกตได้ก่อนหน้านี้ทั้งหมดสามารถรักษาไว้ได้O(1)เวลา. แม้ว่ามันจะไม่ชัดเจนว่าจะทำอย่างไรการมีเพศสัมพันธ์กับผู้ประเมินค่าเฉลี่ยที่แข็งแกร่งนั้นเป็นวิธีการแก้ปัญหาสากลที่ใช้กับกระแสข้อมูลใด ๆ
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.