Thuật toán theo dõi động lượng tử


24

Tôi muốn ước tính số lượng của một số dữ liệu. Dữ liệu quá lớn đến nỗi chúng không thể chứa trong bộ nhớ. Và dữ liệu không tĩnh, dữ liệu mới tiếp tục đến. Có ai biết bất kỳ thuật toán nào để theo dõi lượng tử của dữ liệu được quan sát cho đến nay với bộ nhớ và tính toán rất hạn chế không? Tôi thấy thuật toán P2 hữu ích, nhưng nó không hoạt động tốt cho dữ liệu của tôi, được phân phối cực kỳ nặng nề.


Đối với một số ý tưởng (trong bối cảnh ước tính trung bình), hãy xem chủ đề tại stats.stackexchange.com/q/346/919 .
whuber

3
Câu hỏi này được crossposted trên math.SE.
Đức Hồng Y

Câu trả lời:


16

Thuật toán P2 là một tìm kiếm tốt đẹp. Nó hoạt động bằng cách thực hiện một số ước tính của lượng tử, cập nhật chúng định kỳ và sử dụng phép nội suy bậc hai (không phải tuyến tính, không phải khối) để ước lượng lượng tử. Các tác giả cho rằng phép nội suy bậc hai hoạt động tốt hơn ở đuôi so với phép nội suy tuyến tính và khối sẽ trở nên quá phức tạp và khó khăn.

Bạn không nói chính xác cách tiếp cận này thất bại đối với dữ liệu "đuôi nặng" của bạn, nhưng thật dễ đoán: ước tính lượng tử cực đoan cho phân phối đuôi nặng sẽ không ổn định cho đến khi một lượng lớn dữ liệu được thu thập. Nhưng đây sẽ là một vấn đề (ở mức độ thấp hơn) ngay cả khi bạn đã lưu trữ tất cả dữ liệu, vì vậy đừng mong đợi phép màu!

Ở bất kỳ giá nào, tại sao không đặt các dấu phụ - hãy gọi chúng là và - với điều bạn chắc chắn là lượng tử sẽ nằm và lưu trữ tất cả dữ liệu nằm giữa và ? Khi bộ đệm của bạn đầy, bạn sẽ phải cập nhật các điểm đánh dấu này, luôn giữ . Một thuật toán đơn giản để thực hiện điều này có thể được tạo ra từ sự kết hợp của (a) ước tính P2 hiện tại của lượng tử và (b) số lượng lưu trữ của số lượng dữ liệu nhỏ hơn và số lượng dữ liệu lớn hơnx0x 0 x 6 x 0x 6 x 0 x 6x6x0x6x0x6x0x6. Theo cách này, bạn có thể, với độ chắc chắn cao, ước tính lượng tử cũng như nếu bạn có sẵn toàn bộ dữ liệu, nhưng bạn chỉ cần một bộ đệm tương đối nhỏ.

Cụ thể, tôi đang đề xuất cấu trúc dữ liệu để duy trì thông tin một phần về chuỗi giá trị dữ liệu . Ở đây, là danh sách được liên kếtn x 1 , x 2 , Mạnh , x n y(k,y,n)nx1,x2,,xny

y=(x[k+1](n)x[k+2](n)x[k+m](n)).

Trong ký hiệu này biểu thị nhỏ nhất trong số các giá trị được đọc cho đến nay. là một hằng số, kích thước của bộ đệm . i th n x m yx[i](n)ithn xmy

Thuật toán bắt đầu bằng cách điền với các giá trị dữ liệu đầu tiên gặp phải và đặt chúng theo thứ tự được sắp xếp, nhỏ nhất đến lớn nhất. Đặt là lượng tử được ước tính; ví dụ: = 0,99. Khi đọc có ba hành động có thể xảy ra: m q q x n + 1ymqqxn+1

  • Nếu , tăng . kxn+1<x[k+1](n)k

  • Nếu , không làm gì cả.xn+1>x[k+m](n)

  • khác, chèn vào . yxn+1y

Trong mọi trường hợp, tăng .n

Quy trình chèn đặt vào theo thứ tự được sắp xếp và sau đó loại bỏ một trong các giá trị cực trị trong : y yxn+1yy

  • Nếu , sau đó xóa khỏi và tăng ;x ( n ) [ k + 1 ] y kk+m/2<nqx[k+1](n)yk

  • Nếu không, hãy xóa khỏi . yx[k+m](n)y

Với điều kiện là đủ lớn, quy trình này sẽ đóng khung lượng tử thực của phân phối với xác suất cao. Ở bất kỳ giai đoạn nào, nó có thể được ước tính theo cách thông thường theo và , có khả năng sẽ nằm trong . (Tôi tin rằng chỉ phải chia tỷ lệ như căn bậc hai của lượng dữ liệu tối đa ( ), nhưng tôi chưa thực hiện một phân tích nghiêm ngặt nào để chứng minh điều đó.) Ở bất kỳ tỷ lệ nào, thuật toán sẽ phát hiện liệu nó có thành công hay không (bởi so sánh và với ).n x ( n ) [ q n] x ( n ) [ q n] y m N k / n ( k + m ) / n qmnx[qn](n)x[qn](n)ymNk/n(k+m)/nq

Thử nghiệm với tối đa 100.000 giá trị, sử dụng và (trường hợp khó nhất) cho thấy thuật toán này có tỷ lệ thành công 99,5% trong việc lấy giá trị đúng của . Đối với luồng có giá trị , yêu cầu bộ đệm chỉ có hai triệu (nhưng ba hoặc bốn triệu sẽ là lựa chọn tốt hơn). Sử dụng danh sách liên kết đôi được sắp xếp cho bộ đệm yêu cầu = trong khi xác định và xóa tối đa hoặc tối thiểu là các hoạt động . Việc chèn tương đối đắt tiền thường chỉ cần được thực hiện q=0,5x ( n ) [ q n] N=10 12 O(log(m=2Nq=.5x[qn](n)N=1012O(log(N))O(log(N))O(1)O(N)lần Do đó, chi phí tính toán của thuật toán này là trong thời gian và trong lưu trữ.O(N+Nlog(N))=O(N)O(N)


Đây là một công việc mở rộng của thuật toán P2. [link] sim.sagepub.com/content/49/4/159.abab . Dung lượng lưu trữ vẫn còn quá nhiều cho ứng dụng của tôi, chạy trên các cảm biến nhỏ với tổng dung lượng RAM 10K. Tôi chỉ có thể tiêu thụ vài trăm byte cho ước tính định lượng.
sinoTrinity

@whuber Trên thực tế tôi triển khai P2 mở rộng và kiểm tra nó với các mẫu được tạo từ các bản phân phối khác nhau như thống nhất và hàm mũ, nơi nó hoạt động rất tốt. Nhưng khi tôi áp dụng nó với dữ liệu từ ứng dụng của mình, không biết phân phối, đôi khi nó không hội tụ và mang lại lỗi tương đối (abs (ước tính - thực tế) / thực tế) lên tới 300%.
sinoTrinity

2
@sino Chất lượng của thuật toán so với việc sử dụng tất cả dữ liệu không nên phụ thuộc vào độ nặng của đuôi. Một cách công bằng hơn để đo lường lỗi là đây: hãy để là cdf theo kinh nghiệm. Đối với ước tínhF củaqphần trăm, sự khác biệt giữa những gì làF( q )F(q)? Nếu nó theo thứ tự1/n thìbạn đang làm rất tốt. Nói cách khác, thuật toán P2 trả về dữ liệu của bạn là bao nhiêu phần trăm? q^qF(q^)F(q)1/n
whuber

Bạn đúng rồi. Tôi chỉ đo F (qˆ) và F (q) cho trường hợp tôi đã đề cập với sai số tương đối lên tới 300%. Đối với q là 0,7, qˆ gần như 0,7, dẫn đến sai số không đáng kể. Tuy nhiên, với q là 0,9, qˆ dường như là khoảng 0,95. Tôi đoán đó là lý do tại sao tôi có lỗi rất lớn lên tới 300%. Bất cứ ý tưởng tại sao nó là 0,95, không phải 0,9? BTW, tôi có thể đăng hình ở đây không và làm cách nào để đăng công thức toán học như bạn đã làm?
sinoTrinity

2
@whuber Tôi khá tự tin rằng việc triển khai của mình phù hợp với P2 mở rộng. 0,9 vẫn còn 0,95 hoặc thậm chí lớn hơn khi tôi ước tính đồng thời các lượng tử 0,8, 0,85, 0,9, 0,95. Tuy nhiên, 0,9 rất gần với 0,9 nếu các số lượng 0,8, 0,85, 0,9, 0,95 và 1,0 được theo dõi cùng một lúc.
sinoTrinity

5

Tôi nghĩ đề xuất của whuber là tuyệt vời và tôi sẽ thử nó trước. Tuy nhiên, nếu bạn tìm thấy bạn thực sự không thể chứa các lưu trữ hoặc nó không hoạt động vì một số lý do khác, đây là một ý tưởng cho việc khái quát hóa khác nhau của P2. Nó không chi tiết như những gì whuber gợi ý - giống như một ý tưởng nghiên cứu hơn là một giải pháp.O(N)

Thay vì theo dõi các lượng tử ở , p / 2 , p , ( 1 + p ) / 21 , như thuật toán P2 ban đầu cho thấy, bạn chỉ cần theo dõi nhiều lượng tử hơn (nhưng vẫn là một số không đổi). Có vẻ như thuật toán cho phép điều đó theo cách rất đơn giản; tất cả những gì bạn cần làm là tính toán "nhóm" chính xác cho các điểm đến và cách đúng để cập nhật các lượng tử (sử dụng các số liền kề).0p/2p(1+p)/21

Nói rằng bạn theo dõi điểm. Bạn có thể thử theo dõi quantile tại 0 , p / 12 , ... , p 11 / 12 , p , p + ( 1 - p ) / 12 , ... , p + 11 ( 1 - p ) / 12 , 1 (hái các điểm cách đều nhau trong khoảng từ 0 đến p và giữa p250p/12p11/12pp+(1p)/12p+11(1p)/1210pp ), hoặc thậm chí sử dụng 22 Chebyshev nút có dạng p / 2 ( 1 + cos ( 2 i - 1 ) π122 p+(1-p)/2(1+cos(2i-1)πp/2(1+cos(2i1)π22). Nếupgần bằng0hoặc1, bạn có thể thử đặt ít điểm hơn ở phía bên có khối lượng xác suất ít hơn và nhiều hơn ở phía bên kia.p+(1p)/2(1+cos(2i1)π22)p01

Nếu bạn quyết định theo đuổi điều này, tôi (và có thể những người khác trên trang web này) sẽ quan tâm đến việc liệu nó có hoạt động không ...


+1 Tôi nghĩ rằng đây là một ý tưởng tuyệt vời với các ràng buộc của OP. Tất cả mọi người có thể hy vọng là một xấp xỉ, vì vậy mẹo là chọn các thùng có khả năng hẹp và chứa lượng tử mong muốn.
whuber

3

Nhấn và cộng sự, Công thức số 8.5.2 "Ước lượng một lần của các lượng tử tùy ý" p. 435, cung cấp cho IQAgent lớp c ++, cập nhật một cdf gần đúng tuyến tính từng phần.


Books.google.com.vn cho một phiên bản không yêu cầu Flash.
ZachB

2

Điều này có thể được điều chỉnh từ các thuật toán xác định trung vị của một bộ dữ liệu trực tuyến. Để biết thêm thông tin, hãy xem bài đăng stackoverflow này - /programming/1387497/find-median-value-from-a-growing-set


Các tài nguyên tính toán cần thiết của thuật toán bạn liên kết đến lớn không cần thiết và không đáp ứng các yêu cầu của câu hỏi này.
whuber

2

Tôi sẽ xem xét hồi quy lượng tử. Bạn có thể sử dụng nó để xác định ước tính tham số của bất kỳ lượng tử nào bạn muốn xem xét. Nó không có giả định liên quan đến tính quy tắc, vì vậy nó xử lý sự không đồng nhất khá tốt và có thể được sử dụng một cơ sở cửa sổ cuộn. Về cơ bản, nó là một hồi quy bị phạt L1-Norm, do đó, nó không quá chuyên sâu về số lượng và có các gói R, SAS và SPSS khá đầy đủ tính năng cùng với một vài triển khai MATLAB ngoài kia. Đây là wiki chính và gói R để biết thêm thông tin.

Đã chỉnh sửa:

Kiểm tra liên kết trao đổi ngăn xếp toán học: Ai đó đã chọn một vài bài viết về cơ bản đưa ra ý tưởng rất đơn giản là chỉ sử dụng một cửa sổ thống kê đơn hàng để ước tính số lượng. Theo nghĩa đen, tất cả những gì bạn phải làm là sắp xếp các giá trị từ nhỏ nhất đến lớn nhất, chọn định lượng bạn muốn và chọn giá trị cao nhất trong định lượng đó. Rõ ràng bạn có thể cân nhắc nhiều hơn cho các quan sát gần đây nhất nếu bạn tin rằng chúng đại diện hơn cho các điều kiện hiện tại thực tế. Điều này có thể sẽ đưa ra ước tính sơ bộ, nhưng nó khá đơn giản để thực hiện và bạn không phải trải qua các chuyển động của việc nâng vật nặng. Chỉ là một ý nghĩ.


1

Có thể ước tính (và theo dõi) các lượng tử trên cơ sở trực tuyến (áp dụng tương tự cho các tham số của hồi quy lượng tử). Về bản chất, điều này làm giảm độ dốc xuống ngẫu nhiên trên hàm mất kiểm tra xác định hồi quy lượng tử (lượng tử được biểu thị bằng một mô hình chỉ chứa một giao thoa), ví dụ như cập nhật các tham số chưa biết khi và quan sát đến.

Xem bài viết của Bell Labs "Ước tính số lượng tăng dần để theo dõi hàng loạt" ( ftp://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/ con / kdd / p516-pen.pdf )


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.