Lặp lại tính toán lân cận gần nhất cho hàng triệu điểm dữ liệu quá chậm


14

Tôi có một bộ dữ liệu chạy vào hàng triệu điểm dữ liệu trong 3D. Để tính toán tôi đang thực hiện, tôi cần tính toán hàng xóm (tìm kiếm phạm vi) cho từng điểm dữ liệu trong bán kính, cố gắng khớp một hàm, tính toán sai số cho phù hợp, lặp lại điều này cho điểm dữ liệu tiếp theo, v.v. Mã của tôi hoạt động đúng nhưng phải mất rất nhiều thời gian để chạy, khoảng 1 giây cho mỗi datapoint! Có lẽ bởi vì đối với mỗi điểm, nó phải tìm kiếm trong toàn bộ dữ liệu. Có cách nào tôi có thể làm cho quá trình nhanh chóng. Tôi có một ý tưởng rằng nếu tôi bằng cách nào đó có thể thiết lập một số mối quan hệ kề cận giữa những người hàng xóm đầu tiên, thì điều này có thể chậm hơn. Nếu nó giúp, tôi đang cố gắng tìm chiều rộng cửa sổ Parzen tối ưu trong 3D.

Câu trả lời:


9

Tôi muốn đề xuất googling cho phân cấp khối lượng giới hạn (đặc biệt là cây BSP). Với đám mây điểm của bạn, bạn có thể tìm thấy một mặt phẳng chia nó thành hai phần con bằng nhau. Sau đó, khi bạn cần tìm tập hợp các điểm nằm trong bán kính R của điểm kiểm tra, trước tiên bạn có thể so sánh điểm kiểm tra của mình với mặt phẳng đó và nếu chiều cao của nó cao hơn R, thì toàn bộ subcloud bên dưới mặt phẳng cũng phải ở xa hơn R (vì vậy bạn không cần kiểm tra bất kỳ điểm nào trong số đó). Bạn cũng có thể áp dụng ý tưởng này một cách đệ quy, cuối cùng mang lại độ phức tạp loại n log n thay vì n bình phương. (Đây là phân vùng không gian nhị phân / nhị phân,


7

Có một số cấu trúc dữ liệu để lưu trữ dữ liệu lưu giữ thông tin về vị trí và độ gần; ở đó bằng cách cho phép xác định (các) hàng xóm gần nhất nhanh chóng.

Đặc biệt R-cây (và các hình thức chuyên như R * -trees ) và X-cây . Rất nhiều sự lựa chọn được tối ưu hóa cho các mục đích sử dụng hơi khác nhau.

Chọn một R * -tree chứ không phải là một người hàng xóm gần nhất ngây thơ tìm kiếm là một phần lớn trong việc tôi nhận được 10000 nhân tố tăng tốc từ một mã cụ thể. (OK, có lẽ vài trăm trong số đó là R * -tree, hầu hết phần còn lại là do vẻ ngoài ngây thơ đã bị mã hóa xấu để nó phá vỡ bộ đệm. :: thở dài : :)

Ôi(Nđăng nhậpN)NÔi(đăng nhậpN)


5

Điều này rất giống với một trong những thách thức lớn nhất trong lĩnh vực động lực phân tử Điện toán hóa tất cả các tương tác theo cặp giữa các hạt không phân mảnh.

Ở đó, chúng tôi sử dụng danh sách ô (hoặc danh sách hàng xóm ) để giúp chúng tôi tìm ra những gì gần đó; Đối với ứng dụng này, danh sách ô có lẽ là thuật toán dễ sử dụng hơn:

  • Chia hộp thành một chuỗi các ô.
  • Đối với mỗi hạt, xác định ô nào sẽ được chỉ định (O (1) cho mỗi hạt).
  • Sau đó, đối với mỗi hạt, kiểm tra ô "riêng" cộng với các ô lân cận; nếu bất kỳ trong số này bị chiếm đóng, thì không cần tìm kiếm thêm.
  • Nếu tất cả các hàng xóm gần nhất đều trống, sau đó mở rộng sang các lân cận gần nhất, và cứ thế, cho đến khi tìm thấy một hạt.

Nếu hệ thống của bạn có sự phân bố các hạt đồng đều hơn hoặc ít hơn, điều này sẽ giúp giảm đáng kể chi phí cho thuật toán của bạn, theo độ thô của lưới. Tuy nhiên, một số tinh chỉnh là cần thiết: lưới quá thô và bạn sẽ không tiết kiệm nhiều thời gian; quá ổn và bạn sẽ dành nhiều thời gian đạp xe trên các ô lưới trống!


Bạn nên chỉ ra rằng độ dài cạnh của ô tối thiểu phải là bán kính tìm kiếm hoặc nếu mỗi hạt có bán kính tìm kiếm riêng thì bán kính tối đa.
Pedro

Điều đó đúng trong trường hợp MD; ở đây, chúng ta không biết những gì bán kính đó là một tiên nghiệm .
aeismail

Một sơ đồ tương tự đã được sử dụng trong các mô phỏng trọng lực đám mây hạt quy mô lớn trong một thời gian dài. Tôi không biết nếu nó vẫn là một phần của tình trạng nghệ thuật.
dmckee --- ex-moderator mèo con

4

Bạn chắc chắn nên kiểm tra các câyoctrees KD là các phương pháp được lựa chọn cho các tập hợp điểm (trong khi các BSP dành cho các đối tượng chung và các lưới cho mật độ đồng đều nhiều hay ít). Chúng có thể rất nhỏ gọn và nhanh chóng, giảm thiểu chi phí trong cả bộ nhớ và tính toán, và rất đơn giản để thực hiện.

Khi các điểm của bạn được phân phối đồng đều hoặc ít hơn (ngay cả với các khu vực trống, nhưng không được có điểm kỳ dị mật độ hoặc nồng độ cao khác), hãy kiểm tra các gói hình cầu nếu bạn muốn thử phân chia không gian không phân cấp giống như lưới.


3

Bạn có lẽ nên xem xét việc xây dựng tam giác Delaunay (tốt, tương tự 3D của nó). Trong 2D, đó là một tam giác đặc biệt của các điểm dữ liệu luôn chứa hàng xóm gần nhất. Điều tương tự giữ trong 3D, nhưng với tứ diện.

nđăng nhập(n)

Hy vọng nó giúp!

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.