Thuật toán để tìm khối lượng tổng hợp của cấu trúc thanh Granola Bar-Cấu trúc giống nhau?


19

Tôi là một nhà nghiên cứu khoa học hành tinh và một dự án tôi đang thực hiện là mô phỏng N -body về các vành đai của Sao Thổ. Mục tiêu của nghiên cứu đặc biệt này là xem các hạt kết tụ với nhau dưới trọng lực bản thân và đo khối lượng tổng hợp của các khối so với vận tốc trung bình của tất cả các hạt trong tế bào. Chúng tôi đang cố gắng tìm hiểu xem điều này có thể giải thích một số quan sát được thực hiện bởi tàu vũ trụ Cassini trong ngày hạ chí của Sao Thổ khi các cấu trúc lớn được nhìn thấy đổ bóng trên các vòng gần như cạnh. Dưới đây là một ảnh chụp màn hình của bất kỳ dấu thời gian nhất định trông như thế nào. (Mỗi hạt có đường kính 2 m và tế bào mô phỏng có chiều ngang khoảng 700 m.)

_N_ - tế bào cơ thể mô phỏng các vành đai của Sao Thổ với các hạt được hiển thị dưới dạng các quả cầu bóng mờ nhỏ trên nền đen.

Mã tôi đang sử dụng đã tạo ra vận tốc trung bình ở mọi dấu thời gian. Những gì tôi cần làm là tìm ra một cách để xác định khối lượng của các hạt trong các khối và KHÔNG phải là các hạt đi lạc giữa chúng. Tôi biết vị trí, khối lượng, kích thước, v.v. của mọi hạt, nhưng tôi không dễ dàng biết rằng, các hạt 30.000-40.000 cùng với 102.000-105.000 tạo thành một sợi mà mắt người nhìn thấy rõ.

Vì vậy, thuật toán tôi cần viết sẽ cần phải là một mã có càng ít tham số do người dùng nhập vào càng tốt (về khả năng nhân rộng và tính khách quan) sẽ đi qua tất cả các vị trí hạt, tìm ra hạt nào thuộc cụm, và sau đó tính toán khối lượng. Sẽ thật tuyệt nếu nó có thể làm điều đó cho "từng" cụm / chuỗi trái ngược với mọi thứ trên tế bào, nhưng tôi không nghĩ rằng tôi thực sự cần nó để tách chúng ra.

Điều duy nhất tôi nghĩ đến là thực hiện một phép tính khoảng cách N 2 trong đó tôi tính khoảng cách giữa mỗi hạt và nếu, 100 hạt gần nhất nằm trong một khoảng cách nhất định, thì hạt đó sẽ được coi là một phần của cụm. Nhưng điều đó có vẻ khá cẩu thả và tôi đã hy vọng rằng các bạn và các lập trình viên CS có thể biết về một giải pháp thanh lịch hơn?


Được chỉnh sửa với Giải pháp của tôi: Những gì tôi đã làm là thực hiện một cách tiếp cận cụm / lân cận gần nhất và thực hiện N 2 nhanh chóng trước tiên. Vì vậy, lấy mọi hạt, tính khoảng cách cho tất cả các hạt khác và ngưỡng cho một cụm hay không là liệu có hạt N trong khoảng cách d hay không (hai tham số phải được đặt trước , nhưng như đã nói với một số Phản hồi / bình luận, tôi sẽ không thoát khỏi việc không có một vài trong số đó).

Sau đó, tôi đã tăng tốc nó bằng cách không sắp xếp khoảng cách mà chỉ đơn giản là thực hiện tìm kiếm N và tăng số lượt truy cập cho các hạt trong d , và điều đó tăng tốc theo hệ số 6. Sau đó, tôi đã thêm một "cây lập trình viên ngu ngốc" (vì tôi biết bên cạnh không có gì về mã cây). Tôi chia ô mô phỏng thành một số lưới đã đặt (kết quả tốt nhất khi kích thước lưới ≈7 d ) trong đó lưới chính nối với ô, một lưới được bù một nửa bằng xy , và hai lưới còn lại được bù bởi 1/4 in ± x và ± y . Đoạn mã sau đó phân chia các hạt thành các lưới, sau đó mỗi hạt N chỉ phải có khoảng cách tính cho các hạt khác trong ô đó.

Về mặt lý thuyết, nếu đây là một cây thật, tôi sẽ nhận được thứ tự N * log ( N ) trái ngược với tốc độ N 2 . Tôi đã nhận được một nơi nào đó giữa hai người, trong đó với một tập hợp con 50.000 hạt, tôi đã tăng tốc độ 17 lần và đối với một tế bào 150.000 hạt, tôi đã tăng tốc độ 38 lần. 12 giây cho lần đầu tiên, 53 giây cho lần thứ hai, 460 giây cho một tế bào 500.000 hạt. Đó là những tốc độ tương đương với thời gian mã mất bao lâu để chạy mô phỏng 1 dấu thời gian về phía trước, vì vậy điều đó hợp lý tại thời điểm này. Ồ - và nó hoàn toàn được xâu chuỗi, vì vậy nó sẽ cần nhiều bộ xử lý nhất mà tôi có thể sử dụng.


3
Tôi không đặc biệt am hiểu về chủ đề này, vì vậy tôi có thể cung cấp rất ít về cách hỗ trợ bản thân, nhưng bạn đã đọc bài viết Wikipedia về phân tích Cụm chưa? Nó dường như là một lĩnh vực nghiên cứu rất tích cực.
Cole Campbell

Tôi cảnh giác về một mã cụm, ít nhất là một cái gì đó giống như DBSCAN, bởi vì tôi nghĩ rằng nó sẽ "theo" một số chuỗi mỏng mà tôi biết trực quan không phải là một phần của cụm nhưng về mặt thuật toán có thể. Tôi có kinh nghiệm với các loại mã DBSCAN vì tôi sử dụng mã đó cho công việc khác của mình, nghiên cứu các miệng hố.
Stuart Robbins

1
Bất kỳ mã nào xác định các chuỗi như thế này gần như chắc chắn sẽ đi kèm với một số loại cài đặt "độ nhạy".
Robert Harvey

2
Đã đồng ý. Khó khăn thực sự ở đây là "cục" không phải là một thuật ngữ được xác định rõ. Vào cuối ngày, bạn sẽ phải sử dụng một số loại thuật toán phân tích cụm (mà thực sự, giải pháp đề xuất của bạn đã có), có lẽ kết hợp với một số loại giảm nhiễu.
Cole Campbell

2
nó có thể hữu ích nếu bạn vẽ lên bức tranh của bạn những gì bạn nghĩ rằng một cụm hợp lệ là (và có thể là không hợp lệ)
jk.

Câu trả lời:


3

Đề nghị đầu tiên của tôi là cắt vấn đề của bạn thành hai vấn đề: đầu tiên, tìm ra những gì bạn muốn và sau đó tìm ra cách để có được hiệu quả những gì bạn muốn. Bạn thực sự không thể có được một cái gì đó bạn chưa xác định. Tôi sẽ đưa ra một số ý tưởng trong câu trả lời này có thể giúp bạn tìm ra định nghĩa này. Tôi khuyên bạn nên thực hiện không hiệu quả các ý tưởng bạn thích trước tiên, áp dụng nó cho một vài bộ dữ liệu không quá lớn, đánh giá kết quả bằng tay, điều chỉnh định nghĩa của bạn và lặp lại (có thể hỏi một câu hỏi khác ở đây), cho đến khi bạn hài lòng với định nghĩa của bạn. Sau đó, tôi khuyên bạn nên hỏi một câu hỏi khác về cách tính hiệu quả kết quả định nghĩa của bạn (nếu bạn vẫn cần trợ giúp).

Vì vậy, hãy xem những gì sẽ tương ứng với ý tưởng trực quan của chúng tôi về một "sợi". Các chuỗi của bạn dường như bao gồm các điểm phân bố gần như đồng đều, mặc dù vậy bạn nên kiểm tra điều này bằng cách tạo một hình ảnh phóng to (của tập dữ liệu gốc) - độ phân giải của hình ảnh của bạn quá thấp để nói chắc chắn rằng các điểm thực sự được phân phối đồng đều . Tôi sẽ cho rằng họ là cho câu trả lời này.

Một ý tưởng ban đầu có thể là nhìn vào người hàng xóm gần nhất của mọi điểm. Hãy chọn một điểm X, gọi hàng xóm Y gần nhất của nó và đặt D là khoảng cách giữa X và Y. Sau đó, chúng ta nhìn vào vòng tròn C quanh X với bán kính D * A, trong đó A là tham số điều chỉnh, giả sử A = 3. Nếu X là một phần của chuỗi, chúng tôi hy vọng rằng với mọi điểm Z trong C, khoảng cách từ Z đến hàng xóm gần nhất của nó bằng với D. Nếu nó ngắn hơn đáng kể, hãy nói nhiều hơn A (hoặc có thể một số tham số khác B) thì X rõ ràng là gần các điểm gần nhau hơn so với X, vì vậy X có thể không phải là một phần của chuỗi.

Tiêu chí này không đầy đủ tuy nhiên. Nó chỉ đưa ra một tiêu chí để phát hiện một "biên giới" giữa các khu vực dày đặc với các điểm và các khu vực ít đậm đặc hơn với các điểm. Chúng ta vẫn phải gom các điểm lại với nhau thành các chuỗi.

Có một tính năng trong bức ảnh của bạn cho thấy điều này không đơn giản. Ở góc dưới bên phải bức ảnh của bạn, có một khu vực tương đối rộng với rất nhiều điểm đi lạc. Các điểm đi lạc này tự phân bố gần như đồng đều, vì vậy nếu chúng ta loại bỏ tất cả các điểm trong chuỗi xung quanh nó (và tất cả các điểm khác), thì chúng ta sẽ mong đợi bất kỳ thuật toán phát hiện chuỗi nào đánh dấu tập hợp các điểm đi lạc này là một chuỗi! Do đó, chúng ta cần phải cẩn thận khi thực hiện các cụm của chúng tôi.

Một ý tưởng có thể là để làm như sau. Chúng ta sẽ tạo một biểu đồ trên các điểm này, trong đó các đỉnh là các điểm và các cạnh biểu thị rằng hai điểm có mật độ tương tự nhau. Đối với mỗi điểm, chúng tôi kiểm tra tiêu chí trên. Nếu nó kiểm tra, chúng tôi kết nối X với một cạnh với tất cả các điểm trong C. Nếu nó không kiểm tra, chúng tôi không thêm bất kỳ cạnh nào và đánh dấu X là 'đi lạc'. Sau khi làm điều này cho mọi điểm, chúng tôi xem xét tập hợp các thành phần được kết nối. Chúng phải bao gồm một thành phần duy nhất (trong trường hợp ảnh của bạn, nhưng các bộ dữ liệu khác có thể có nhiều thành phần được kết nối bao gồm tất cả các điểm trong chuỗi, cộng thêm (có khả năng rất nhiều) các thành phần bao gồm các điểm đi lạc đơn và các "chuỗi đi lạc" này. Tuy nhiên, các chuỗi đi lạc này có các điểm trong đó đã được đánh dấu là 'đi lạc', vì vậy bạn có thể chỉ cần bỏ qua bất kỳ thành phần nào có chứa một điểm đã được đánh dấu là 'đi lạc'.

Một mối nguy hiểm của ý tưởng này là bạn có thể có một tính năng trong đó mật độ của một dải giảm dần khi bạn di chuyển dọc theo sợi, cho đến khi mật độ thấp đến mức nó chỉ là một tập hợp các điểm đi lạc. Vì tiêu chí của chúng tôi là "cục bộ", nó có thể không phát hiện ra điều này và đánh dấu các điểm đi lạc này là một phần của chuỗi. Tôi không chắc đây có phải là vấn đề hay không: Tôi đoán hầu hết các điểm đi lạc sẽ bị bắt bởi tiêu chí này, vì những thay đổi về mật độ dường như khá đột ngột trong bức ảnh của bạn.

Nếu sự cố này xảy ra, bạn có thể thử một giải pháp thay thế cho việc chỉ lấy các thành phần được kết nối. Với mỗi điểm X, chúng tôi tính khoảng cách đến hàng xóm D (X) gần nhất của nó. Chúng tôi bắt đầu tại điểm với D (X) tối thiểu và thực hiện BFS (hoặc DFS , thứ tự không thành vấn đề). Chúng tôi thêm bất kỳ điểm Y nào có D (Y) không lớn hơn D (X) (theo hệ số có thể điều chỉnh) mà chúng tôi đã bắt đầu. Nếu chúng ta gặp một điểm Y có D (Y) quá lớn, chúng ta sẽ loại bỏ cạnh (X, Y), đánh dấu Y là 'đi lạc' và hành động như thể chúng ta chưa bao giờ truy cập Y trong BFS của chúng ta. Nếu điều chỉnh đúng, điều này sẽ ngăn chặn vấn đề tôi mô tả ở trên.

Một ý tưởng khác để khắc phục vấn đề này hoạt động cục bộ hơn một chút: bạn có thể thực hiện BFS và theo dõi mức D (X) thấp nhất (tôi sử dụng D (X) làm thước đo mật độ xung quanh một điểm) gặp phải nhiều nhất là 10 Các bước BFS trước đây và nếu chúng ta gặp một Y có D (Y) lớn hơn nhiều so với D (X) này, chúng ta sẽ làm tương tự như giải pháp (tiềm năng) khác mà tôi đã cung cấp.

Như một từ chối trách nhiệm: tất cả các ý tưởng ở trên tôi mới nghĩ ra ngay bây giờ, tôi thực sự không biết liệu vấn đề đặc biệt này đã được nghiên cứu trước đây chưa, vì vậy tôi có thể đang nảy sinh những điều vô nghĩa. Chỉ cần thử các ý tưởng (cho dù ý tưởng của tôi hoặc của riêng bạn) nghe có vẻ hợp lý với bạn và tìm hiểu xem chúng có thực sự hiệu quả không, và sau đó chỉ tập trung vào thực hiện chúng một cách hiệu quả.


2

Sử dụng phân rã mô-đun, bạn có thể tạo một cây sẽ chứa tất cả các hạt như các lá và các nút trên sẽ phân cụm chúng. Dựa trên cây đó, bạn có thể xác định các biện pháp được áp dụng cho mọi nút của nó từ gốc đến lá trở xuống. Bạn dừng điều này đi xuống khi các phép đo đạt đến ngưỡng do người dùng xác định. Một phép đo như vậy có thể là mật độ vỏ lồi của tất cả các hạt trong một cụm.


1

Tôi nghĩ rằng bạn đang theo một thuật toán phân cụm học máy.

Trang này từ bộ công cụ Python SciKit Learn có các hình ảnh gợi ý thuật toán DBSCAN (Wikipedia) có thể là những gì bạn đang tìm kiếm. Có vẻ lý tưởng vì tham số đầu vào của nó là kích thước lân cận, trong khi hầu hết các thuật toán phân cụm khác muốn số lượng cụm mà bạn không biết trước.

"Thuật toán dựa trên mật độ để khám phá các cụm trong cơ sở dữ liệu không gian lớn có nhiễu" Ester, M., HP Kriegel, J. Sander và X. Xu, trong Kỷ yếu của Hội nghị quốc tế lần thứ 2 về Khám phá tri thức và khai thác dữ liệu, Portland, OR , Báo chí AAAI, trang 226 Từ231. 1996


0

Tôi đã suy nghĩ về vấn đề này. Tôi không phải là một chuyên gia vật lý, vì vậy hãy chịu đựng tôi.

Dường như đó không phải là khoảng cách giữa các hạt được tính để xác định các cụm. Đó là liệu các trường trọng lực có chồng lên nhau hay không.

Lấy một hạt P và xác định những hạt nào khác có các trường trọng lực chồng chéo.

Sau đó lấy một trong những thứ đó và làm điều tương tự. Mục tiêu của bạn không phải là tìm tất cả các hạt trong cụm mà là tìm ranh giới của nó.

Lặp lại điều này cho đến khi tất cả các cụm được tìm thấy.

Bây giờ quay trở lại và xác định khối lượng của các cụm. Bạn sẽ loại bỏ các hạt đi lạc, và bạn có thể sử dụng các ranh giới cục để tìm khối lượng.

Tôi không chắc điều này có giúp ích gì không, nhưng đó là tất cả những gì tôi có thể nghĩ ra.


A là gì trường hấp dẫn ?
David Cowden

0

Ở cuối mỗi dấu thời gian, bạn có thể chuyển đổi dữ liệu thành biểu đồ, tính toán cây bao trùm tối thiểu và sau đó bắt đầu loại bỏ các cạnh vượt quá một ngưỡng nhất định. Điều đó sẽ cung cấp cho bạn các cụm và một cách dễ dàng để liệt kê thông qua các hạt trong mỗi cụm.

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.