Một tập hợp xác suất không có dương tính giả?


35

Vì vậy, các bộ lọc Bloom khá tuyệt - chúng là các bộ hỗ trợ kiểm tra tư cách thành viên không có âm tính giả, nhưng rất ít khả năng là dương tính giả. Gần đây, tôi đã muốn có một "bộ lọc Bloom" đảm bảo điều ngược lại: không có dương tính giả, nhưng có khả năng phủ định sai.

Động lực của tôi rất đơn giản: được cung cấp một luồng lớn các mặt hàng để xử lý (với các bản sao), chúng tôi muốn tránh xử lý các mặt hàng mà chúng tôi đã thấy trước đây. Sẽ không hại gì khi xử lý một bản sao, nó chỉ là một sự lãng phí thời gian. Tuy nhiên, nếu chúng ta bỏ qua việc xử lý một yếu tố, nó sẽ là thảm họa. Với "bộ lọc Bloom đảo ngược", người ta có thể lưu trữ các mục được nhìn thấy với ít không gian và tránh xử lý các bản sao có xác suất cao bằng cách kiểm tra tư cách thành viên trong tập hợp.

Tuy nhiên, tôi dường như không thể tìm thấy bất cứ điều gì của loại. Gần nhất tôi đã tìm thấy là " bộ lọc Bloom được chỉnh sửa lại ", cho phép một bộ lọc trao đổi dương tính giả được chọn với tỷ lệ âm tính giả cao hơn. Tuy nhiên, tôi không biết cấu trúc dữ liệu của họ hoạt động tốt như thế nào khi một người muốn loại bỏ tất cả các kết quả dương tính giả.

Bất cứ ai cũng nhìn thấy bất cứ điều gì như thế này? :)


3
Phần bổ sung của bộ tôi quan tâm là vô hạn. Làm thế nào tôi sẽ lưu trữ nó?
Christopher Monsanto

11
Tôi thấy vấn đề (đĩa hiện đại chưa đủ lớn).
Dave Clarke

8
Nếu bạn có cấu trúc dữ liệu như vậy, bạn có thể sử dụng nó để "gian lận" bằng cách sử dụng kết hợp với bộ lọc nở thông thường và lưu trữ thành viên chính xác.
Đánh dấu Reitblatt

1
@MarkReitblatt cả bộ lọc và bộ nhớ cache của Bloom đều có xác suất và mọi kết hợp của chúng sẽ có xác suất, tức là không thể đạt được thử nghiệm thành viên chính xác. :)
awdz9nld

Câu trả lời:


25

Một câu trả lời là sử dụng một bảng băm lớn và khi nó lấp đầy bắt đầu thay thế các phần tử trong đó thay vì tìm các vị trí trống (không tồn tại) ở nơi khác cho chúng. Bạn không nhận được tỷ lệ cố định tốt cho các câu trả lời sai mà bạn làm với các bộ lọc Bloom, nhưng tốt hơn là không có gì. Tôi tin rằng đây là tiêu chuẩn, ví dụ như trong phần mềm cờ vua để theo dõi các vị trí đã được tìm kiếm.


Cảm ơn câu trả lời. Vâng, đó là giải pháp rõ ràng - nếu đó cũng là giải pháp tiêu chuẩn , nghe có vẻ như tôi đã hết may mắn. Ồ tốt
Christopher Monsanto

2
Đây được gọi là bộ đệm được ánh xạ trực tiếp và thường được sử dụng trong CPU. (Bất kỳ bộ đệm hoặc bộ đệm mất dữ liệu phù hợp với các yêu cầu ở các mức độ khác nhau). Tỷ lệ lỗi là một hàm của phân phối hàm băm (avalanche) và số lượng vị trí có sẵn trong bộ đệm / bộ - điều chỉnh tương ứng. :)
awdz9nld

Cũng lưu ý rằng chỉ có thể lưu trữ các khóa nguyên văn mà không giới thiệu dương tính giả (ví dụ: lưu trữ khóa băm)
awdz9nld

20

Đáp án cho câu hỏi này là không". Để xem tại sao, chúng ta có thể nghĩ về một trường hợp cực đoan và cách bộ lọc nở thông thường hoạt động so với bộ lọc nở "Thế giới Bizzaro" lý thuyết, mà chúng ta có thể gọi là "bộ lọc u ám".

Điều tuyệt vời về bộ lọc nở là bạn có thể thực hiện các thử nghiệm một phía cho tư cách thành viên của các mặt hàng (có dương tính giả) bằng cách sử dụng cấu trúc dữ liệu có kích thước cố định liên quan đến xác suất lỗi và số lượng mặt hàng được lưu trữ. Các kích thước của các mục mình không có vấn đề gì cả. Ví dụ: nếu chúng tôi có bộ lọc nở được thiết lập để lưu trữ tới 1.000 mục với sai số nhỏ hơn 3%, thì chúng tôi có thể lưu trữ 1.000 phiên bản hơi khác nhau của toàn bộ kho dữ liệu của Wikipedia, với mỗi chữ cái được thay đổi và chúng tôi vẫn sẽ lấy số liệu chúng tôi muốn và cấu trúc dữ liệu sẽ rất nhỏ (dưới một kilobyte). Tất nhiên, tính toán các giá trị băm đó sẽ là một thách thức, nhưng nguyên tắc vẫn còn.

Bây giờ, hãy xem xét việc lưu trữ các chuỗi lớn tương tự trong một bộ lọc u ám! Chúng tôi chỉ có thể có tiêu cực sai bây giờ. Vì vậy, nếu chúng ta nói "vâng, phiên bản đó của toàn bộ văn bản Wikipedia nằm trong bộ này", thì chúng ta phải hoàn toàn đúng về điều đó. Điều đó có nghĩa là băm sẽ không giúp chúng ta, vì sẽ luôn có một chuỗi khác băm đến cùng một giá trị. Cách duy nhất để nói "có" và chắc chắn là lưu trữ toàn bộ chuỗi hoặc một số dữ liệu tương đương có cùng độ dài. Chúng tôi luôn không thể lưu trữ nó và nói "không", nhưng cuối cùng tỷ lệ lỗi sẽ theo kịp chúng tôi. Điều tốt nhất chúng ta có thể làm là nén, đưa kích thước của cấu trúc xuống thành sản phẩm của entropy của dữ liệu được lưu trữ và độ chính xác mà chúng ta mong muốn.

Vì vậy, thật không may, bộ lọc u ám không tồn tại. Bộ nhớ đệm là giải pháp duy nhất, nhưng nó không thực sự trái ngược với bộ lọc nở, vì kích thước của nó sẽ tỷ lệ thuận với sản phẩm của lượng thông tin được lưu trữ và tỷ lệ chính xác mong muốn của bộ lọc. Tất nhiên, trong nhiều tình huống trong thế giới thực, dữ liệu lớn có thể được biểu thị bằng ID, do đó, bộ nhớ đệm vẫn có thể được chấp nhận hoàn toàn. Nhưng về cơ bản nó khác với bộ lọc nở hoa hùng mạnh.


thanh toán somethingsimilar.com/2012/05/21/the-opposite-of-a-bloom-filter - có chuyện gì vậy thực hiện này /
Yehosef

@Yehosef nó ổn và có thể hoạt động cho nhu cầu của bạn, nhưng bạn sẽ nhận thấy rằng tác giả nói về việc có "một vài ID xác định hoàn toàn sự kiện". Vì vậy, những gì được thực hiện có hiệu quả vẫn là lưu trữ toàn bộ đối tượng. Vì vậy, nó là một biến thể của bộ đệm. Một "đối diện với bộ lọc nở" thực sự, nếu nó tồn tại, sẽ không cần lưu trữ toàn bộ các đối tượng.
p9090

Ông đã đề cập đến một vài id xác định sự kiện - không phải toàn bộ đối tượng. Tôi chỉ cần giữ "bộ đệm" trên session_id - không phải toàn bộ bản ghi tương tác. Nhưng tôi nghe nói rằng đó không phải là cách tiếp cận giống như sự nở rộ hay một hyperloglog.
Yehosef

Trong "bằng chứng" của bạn, bạn cho rằng có vô số mục có thể. Tuy nhiên, có những trường hợp tập hợp các mục có thể được biết trước. Ví dụ: đối với bộ sưu tập rác của trang bộ nhớ: bạn biết nó chứa mục nào. Bây giờ bạn tạo một "bộ lọc u ám" ánh xạ từng mục có thể vào một chỉ mục 0..n. Bây giờ khi một mục bị loại bỏ, đặt bit a index đó. Khi tất cả các bit được đặt, bạn có thể thu thập rác trang. "Bộ lọc u ám" là một MPHF. Để cho phép phủ định sai, thay đổi MPHF sao cho một số mục được ánh xạ thành n + 1.
Thomas Mueller

@ThomasMueller Đúng, tôi giả sử trường hợp xấu nhất / trường hợp bất lợi, đó là quan điểm lý thuyết CS tiêu chuẩn. Đúng là nếu bạn chỉ có một bộ N mục nhập cố định, thì có rất nhiều giải pháp đơn giản, chỉ có không gian N cần thiết cho mỗi mục. Bộ lọc nở không có giới hạn như vậy, mặc dù.
p9090

13

Bạn chỉ muốn một bộ đệm , nhưng đang suy nghĩ về nó một cách kỳ lạ.


1
... quan tâm đến công phu? Tất nhiên một bộ đệm sẽ hoạt động, nhưng điều đó không lý tưởng, do đó một câu hỏi về trạng thái của nghệ thuật trong các cấu trúc dữ liệu xác suất. Để cụ thể hơn: các kỹ thuật lưu trữ mà tôi biết đòi hỏi rất nhiều dung lượng lưu trữ. Càng nhiều cấp độ bộ đệm, lưu trữ được sử dụng càng nhiều. Người ta có thể đặt một ràng buộc vào các thành phần được lưu trữ trong bộ đệm, thực hiện các thủ thuật với các kiểu sử dụng, v.v., nhưng điều đó vẫn không đạt được ở bất kỳ nơi nào gần hiệu suất không gian so với tỷ lệ trả lời sai mà bộ lọc Bloom cung cấp.
Christopher Monsanto

1
(tiếp theo) Điều đó đã được nói, tôi có thể quên đi một kỹ thuật bộ nhớ đệm rõ ràng giúp giải quyết tất cả các vấn đề của tôi. Trong trường hợp đó, bạn có thể nói rõ kỹ thuật đó thay vì cho tôi một liên kết đến một danh mục chung trên Wikipedia không?
Christopher Monsanto

2

TUYÊN BỐ TỪ CHỐI: Tôi không phải là một chuyên gia về bộ nhớ cache nên đây có thể là một ý tưởng ngây thơ, và cũng có thể là một ý tưởng đã biết mà tôi chưa từng nghe thấy trước đây. Vì vậy, xin lỗi nếu tôi không trích dẫn tài liệu tham khảo của nó (nếu nó tồn tại); và xin vui lòng thông báo cho tôi nếu có một tài liệu tham khảo cho nó để chỉnh sửa bài đăng và thêm nó. (Tôi nghi ngờ nó có thể có một tài liệu tham khảo vì nó rất trực quan).

cc


0

Tôi đã sử dụng cây AVL (và đôi khi đỏ đen) với các mục một phần để hoạt động như một bộ lọc không có âm bản giả. Chỉ sử dụng các byte X đầu tiên của mục khi chèn hoặc truy vấn cây. Bởi vì cấu trúc dữ liệu không có xác suất ở dạng, nên sẽ không có nguy cơ dương tính giả do va chạm bit. Và không giống như lưu trữ toàn bộ mục, cách tiếp cận này cung cấp cho bạn một không gian tối đa có thể tính toán được. Bạn có thể điều chỉnh tỷ lệ dương tính giả bằng cách xem xét độ dài tiền tố / độ sâu cây khác nhau so với chi phí của dương tính giả và không gian.


Tôi cũng muốn thử thử với dữ liệu chuỗi, nhưng dữ liệu của tôi có xu hướng được đóng gói cấu trúc nhị phân.
JRideout

0

Tôi nghĩ rằng người ta có thể chứng minh một giới hạn thấp hơn nói rằng cấu trúc dữ liệu trên không thể tồn tại. Về cơ bản, nếu cấu trúc dữ liệu sử dụng m bit, thì một vectơ bit cố định (biểu diễn của một đầu vào) có thể tương ứng với tối đa (((un) + n eps) \ select (un)) bằng một đối số đếm. Cho rằng 2 ^ m lần số này phải ít nhất (u \ select n) (tất cả các bộ phải được biểu diễn), chúng ta sẽ có một giới hạn thấp hơn về cơ bản rất gần với việc lưu trữ chính xác bộ S.

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.