วิธีนี้ใช้ข้อเสนอแนะโดย @Innuo ในความคิดเห็นกับคำถาม:
คุณสามารถบำรุงรักษาชุดย่อยสุ่มที่สุ่มตัวอย่างขนาด 100 หรือ 1,000 จากข้อมูลทั้งหมดที่เห็น ชุดนี้และที่เกี่ยวข้อง "รั้ว" สามารถปรับปรุงในเวลาO ( 1 )
เมื่อเราทราบวิธีการบำรุงรักษาชุดย่อยนี้เราอาจเลือกวิธีใด ๆ ที่เราต้องการประเมินค่าเฉลี่ยของประชากรจากตัวอย่างดังกล่าว นี่เป็นวิธีการทั่วไปที่ไม่มีข้อสันนิษฐานใด ๆ ที่จะทำงานร่วมกับอินพุตสตรีมใด ๆภายในความแม่นยำที่สามารถคาดการณ์ได้โดยใช้สูตรการสุ่มตัวอย่างทางสถิติมาตรฐาน (ความแม่นยำนั้นแปรผกผันกับสแควร์รูทของขนาดตัวอย่าง)
อัลกอริทึมนี้ยอมรับว่าเป็นอินพุตสตรีมข้อมูล x ( T ) , t = 1 , 2 , … , ขนาดตัวอย่าง ม.และแสดงผลสตรีมของตัวอย่าง s ( t ) ซึ่งแต่ละอันเป็นตัวแทนของประชากร X( t ) = ( x ( 1 ) , x ( 2 ) , … , x ( t ) ). โดยเฉพาะสำหรับ1 ≤ i ≤ t, s ( i ) เป็นตัวอย่างสุ่มขนาดง่าย ๆ ม. จาก X( t ) (ไม่ต้องเปลี่ยนใหม่)
เพื่อสิ่งนี้จะเกิดขึ้นมันพอเพียงกับทุกคน ม.- องค์ประกอบย่อยของ { 1 , 2 , … , t } มีโอกาสเท่ากันในการเป็นดัชนีของ x ใน s ( t ). นี่แสดงถึงโอกาสที่x ( ฉัน) , 1≤i<t, อยู่ใน s(t) เท่ากับ m/t ให้ t≥m.
ในตอนแรกเราเพิ่งรวบรวมสตรีมจนกระทั่ง 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) เมื่อไหร่ i≤t. ด้วยความน่าจะเป็นm/(t+1)×1/m = 1/(t+1) มันจะถูกลบออกจาก s(t+1)ดังนั้นความน่าจะเป็นที่เหลือจะเท่ากับ
mt(1−1t+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
เล่นบทบาทของเสื้อและsample.size
เป็นม.. ดัชนีเสื้อ จะถูกดูแลโดยผู้เรียก)
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