Ước tính kích thước của một giao điểm của nhiều bộ bằng cách sử dụng một mẫu của một bộ


10

Tôi đang làm việc trên một thuật toán cần tính toán kích thước của một tập hợp được tạo bởi các giao điểm của ít nhất 2 bộ. Cụ thể hơn:

z=|A0An|

Các bộ được giao nhau được tạo bởi các truy vấn SQL và trong nỗ lực giữ mọi thứ nhanh, tôi nhận được số lượng của từng truy vấn trước, sau đó lấy bộ có số đếm thấp nhất ( ) và sử dụng các ID đó làm giới hạn phần còn lại của các truy vấn lớn, do đó giao lộ có hiệu quả trở thành:A0

z=|(A0A1)(A0An)|

Ngay cả chiến lược này cũng để lại cho tôi một số truy vấn khá lớn để chạy, vìđôi khi có thể lớn Ý tưởng của tôi để giải quyết vấn đề đó là lấy một mẫu ngẫu nhiên và giao nó với phần còn lại của các bộ trước khi ngoại suy trở lại ước tính chính xác của . Câu hỏi của tôi là: cách tốt nhất để lấy mẫu và sau đó ngoại suy để lấy lại giá trị , nếu không hoàn toàn chính xác, có phạm vi lỗi có thể dự đoán được không?|A0|A0zz


Đây là những gì tôi đã thử cho đến nay (trong mã giả, loại):

sample_threshold := 10000
factor := 1
if (len(A0) > sample_treshold) {
    factor = sample_threshold / len(A0)
}

// Take a random sample of size 10000 from A0

// Intersect all the other sets with the A0 sample, then with each other
working_set := A0
for i, a := range A {
    a = intersect(A0, a)
    working_set = intersect(working_set, a)
}

z := len(working_set) * (1 / factor)

Mã này hoạt động, nhưng dường như luôn đánh giá quá cao z, với cỡ mẫu thấp hơn mang lại ước tính cao hơn. Ngoài ra, tôi không chắc làm thế nào điều này sẽ mở rộng với hơn hai bộ để giao nhau.

Tôi hy vọng câu hỏi này có ý nghĩa, cho tôi biết nếu tôi có thể làm rõ thêm bất cứ điều gì. Ngoài ra, nếu câu hỏi này không có chủ đề hoặc thuộc về nơi nào khác, vui lòng cho tôi biết và tôi rất vui khi chuyển nó.


Theo nhận xét của Bill , tôi đã chạy một số thử nghiệm nhanh để hiển thị cỡ mẫu so với lỗi. Mỗi thùng cỡ mẫu được chạy 20 lần và như bạn có thể thấy có một xu hướng khá rõ ràng:

Âm mưu


Tôi nghĩ lấy mẫu ngẫu nhiên đơn giản mà không cần thay thế nên làm việc. Tôi bối rối rằng bạn đang đánh giá quá cao. Điều này có vẻ như nó ánh xạ chính xác để ước tính dân số có nghĩa là sử dụng trung bình mẫu từ một mẫu ngẫu nhiên. Bạn đang cố ước tính xác suất dân số rằng một phần tử của nằm trong giao điểm của các khác . Tôi đã xử lý một ví dụ đơn giản và nó hoạt động tốt. Làm thế nào chắc chắn rằng bạn luôn đánh giá quá cao? Nó đã xảy ra như 15 lần trong số 20 hoặc như 150 lần trong số 200? Là mẫu thực sự ngẫu nhiên? AA0A
Hóa đơn

1
@Bill Tôi đã thêm một biểu đồ kích thước mẫu so với lỗi minh họa những gì tôi đang thấy. Nó giống như 20 lần trong số 20. Đối với mẫu ngẫu nhiên, nó là ngẫu nhiên ORDER BY RAND(), không hoàn hảo nhưng phải phù hợp với nhiệm vụ này.
Jimmy Sawczuk

@JimmySawczuk Sẽ không tốt hơn nếu chỉ giao cắt "bộ làm việc" với "a" trực tiếp, thay vì "giao nhau (A0, a)"? Bởi vì "A0" có lẽ sẽ lớn hơn "bộ làm việc" hiện tại trong thuật toán sau lần chạy đầu tiên ... Tôi có hiểu chính xác điều này không?

Bạn có thể xác nhận rằng bạn thực sự có nghĩa là các tập hợp và không phải là nhiều tập tin (nghĩa là không có sự trùng lặp trong các tập hợp)? Bởi vì, nếu có, rất dễ để đánh giá quá cao kích thước của "giao điểm" bằng phương pháp của bạn. (Hãy xem xét trường hợp chỉ là 100 bản sao của cùng một yếu tố và bạn đã lấy mẫu một nửa trong số đó.)A0
Innuo

Ngoài ra tôi có thể hỏi nếu kích thước của giao lộ, so với kích thước của các bộ ban đầu, là cực kỳ nhỏ? Nếu vậy, tôi cảm thấy như thế sẽ giải thích vấn đề của bạn. Tôi đã chạy một số mô phỏng (với các bộ nhỏ hơn) và tôi cũng nhận được một sự đánh giá khá nhất quán, mặc dù nhỏ, đánh giá quá cao.

Câu trả lời:


3

Nếu tập hợp của bạn có các phần tử lặp lại (nghĩa là nó thực sự là nhiều phần tử), kích thước của giao điểm sẽ được đánh giá quá cao bởi quy trình của bạn vì hệ số tỷ lệ của bạn sử dụng số lượng phần tử được lấy mẫu chứ không phải số lượng "loại" duy nhất được lấy mẫu. Bạn có thể sửa ước tính bằng cách tính hệ số là tỷ lệ của số phần tử duy nhất trong mẫu ngẫu nhiên của bạn với số phần tử duy nhất trong toàn bộ .A 0A0A0


0

Như Innuo chỉ ra , vấn đề của tôi là do các bản sao trong bộ được lấy mẫu của tôi , khiến cho mã giả của tôi ở mức thấp, do đó khiến cho phép ngoại suy cuối cùng của nó quá cao vì nó được tạo ra qua nghịch đảo . Việc loại bỏ các bản sao đã giải quyết vấn đề này và bây giờ thuật toán tạo ra một biểu đồ kích thước mẫu so với kích thước mẫu dọc theo các dòng của những gì tôi mong đợi (các dòng chỉ ra biên độ sai số ở mức độ tin cậy 95% cho kích thước mẫu đó so với tổng dân số ):A0factorzfactor

Âm mưu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.