Đối với hai vectơ hợp lý, x
và y
, dài> 1E8, cách nhanh nhất để tính toán các bảng chéo 2x2 là gì?Cách nhanh nhất để đặt chéo hai vectơ lôgic lớn trong R
Tôi nghi ngờ câu trả lời là viết nó trong C/C++, nhưng tôi tự hỏi nếu có điều gì đó trong R đã khá thông minh về vấn đề này, vì nó không phải là không phổ biến.
Ví dụ mã, cho 300M mục (cảm thấy tự do để N = 1E8 nếu 3E8 quá lớn; tôi đã chọn tổng kích thước dưới 2,5 GB (2,4 GB) .Tôi nhắm mục tiêu mật độ 0,02, chỉ để làm cho nó nhiều hơn thú vị (người ta có thể sử dụng một vector thưa thớt, nếu điều đó giúp, nhưng kiểu chuyển đổi có thể mất thời gian)
set.seed(0)
N = 3E8
p = 0.02
x = sample(c(TRUE, FALSE), N, prob = c(p, 1-p), replace = TRUE)
y = sample(c(TRUE, FALSE), N, prob = c(p, 1-p), replace = TRUE)
một số phương pháp rõ ràng:.
table
bigtabulate
- Hoạt động lôgic đơn giản (ví dụ:
sum(x & y)
) - Vector nhân (boo)
data.table
- Một số những điều trên, với
parallel
từ góimulticore
(hoặcparallel
gói mới)
Tôi đã lấy một đâm vào người đầu tiên ba lựa chọn (xem câu trả lời của tôi), nhưng tôi cảm thấy rằng phải có một cái gì đó tốt hơn và nhanh hơn.
Tôi thấy rằng table
hoạt động rất chậm. bigtabulate
có vẻ như quá mức cần thiết cho một cặp vectơ logic. Cuối cùng, thực hiện các hoạt động hợp lý vani có vẻ giống như một kludge, và nó nhìn vào mỗi vectơ quá nhiều lần (3X? 7X?), Chưa kể rằng nó lấp đầy nhiều bộ nhớ bổ sung trong quá trình xử lý, đó là một thời gian thải lớn.
Phép nhân Vector thường là một ý tưởng tồi, nhưng khi véc tơ thưa thớt, người ta có thể có được lợi thế từ việc lưu trữ nó như vậy, và sau đó sử dụng phép nhân vectơ.
Hãy thay đổi N
và p
, nếu điều đó sẽ chứng minh bất kỳ hành vi thú vị nào của các chức năng tabulation. :)
Update 1. Câu trả lời đầu tiên của tôi cho timings trên ba phương pháp ngây thơ, đó là cơ sở để tin table
là chậm. Tuy nhiên, điều quan trọng để nhận ra là phương pháp "hợp lý" là không hiệu quả. Nhìn vào những gì nó làm:
- 4 hoạt động vector logic
- 4 chuyển đổi loại hình (logic để nguyên hoặc FP - cho
sum
) - 4 summations vector
- 8 bài tập (1 cho các hoạt động hợp lý, 1 để tổng kết)
Không chỉ vậy, nhưng nó thậm chí không được biên soạn hoặc song song. Tuy nhiên, nó vẫn đánh bại chiếc quần của table
.Lưu ý rằng bigtabulate
, với chuyển đổi loại bổ sung (1 * cbind...
) vẫn bị đánh bại table
.
Cập nhật 2. Vì vậy, bất kỳ ai cũng chỉ ra rằng các vectơ logic trong hỗ trợ R NA
và đó sẽ là một cờ lê trong hệ thống cho các bảng chéo này (điều này đúng trong hầu hết các trường hợp). từ is.na()
hoặc is.finite()
. :) Tôi đã gỡ lỗi NA
và các giá trị không hữu hạn khác - they've been a headache for me recently. Nếu bạn không biết có hay không phải tất cả các mục của bạn là NA
, bạn có thể thử nghiệm với any(is.na(yourVector))
- đây sẽ là khôn ngoan trước khi bạn áp dụng một số ý tưởng phát sinh trong Q này & A.
Cập nhật 3. Brandon Bertelsen hỏi một câu hỏi rất hợp lý trong các ý kiến: tại sao lại sử dụng quá nhiều dữ liệu khi một mẫu phụ (tập đầu tiên, sau khi tất cả, là một mẫu ;-)) có thể là thích hợp cho mục đích tạo một bảng chéo? Không được trôi quá xa vào số liệu thống kê, nhưng dữ liệu phát sinh từ các trường hợp mà các quan sát TRUE
là rất hiếm, đối với cả hai biến. Một là kết quả của một dị thường dữ liệu, khác do một lỗi có thể trong mã (có thể lỗi vì chúng ta chỉ thấy kết quả tính toán - suy nghĩ của biến x
là "Garbage In", và y
là "Garbage Out". , câu hỏi đặt ra là liệu các vấn đề trong đầu ra gây ra bởi mã chỉ là những trường hợp dữ liệu bất thường, hoặc có một số trường hợp khác có dữ liệu tốt không? (Đây là lý do tại sao tôi hỏi một câu hỏi về stopping when a NaN
, NA
, or Inf
is encountered.)
Điều đó cũng giải thích lý do vì sao ví dụ của tôi có xác suất thấp cho các giá trị TRUE
, những giá trị này thực sự xảy ra ít hơn 0,1% thời gian. (I E. các vị trí của TRUE
trong mỗi bộ) và đếm các giao điểm đã đặt. Tôi tránh thiết lập giao lộ vì tôi đã bị đốt cháy một thời gian trước bởi Matlab (vâng, đây là R, nhưng chịu với tôi), mà trước tiên sẽ sắp xếp các yếu tố của một bộ trước khi nó thực hiện giao lộ. (Tôi mơ hồ nhớ lại sự phức tạp thậm chí còn lúng túng hơn:. Như O(n^2)
thay vì O(n log n)
)
Tôi bối rối vì sao 'table' vẻ chậm cho bạn. Nó luôn luôn nhanh chóng khi tôi sử dụng nó. (Phải thừa nhận rằng nó mất 5 phút trong nhiệm vụ của bạn.) –
@DWin: Xin lỗi tôi đã không trả lời trước đó, tôi đã * chờ * trên 'bảng'. :) Xem kết quả của tôi dưới đây. Các kết quả cho 'bảng' chỉ là vô cùng. Nó đã bị đánh bại bởi phương pháp vectơ logic, mà chính nó là một phương pháp rất ngây thơ và lãng phí - quá nhiều truy cập bộ nhớ, tính toán điểm trôi nổi và chuyển đổi kiểu, không song song, ... kinh dị. Tuy nhiên, nó vẫn còn nhanh hơn 'bảng'. – Iterator
Có. Tôi cũng rất ngạc nhiên. Phiên bản vector hợp lý của tôi là tổng (x> y), tổng (x