Lọc một tập dữ liệu để có được phân phối đồng đều hơn cho đào tạo mạng lưới thần kinh


8

Tôi đang xem xét sử dụng các mạng thần kinh nhân tạo (ANN) để dự đoán tốc độ phản ứng trong chất lỏng của tôi thay vì giải quyết toàn bộ hệ thống ODE cứng. Một số người từ phòng thí nghiệm của tôi đã thực hiện một số công việc về điều đó vì vậy tôi không bắt đầu lại từ đầu nhưng tôi gặp vấn đề với các ứng dụng của mình. Một trong số đó tôi nghĩ liên quan đến chất lượng dữ liệu của tôi để đào tạo. Chúng tôi thường trích xuất dữ liệu đào tạo từ các mô phỏng CFD là 1D / 2D / 3D. Không có vấn đề gì, chúng tôi kết thúc với một loạt dữ liệu đa chiều để cung cấp cho mạng thần kinh. Để cho bạn biết về quy mô của vấn đề, tôi đang xem xét đào tạo 8 lưới với 10 đầu vào và 1 đầu ra cho mỗi vấn đề. Tôi cảm thấy một tập huấn khoảng 100.000 điểm sẽ hợp lý nhưng vấn đề là 100.000 điểm này cần bao phủ một vùng cụ thể trong không gian đa chiều của tôi.

  • Đối với mỗi ảnh chụp nhanh, chỉ một phần nhỏ các điểm nằm trong khu vực tôi cần lấy mẫu cao để đảm bảo việc đào tạo của tôi là chính xác
  • Khi tôi biên dịch các ảnh chụp nhanh cùng nhau, tôi kết thúc với nhiều điểm gần trùng lặp (tôi tin) có tác động tiêu cực đến việc đào tạo ANN của tôi bằng cách a) thiên vị việc đào tạo bằng cách tăng thêm trọng lượng cho các khu vực này b) thêm các điểm không cần thiết.

Vì vậy, tôi đã cố gắng lọc các điểm tôi ghi lại trước khi đưa chúng vào tập huấn luyện của mình. Như tôi thấy, điều đó liên quan đến việc kiểm tra xem một điểm mới có nằm trong bán kính n chiều nhất định của mỗi điểm trong bộ dữ liệu của tôi hay không. Cách tiếp cận vũ phu này, với một vài thủ thuật có tỷ lệ như n ^ 2, hoạt động rất tốt để trích xuất 10.000 điểm trong số 100.000 (mất 30 phút nói) nhưng bị phá vỡ khi tôi tăng kích thước và số lượng ảnh chụp nhanh ... Rõ ràng , phải có một cách thông minh hơn để làm điều này, nhưng tôi không chắc chắn nên bắt đầu tìm hướng nào. Lần đầu tiên tôi thử với python và có thể chuyển sang FORTRAN để tăng tốc mọi thứ nhưng tôi cảm thấy nên tìm kiếm một chiến lược tốt hơn trước. Là hy vọng duy nhất của tôi một số loại cây kd? Tôi có ít hoặc không có kinh nghiệm với họ và vấn đề mà tôi thấy là cây của tôi sẽ phát triển khi tôi xây dựng tập dữ liệu của mình và điều này chỉ có thể làm tăng sự phức tạp. Một thư viện cây python kd phù hợp với nhu cầu của tôi? Tôi có nên chuyển sang FORTRAN với quy mô của vấn đề của mình không? Mọi lời khuyên đều được đánh giá cao, cảm ơn bạn!

Câu trả lời:


5

Trong các mô phỏng động lực phân tử, chúng ta có cùng một vấn đề: với bán kính , tìm tất cả các hạt trong tối của nhau. Cách tiếp cận đơn giản nhất là phân chia không gian thành các ô có độ dài cạnh ít nhất là và so sánh mọi hạt trong mọi ô với tất cả các hạt trong 26 ô lân cận (theo ba chiều, đối với kích thước , đây là ). Bằng cách xây dựng, các hạt trong các ô khác sẽ ở xa hơn .rcrcO(n)rcd3d1rc

Trong trường hợp bạn chỉ kiểm tra một vị trí cho một tập hợp điểm cố định, hãy chia không gian thành các ô có độ dài cạnh , sắp xếp các điểm vào các ô (có thể được thực hiện trong ), và sau đó cho mỗi điểm thử nghiệm, tìm ô chứa điểm đó (có thể được thực hiện trong ) và kiểm tra khoảng cách đến các điểm trong ô đó và các ô xung quanh (có thể được thực hiện trong , phụ thuộc vào mật độ điểm và , nhưng không phụ thuộc vào tổng số điểm).rcO(n)O(1)O(1)rc

Toàn bộ thủ tục được mô tả ở đây . Nếu bạn muốn biết thêm chi tiết, hãy thử googling cho "danh sách liên kết ô" hoặc "danh sách ô".

Cây kd cũng là một cách tiếp cận tốt, nhưng có thể khó thực hiện hơn theo cách riêng của bạn (dường như có một triển khai Python ở đây , nhưng nó không cho phép thêm điểm). Tuy nhiên, đừng lo lắng về độ phức tạp của cây, vì, đối với phân phối điểm đồng nhất ít nhiều, độ sâu tìm kiếm sẽ hoạt động như cho điểm. Nghĩa là, nhân đôi số điểm sẽ khiến nỗ lực tìm kiếm tăng lên theo một yếu tố không đổi. Bạn cũng chỉ phải xây dựng cây một lần và có thể cập nhật nó nhanh chóng khi thêm điểm mới.O(log2n)n


Cảm ơn tôi sẽ xem xét điều này, mặc dù tôi sợ tính chiều cao của tôi có thể là một trở ngại. Xem xét d = 10 và khoảng 100 điểm mỗi "bên" (và tôi không chắc đây không phải là số quá thấp), đó có phải là lưới có 10 ^ 20 ô không? Ngay cả với 10 điểm cho mỗi "bên" vẫn còn 10 ^ 10 ô và tôi có 59000 hàng xóm cho mỗi ô :) Nhưng tôi sẽ xem xét các liên kết của bạn. Cảm ơn bạn !
FrenchKainedar

Trên thực tế, số lượng ô phụ thuộc vào mật độ điểm của bạn so với khoảng cách cắt. Bạn không bao giờ nên kết thúc với nhiều ô hơn điểm! Số lượng hàng xóm là một vấn đề trong kích thước cao, nhưng sau đó tôi sẽ chuyển sang cây kd.
Pedro

Tôi có nghĩa là 59000 tế bào lân cận xin lỗi. Tôi đã tìm thấy một thuật toán tìm kiếm hàng xóm gần nhất của kdtree cs.umd.edu/~mount/ANN Tôi sẽ cung cấp cho nó một shot.
FrenchKainedar

3

Vấn đề bạn đã nêu là một vấn đề kinh điển trong Hình học tính toán: Truy vấn phạm vi. Đó là:

Đầu vào: một tập hợp con S của không gian euclid n chiều và một tập hợp các điểm trong không gian đó P.
Kết quả: tập hợp con của P cắt S.

Cuốn sách Thuật toán trong một Nutshell mô tả cách giải quyết vấn đề tương tự ở trang 292. Nó mô tả thuật toán cho vùng hình chữ nhật S (không phải hình cầu n chiều như trong trường hợp của bạn). Bạn có thể nhận được một giải pháp là , trong đó n là số điểm, d là thứ nguyên của không gian và r là số điểm được báo cáo bởi truy vấn. Nếu d là rất lớn, hiệu suất tiệm cận thực tế là , do đó, cái thường được gọi là "lời nguyền của chiều". Đó là, nếu kích thước cao, thì hiệu suất bị ảnh hưởng rất nhiều! Tuy nhiên, vẫn nhanh hơn so với , không nhiều như chúng ta mong muốn.O(n11/d+r)O(n)O(n11d+r)O(n)

Thuật toán bao gồm một chiến lược phân chia và chinh phục (đệ quy) và cấu trúc dữ liệu đặc biệt (kd-tree). Dưới đây là một phác thảo của thuật toán:

Begin MainProgram

    results = a new SET   (a kd-tree)
    search(space,root,results)
    return results
endMainProgram

Subroutine search(space,node,results)
    if (space contains node.region) then
        add node.point to the results
        for each descendant of node
            add d.point to results
        return
    if (space contains node.point) then 
        add node.point to results
    if (space extends below node.coordinate) then
        search(space,node.below,results)
    if (space extends above node.coordinate) then
        search(space,node.above,results)
endsubroutine

-Source: Thuật toán trong một Nutshell, pg 298

Chìa khóa của trường hợp hình chữ nhật là chúng ta có thể dễ dàng xác định cấu trúc dữ liệu sao cho chúng ta có thể bao gồm toàn bộ một tập hợp con cùng một lúc ... do đó là cây KD. Cây KD chỉ đơn giản là phân chia không gian n chiều của bạn bằng cách cắt nó liên tiếp bằng siêu phẳng, giống như cách một không gian 3D có thể được phân chia bởi các mặt phẳng.

Đối với vấn đề cụ thể của bạn liên quan đến truy vấn phạm vi theo hướng xuyên tâm (không phải hộp hình chữ nhật), bạn có thể tìm thấy phân tách không gian đệ quy dựa trên hình cầu n tương tự ... Có một cấu trúc dữ liệu tương tự được gọi là vp-tree được thiết kế để thực hiện phân vùng không gian trong tọa độ siêu hình cầu. Bạn có thể muốn xem

"> Ấn phẩm này để biết thêm chi tiết về lý thuyết về cây vp.

Tất nhiên, mã hóa có thể là một rắc rối nếu mục tiêu của bạn thực sự là sử dụng thuật toán như một công cụ để tiến hành khoa học. Trong trường hợp đó, tôi khuyên bạn nên xem xét các thư viện đã triển khai các cấu trúc dữ liệu này mà bạn có thể sử dụng. Một thư viện hình học tính toán sẽ rất hữu ích trong tình huống này. Các CGAL thư viện có chương trình con cho các tìm kiếm phạm vi d-chiều mà có thể quan tâm đến bạn. Dưới đây là một danh sách các thư viện với các chương trình con truy vấn phạm vi.

Ngoài ra, nếu bạn ổn với việc đạt được hầu hết các điểm trong phạm vi hình cầu mà bạn đang tìm kiếm (nhưng không chính xác tất cả), bạn có thể muốn xem xét sử dụng thuật toán xấp xỉ như trong bài viết này .



@gansub: đã sửa!
Paul
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.