Giải pháp này thực hiện một đề xuất của @Innuo trong một bình luận cho câu hỏi:
Bạn có thể duy trì một tập hợp con ngẫu nhiên được lấy mẫu thống nhất có kích thước 100 hoặc 1000 từ tất cả các dữ liệu được thấy cho đến nay. Bộ này và "hàng rào" liên quan có thể được cập nhật trong thời gian .O(1)
Khi chúng tôi biết cách duy trì tập hợp con này, chúng tôi có thể chọn bất kỳ phương pháp nào chúng tôi muốn ước tính giá trị trung bình của dân số từ một mẫu như vậy. Đây là một phương pháp phổ quát, không có giả định nào, sẽ hoạt động với bất kỳ luồng đầu vào nào trong độ chính xác có thể dự đoán bằng các công thức lấy mẫu thống kê tiêu chuẩn. (Độ chính xác tỷ lệ nghịch với căn bậc hai của cỡ mẫu.)
Thuật toán này chấp nhận làm đầu vào một luồng dữ liệu cỡ mẫu và xuất ra một luồng mẫu mỗi mẫu đại diện cho dân số . Cụ thể, với , là một mẫu ngẫu nhiên đơn giản có kích thước từ (không thay thế).t = 1 , 2 , ... , m s ( t ) X ( t ) = ( x ( 1 ) , x ( 2 ) , ... , x ( t ) ) 1 ≤ i ≤ t s ( i ) m X ( t )x(t), t=1,2,…,ms(t)X(t)=(x(1),x(2),…,x(t))1≤i≤ts(i)mX(t)
Đối với điều này xảy ra, nó cũng đủ rằng mỗi -element tập hợp con của có cơ hội bình đẳng là các chỉ số của trong . Điều này hàm ý rằng bằng bằng được cung cấp .m{1,2,…,t}xs(t)x(i), 1≤i<t,s(t)m/tt≥m
Lúc đầu, chúng tôi chỉ thu thập luồng cho đến khi phần tử được lưu trữ. Tại thời điểm đó chỉ có một mẫu có thể, vì vậy điều kiện xác suất được thỏa mãn tầm thường.m
Thuật toán tiếp quản khi . Giả sử rằng là một mẫu ngẫu nhiên đơn giản của cho . Đặt tạm thời . Đặt là một biến ngẫu nhiên thống nhất (không phụ thuộc vào bất kỳ biến nào trước đây được sử dụng để xây dựng ). Nếu thì thay thế một phần tử được chọn ngẫu nhiên của bằng . Đó là toàn bộ thủ tục!t=m+1s(t)X(t)t>ms(t+1)=s(t)U(t+1)s(t)U(t+1)≤m/(t+1)sx(t+1)
Rõ ràng có xác suất là . Hơn nữa, theo giả thuyết cảm ứng, có xác suất tính bằng khi . Với xác suất = nó sẽ bị xóa khỏi , từ đó xác suất còn lại của nó bằngx(t+1)m/(t+1)s(t+1)x(i)m/ts(t)i≤tm/(t+1)×1/m1/(t+1)s(t+1)
mt(1−1t+1)=mt+1,
chính xác như cần thiết Theo cảm ứng, sau đó, tất cả các xác suất đưa vào của trong là chính xác và rõ ràng không có mối tương quan đặc biệt nào giữa các vùi này. Điều đó chứng tỏ thuật toán là chính xác.x(i)s(t)
Hiệu suất thuật toán là vì ở mỗi giai đoạn, nhiều nhất hai số ngẫu nhiên được tính toán và nhiều nhất là một phần tử của một mảng các giá trị được thay thế. Yêu cầu lưu trữ là .O(1)mO(m)
Cấu trúc dữ liệu cho thuật toán này bao gồm các mẫu cùng với chỉ số dân số mà nó mẫu. Ban đầu chúng tôi lấy và tiến hành thuật toán cho Đây là một triển khai để cập nhật với giá trị để tạo . (Đối số đóng vai trò của và là . Chỉ số sẽ được duy trì bởi người gọi.)stX(t)s=X(m)t=m+1,m+2,….R
(s,t)x(s,t+1)n
tsample.size
mt
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)
}
Để minh họa và kiểm tra điều này, tôi sẽ sử dụng công cụ ước tính (không mạnh) thông thường của giá trị trung bình và so sánh giá trị trung bình theo ước tính từ với giá trị trung bình thực tế của (tập hợp dữ liệu tích lũy được thấy ở mỗi bước ). Tôi đã chọn một luồng đầu vào hơi khó, thay đổi khá trơn tru nhưng định kỳ trải qua những bước nhảy kịch tính. Cỡ mẫu của khá nhỏ, cho phép chúng ta thấy biến động lấy mẫu trong các ô này.X ( t ) m = 50s(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]))
Tại thời điểm online
này là chuỗi các ước tính trung bình được tạo ra bằng cách duy trì mẫu giá trị đang chạy này trong khi đó là chuỗi các ước tính trung bình được tạo ra từ tất cả các dữ liệu có sẵn tại mỗi thời điểm. Biểu đồ cho thấy dữ liệu (màu xám), (màu đen) và hai ứng dụng độc lập của quy trình lấy mẫu này (bằng màu sắc). Thỏa thuận nằm trong lỗi lấy mẫu dự kiến:50actual
actual
plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")
Đối với các công cụ ước tính mạnh mẽ về giá trị trung bình, vui lòng tìm kiếm trang web của chúng tôi để biết các thuật ngữ ngoại lệ và liên quan. Trong số các khả năng đáng xem xét là phương tiện Winsorized và ước tính M.