Các thuật toán để tính toán hàm phân phối thực nghiệm (ECDF) đa biến?


9

ECDF một chiều khá dễ tính toán. Tuy nhiên, khi nói đến hai chiều trở lên, tài nguyên trực tuyến trở nên thưa thớt và khó tiếp cận. Bất cứ ai cũng có thể đề xuất, định nghĩa và / hoặc trình bày các thuật toán hiệu quả (chưa thực hiện được thực hiện) để tính toán ECDF đa biến?


Đây có thể là một câu hỏi về khoa học máy tính, nhưng tôi nghĩ đây là nơi tốt nhất để tìm câu trả lời, hãy cho tôi biết nếu tôi nên tìm ở nơi khác. Cảm ơn.
Alexander F.

Có thực sự có sự khác biệt cơ bản? Tính toán ECDF đơn biến tương đương với việc sắp xếp dữ liệu. Tính toán ECDF đa biến tương đương với việc sắp xếp dữ liệu theo từ vựng.
whuber

1
@whuber, không chính xác, theo như tôi biết. Đối với mỗi điểm dữ liệu X(i), chúng ta cần đếm số lượng điểm có trong hypercube được xác định bởi nó (từ -inflên đến và bao gồm X(i)trong tất cả các kích thước). Sắp xếp từ điển (từ điển?) Sẽ không nhất thiết phải hoạt động ở đây, vì các điểm dữ liệu phải được so sánh theo từng chiều riêng biệt. Ví dụ: (2,3,4)sẽ tự từ điển lớn hơn so với (1,2,15), nhưng hypercube đó của định nghĩa bởi (2,3,4)sẽ không chứa (1,2,15)từ 15>4.
Alexander F.

Đúng, sự tương ứng không phải là trực tiếp. Nhưng người ta sẽ khai thác sự sắp xếp đó, hoặc một cái gì đó tương tự, để xây dựng một điểm tứ giác (hoặc octree, v.v. ) với nỗ lực . Bạn có thể muốn điều tra hình học tính toán và tài liệu lập chỉ mục không gian để biết chi tiết. O(nlog(n))
whuber

Câu trả lời:


7

Về điều tra thêm, bài viết sau đây đưa ra các thuật toán hiệu quả cho vấn đề kD ECDF:

Bentley, JL (1980). Chia và chinh phục đa chiều. Truyền thông của ACM, 23 (4), 214-229.

Cấu trúc dữ liệu chính được giới thiệu được gọi là cây phạm vi và có phần giống với cây kd , nhưng sử dụng sự đánh đổi không gian theo thời gian để đạt được các truy vấn phạm vi nhanh hơn. Tác giả của bài báo trên, Jon Bentley (danh tiếng của Lập trình viên ngọc trai), là người phát minh ra cả hai cấu trúc dữ liệu.

Cả hai đều là cây nhị phân phân vùng đệ quy một tập hợp các điểm chiều bằng cách chia dọc theo trục tọa độ tại trung tuyến. Trong cây kd, các cây con của một nút được phân chia dọc theo chiều thứ , trong đó chu kỳ qua di chuyển xuống cây. Trong cây phạm vi, các cây con luôn được phân chia theo chiều thứ nhất , nhưng mỗi nút được tăng thêm với cây phạm vi được xác định trên các kích thước còn lại.kdd1kk1

Tại thời điểm viết bài này, trang Wikipedia cho "Phạm vi cây" đã liên kết các điểm trên với một bài giảng CS (Utrecht U.) so sánh hai loại cây này từ khoảng năm 2012. Điều này cho thấy các cấu trúc dữ liệu này về cơ bản vẫn là "trạng thái của nghệ thuật ". Có đề cập đến một biến thể "phân tầng" cải tiến cho các cây phạm vi, nhưng đối với bài toán ECDF tất cả các điểm, điều này chỉ cho phép đạt được hiệu suất của thuật toán của Bentley thông qua các truy vấn lặp lại của cây phạm vi.


Cảm ơn vì bài báo thú vị! Tôi nghĩ rằng đây là những gì tôi cần re: cây kd. Sẽ là tuyệt vời để xem các phương pháp thay thế. Trừ khi cái này là trạng thái của nghệ thuật.
Alexander F.

@AlexanderF. Tôi đã cập nhật câu trả lời của mình để mô tả tốt hơn thuật toán (bao gồm cả tài liệu tham khảo "chính thức" hơn). Nó xuất hiện cách tiếp cận vẫn gần với trạng thái của nghệ thuật. Đối với những phát triển gần đây, cụm từ chính dường như là "truy vấn phạm vi trực giao" nếu bạn muốn điều tra thêm.
GeoMatt22

3

Tôi không chắc có cách nào hiệu quả hơn để tính toán ECDF tại các điểm dữ liệu hay không , nhưng cách tiếp cận bạo lực sau đây sẽ hiệu quả để tính toán ECDF qua "lưới" dữ liệu . Đây là một khái quát đơn giản của phiên bản 1D.

Giả sử bạn có một bộ dữ liệu gồm điểm trong kích thước, được đưa ra trong ma trận . Để đơn giản, tôi sẽ giả sử rằng bao gồm toàn bộ các số duy nhất (nghĩa là vị trí chung *). Tôi sẽ sử dụng ký hiệu Matlab trong mã giả sau đây, vì đó là cách tôi nghĩ về thuật toán, nhưng tôi có thể mở rộng về điều này nếu có hứng thú.NdN×dXX

Tính toán đầu tiên

[x:,k,I:,k]=sort[X:,k] cho ,k=1:d

Trong đó là ma trận thứ hạng tọa độ khôn ngoan và là ma trận trục tọa độ lưới (cả hai kích thước ).IxN×d

Sau đó rasterize các điểm dữ liệu vào lưới dữ liệu ngụ ý, tính toán biểu đồ (đã chuẩn hóa) thành .P=accumarray[I,1N,N×ones[1,d]]

Sau đó tích hợp "EPDF" này vào từng chiều để cung cấp ECDF: cho .P=cumsum[P,k]k=1:d

Bây giờ là ECDF được lấy mẫu tại .Pi1,,idxTôi1,1,Giáo dụcxTôid,d

Thuật toán này cần thời gian cho mỗi loại và cho mỗi tổng, vì vậy tổng chi phí là . Vì bản thân ECDF có lưới có các phần tử , nên về cơ bản là tối ưu.Ôi[Nđăng nhậpN]Ôi[Nd]Ôi[d(Nd+Nđăng nhậpN)]Ôi[Nd]

(* Giả định về các điểm khác biệt có thể được nới lỏng bằng cách sử dụng thay vì , cùng với một chút lưu giữ sách.)độc nhất[]sắp xếp[]


1
Bạn có thể quan tâm đến việc tìm hiểu về tứ giác và các khái quát hóa chiều cao hơn của chúng, cung cấp các cách hiệu quả để tìm kiếm các không gian Euclide cho các điểm. Họ sử dụng tài nguyên , tốt hơn nhiều so với cho . Ôi(Nđăng nhập(N))Ôi(Nd)d>1
whuber

1
@whuber Tôi có một số ý tưởng về những điều này, (ví dụ cây kd ). Tôi không chắc chắn nếu có một "câu trả lời tốt nhất" ở đây? Thông thường đối với một vấn đề như thế này, bạn cũng sẽ chỉ định hoạt động nào mà cấu trúc dữ liệu ECDF trừu tượng của bạn sẽ hỗ trợ (ví dụ: truy vấn điểm, tích hợp không gian con, cập nhật với các điểm mới, v.v.). Điều này sẽ giúp xác định những gì thực hiện là phù hợp nhất.
GeoMatt22

1
Tôi tin rằng cần phải rõ ràng những hoạt động cần được hỗ trợ cho ECDF. Điều tối thiểu là đánh giá nó tại bất kỳ điểm nào trong không gian. Đúng là nếu một người định xây dựng ECDF một cách linh hoạt, các phương pháp thay thế có thể vượt trội hơn, nhưng những vấn đề đó dường như nằm ngoài phạm vi của câu hỏi hiện tại.
whuber

@ GeoMatt22, đây thực sự trông giống như một phương pháp tính toán biểu đồ và nó có thể ổn trong trường hợp xấp xỉ là "đủ tốt". Tuy nhiên, tại sao lại sử dụng một phương pháp O(N^d)khi tiếp cận lực lượng vũ phu O(d*N^2). Ví dụ về Fro, hiện tại tôi không có bộ dữ liệu quá lớn nên tôi sử dụng một lớp lót Matlab sau đây để tính toán ECDF chiều d với O(d*N)độ phức tạp lưu trữ ( C(i)là tần số của điểm dữ liệu Y(i,:)): arrayfun(@(i) sum(C(all(bsxfun(@le,Y, Y(i,:)), 2))), (1:size(Y,1)).');
Alexander F.

1
(+1) Không phải để đưa ra một thuật toán hiệu quả, mà là để giải thích rõ ràng một thuật toán không hiệu quả giúp tôi hiểu được vấn đề.
Scortchi - Phục hồi Monica
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.