อัลกอริทึมในการค้นหามวลรวมของ“ Granola Bar” - โครงสร้างที่เหมือนกันไหม?


19

ฉันเป็นนักวิจัยวิทยาศาสตร์ดาวเคราะห์และอีกหนึ่งโครงการที่ฉันกำลังทำอยู่คือการจำลองแบบN -body เกี่ยวกับวงแหวนของดาวเสาร์ เป้าหมายของการศึกษาครั้งนี้คือการจับก้อนกอเข้าด้วยกันภายใต้แรงโน้มถ่วงของตัวเองและวัดมวลรวมของกลุ่มกับความเร็วเฉลี่ยของอนุภาคทั้งหมดในเซลล์ เรากำลังพยายามหาว่าสิ่งนี้สามารถอธิบายการสังเกตการณ์บางอย่างที่ทำโดยยานแคสสินีในช่วงฤดูร้อนดาวเสาร์เมื่อสิ่งมีชีวิตขนาดใหญ่เห็นโครงสร้างเงาขนาดใหญ่บนวงแหวนที่เกือบจะเป็นขอบ ด้านล่างนี้เป็นภาพหน้าจอของเวลาที่กำหนดใด ๆ ที่ดูเหมือน (แต่ละอนุภาคมีเส้นผ่านศูนย์กลาง 2 เมตรและเซลล์จำลองเองนั้นมีความยาวประมาณ 700 เมตร)

เซลล์ร่างกาย _N_ ของการจำลองวงแหวนของดาวเสาร์ที่มีอนุภาคที่แสดงเป็นทรงกลมสีเทาเล็ก ๆ กับพื้นหลังสีดำ

รหัสที่ฉันใช้อยู่นั้นได้กระจายความเร็วเฉลี่ยในทุกการประทับเวลาแล้ว สิ่งที่ฉันต้องทำคือหาวิธีที่จะกำหนดมวลของอนุภาคในกอและไม่ใช่อนุภาคที่หลงทางระหว่างพวกมัน ฉันรู้ว่าทุกตำแหน่งของอนุภาคมวลขนาดและอื่น ๆ แต่ฉันไม่รู้ว่ามันง่ายขนาดนั้นอนุภาค 30,000-40,000 พร้อมกับ 102,000-105,000 ประกอบเป็นเส้นเดียวต่อสายตามนุษย์ชัดเจน

ดังนั้นอัลกอริทึมที่ฉันต้องเขียนจะต้องเป็นรหัสที่มีพารามิเตอร์ที่ผู้ใช้ป้อนน้อยที่สุดเท่าที่จะเป็นไปได้ (สำหรับการทำซ้ำและความเที่ยงธรรม) ที่จะผ่านตำแหน่งอนุภาคทั้งหมดแล้วคำนวณว่าอนุภาคใดเป็นกระจุก มวล. มันจะดีถ้ามันสามารถทำได้สำหรับ "แต่ละ" กลุ่ม / สาระเมื่อเทียบกับทุกสิ่งที่อยู่ในเซลล์ แต่ฉันไม่คิดว่าจริง ๆ แล้วฉันต้องการแยกมันออก

สิ่งเดียวที่ฉันคิดคือทำการคำนวณระยะทางN 2โดยที่ฉันคำนวณระยะห่างระหว่างทุกอนุภาคและถ้าบอกว่า 100 อนุภาคที่อยู่ใกล้ที่สุดนั้นอยู่ในระยะทางที่กำหนดจากนั้นอนุภาคนั้นจะถูกพิจารณาเป็นส่วนหนึ่งของ กลุ่ม แต่ดูเหมือนว่าจะเลอะเทอะมากและฉันหวังว่าคุณ CS คนและโปรแกรมเมอร์อาจจะรู้วิธีการแก้ปัญหาที่สง่างามมากขึ้น?


แก้ไขได้ด้วยโซลูชั่นของฉัน: อะไรที่ฉันไม่ได้ที่จะใช้การจัดเรียงของที่ใกล้ที่สุดเพื่อนบ้าน / วิธีการคลัสเตอร์และทำอย่างรวดเร็ว-N-สกปรกN 2ดำเนินการครั้งแรก ดังนั้นเอาทุกอนุภาคคำนวณระยะทางไปยังอนุภาคอื่นทั้งหมดและเกณฑ์สำหรับในกลุ่มหรือไม่ก็คือว่ามีอนุภาคNอยู่ภายในระยะทางdหรือไม่(พารามิเตอร์สองตัวที่ต้องตั้งค่านิรนัยโชคไม่ดี คำตอบ / ความคิดเห็นฉันจะไม่หนีไปโดยที่ไม่มีบางคน)

จากนั้นฉันเร่งความเร็วโดยไม่เรียงลำดับระยะทาง แต่เพียงแค่ทำการค้นหาคำสั่งNและเพิ่มเคาน์เตอร์สำหรับอนุภาคภายในdและเร่งความเร็วของสิ่งต่าง ๆ ด้วยปัจจัย 6 จากนั้นฉันเพิ่มต้นไม้ "โปรแกรมเมอร์ของโง่" (เพราะฉันรู้ ถัดจากโค้ดเกี่ยวกับต้นไม้) ฉันแบ่งเซลล์จำลองเป็นจำนวนกริดที่กำหนดไว้ (ผลลัพธ์ที่ดีที่สุดเมื่อขนาดกริด≈7 d ) โดยที่กริดหลักเข้าแถวกับเซลล์หนึ่งกริดถูกชดเชยครึ่งหนึ่งในxและyและอีกสองอันถูกชดเชยด้วย 1/4 ± xและ± Y รหัสจะแบ่งอนุภาคออกเป็นกริดจากนั้นแต่ละอนุภาคNจะต้องมีระยะทางคำนวณจากอนุภาคอื่น ๆ ในเซลล์นั้น

ตามทฤษฎีแล้วถ้านี่เป็นต้นไม้จริงฉันควรสั่งN * log ( N ) แทนความเร็วN 2 ฉันได้ที่ไหนสักแห่งระหว่างสองที่ซึ่งชุดย่อย 50,000 ชุดฉันมีความเร็วเพิ่มขึ้น 17x และสำหรับเซลล์ 150,000 อนุภาคฉันได้รับความเร็วเพิ่มขึ้น 38 เท่า 12 วินาทีสำหรับครั้งแรก 53 วินาทีสำหรับวินาที 460 วินาทีสำหรับเซลล์ 500,000 อนุภาค สิ่งเหล่านี้คือความเร็วเทียบเคียงกับระยะเวลาที่โค้ดใช้ในการรันการจำลอง 1 การจับเวลาล่วงหน้าไปข้างหน้า โอ้ - และมันเต็มไปด้วยเธรดดังนั้นมันจะใช้โปรเซสเซอร์มากเท่าที่ฉันสามารถโยนได้


3
ฉันไม่ได้มีความรู้ในเรื่องนี้เป็นพิเศษดังนั้นฉันจึงสามารถช่วยเหลือตัวเองได้เล็กน้อย แต่คุณได้อ่านบทความ Wikipedia เกี่ยวกับการวิเคราะห์กลุ่มหรือไม่ ดูเหมือนว่าจะเป็นสาขาวิชาที่มีความกระตือรือร้นอย่างมาก
Cole Campbell

ฉันระมัดระวังเกี่ยวกับรหัสคลัสเตอร์อย่างน้อยคล้าย DBSCAN เพราะฉันคิดว่ามันจะ "ติดตาม" บางเส้นบาง ๆ ที่ฉันรู้ว่าภาพไม่ได้เป็นส่วนหนึ่งของกลุ่ม แต่อัลกอริทึมอาจจะ ฉันมีประสบการณ์กับรหัสประเภท DBSCAN ตั้งแต่ฉันใช้สิ่งนั้นสำหรับงานอื่นของฉันเรียนหลุมอุกกาบาต
Stuart Robbins

1
รหัสใด ๆ ที่ระบุถึงเส้นแบบนี้จะมาพร้อมกับการตั้งค่า "ความไว" บางประเภท
Robert Harvey

2
ตกลง ความยากลำบากที่แท้จริงที่นี่คือ "กอ" ไม่ใช่คำที่กำหนดไว้อย่างดี ในตอนท้ายของวันที่คุณจะต้องไปกับบางชนิดขั้นตอนวิธีการวิเคราะห์กลุ่ม (ซึ่งจริงๆโซลูชั่นที่นำเสนอของคุณอยู่แล้ว) อาจจะรวมกับชนิดของเสียงลดลงผ่านบาง
Cole Campbell

2
มันอาจช่วยได้ถ้าคุณวาดภาพของคุณสิ่งที่คุณคิดว่าเป็นกลุ่มที่ถูกต้อง (และอาจเป็นหนึ่งที่ไม่ถูกต้อง)
jk

คำตอบ:


3

ข้อเสนอแนะแรกของฉันคือการตัดปัญหาของคุณออกเป็นสองปัญหา: ก่อนอื่นให้คิดว่าคุณต้องการอะไรแล้วหาวิธีได้อย่างมีประสิทธิภาพในสิ่งที่คุณต้องการ คุณยังไม่สามารถรับสิ่งที่คุณยังไม่ได้กำหนดอย่างมีประสิทธิภาพ ฉันจะใส่แนวคิดในคำตอบนี้ที่อาจช่วยคุณค้นหาคำจำกัดความนี้ ฉันขอแนะนำให้คุณใช้ความคิดที่ไม่มีประสิทธิภาพก่อนนำไปใช้กับชุดข้อมูลที่ไม่ใหญ่เกินไปประเมินผลลัพธ์ด้วยมือปรับคำจำกัดความและทำซ้ำ (อาจถามคำถามอื่นที่นี่) จนกว่าคุณจะพอใจ คำจำกัดความของคุณ หลังจากนั้นฉันขอแนะนำให้คุณถามคำถามอื่นเกี่ยวกับวิธีการคำนวณผลลัพธ์ของคำนิยามของคุณอย่างมีประสิทธิภาพ (หากคุณยังต้องการความช่วยเหลือ)

ดังนั้นเรามาดูสิ่งที่จะสอดคล้องกับความคิดที่ใช้งานง่ายของเราของ 'สาระ' ดูเหมือนว่าเส้นของคุณจะมีจุดกระจายอย่างสม่ำเสมอแม้ว่าคุณควรตรวจสอบสิ่งนี้ด้วยการซูมภาพ (ของชุดข้อมูลดั้งเดิม) - ความละเอียดของภาพของคุณต่ำเกินไปที่จะพูดด้วยความมั่นใจว่าจุดนั้นกระจายอย่างสม่ำเสมอ . ฉันจะถือว่าพวกเขามีไว้สำหรับคำตอบนี้

ความคิดเริ่มต้นอาจจะมองไปที่เพื่อนบ้านที่ใกล้ที่สุดของทุกจุด ลองเลือกจุด X, เรียกเพื่อนบ้าน Y ที่ใกล้ที่สุดและตั้งค่า D เป็นระยะห่างระหว่าง X และ Y จากนั้นเราดูวงกลม C รอบ X ด้วยรัศมี D * A โดยที่ A คือพารามิเตอร์การปรับเสียงพูด A = 3 หาก X เป็นส่วนหนึ่งของเกลียวเชือกเราคาดหวังว่าสำหรับทุกจุด Z ใน C ระยะทางจาก Z ถึงเพื่อนบ้านที่ใกล้ที่สุด W จะใกล้เคียงกับ D ถ้ามันสั้นลงอย่างมีนัยสำคัญให้พูดมากกว่า A (หรือบางทีพารามิเตอร์อื่น ๆ B) ดังนั้น X อยู่ใกล้กับจุดที่อยู่ใกล้กันมากกว่า X ดังนั้น X จึงอาจไม่ใช่ส่วนหนึ่งของเส้น

เกณฑ์นี้ยังไม่สมบูรณ์อย่างไรก็ตาม มันเป็นเพียงเกณฑ์ในการตรวจจับ 'เส้นขอบ' ระหว่างพื้นที่ที่มีจุดหนาแน่นกับจุดและพื้นที่ที่มีจุดหนาแน่นน้อยกว่า เรายังคงต้องจัดกลุ่มคะแนนเข้าด้วยกันเป็นเส้น

มีคุณสมบัติในภาพของคุณที่แสดงว่าไม่ง่าย ที่มุมล่างขวาของรูปภาพมีพื้นที่ค่อนข้างใหญ่ที่มีจุดเร่ร่อนมากมาย จุดจรจัดเหล่านี้มีการกระจายอย่างสม่ำเสมอสม่ำเสมอดังนั้นหากเราลบจุดทั้งหมดในเส้นรอบ ๆ (และจุดอื่น ๆ ทั้งหมด) จากนั้นเราคาดว่าอัลกอริทึมการตรวจจับเกลียวเพื่อทำเครื่องหมายจุดชุดจรจัดนี้เป็นเส้น! ดังนั้นเราจึงต้องระมัดระวังในการสร้างกลุ่มของเรา

ความคิดอาจจะทำดังต่อไปนี้ เราจะทำกราฟบนจุดเหล่านี้โดยจุดยอดคือจุดและขอบซึ่งมีความหมายว่าสองจุดมีความหนาแน่นใกล้เคียงกัน ทุกจุดเราตรวจสอบเกณฑ์ด้านบน ถ้ามันเช็คเอาท์เราเชื่อมต่อ X กับ edge กับทุกจุดใน C หากไม่ได้เช็คเอาท์เราจะไม่เพิ่ม edge ใด ๆ และทำเครื่องหมาย X ว่า 'stray' หลังจากทำเช่นนี้ทุกจุดเราจะพิจารณาชุดของส่วนประกอบที่เชื่อมต่อ. สิ่งเหล่านี้ควรประกอบด้วยหนึ่ง (ในกรณีของรูปภาพของคุณ แต่ชุดข้อมูลอื่น ๆ อาจมีหลายองค์ประกอบ) ที่เชื่อมต่อประกอบด้วยจุดทั้งหมดในเส้นบวก (อาจมีมาก) ส่วนประกอบเพิ่มเติมประกอบด้วยจุดจรจัดเดี่ยวและ 'stray strand' เหล่านี้ อย่างไรก็ตามเส้น stray เหล่านี้มีจุดที่ถูกทำเครื่องหมายเป็น 'stray' ดังนั้นคุณสามารถละเว้นส่วนประกอบใด ๆ ที่มีจุดที่ถูกทำเครื่องหมายเป็น 'stray'

อันตรายของความคิดนี้คือคุณอาจมีคุณสมบัติที่ความหนาแน่นของเส้นลวดจะลดลงอย่างช้าๆเมื่อคุณเคลื่อนที่ไปตามเกลียวจนกระทั่งความหนาแน่นต่ำจนเป็นจุดที่หลงทาง เนื่องจากเกณฑ์ของเราคือ 'ท้องถิ่น' อาจไม่สามารถตรวจจับสิ่งนี้และทำเครื่องหมายจุดจรจัดเหล่านี้เป็นส่วนหนึ่งของเส้น ฉันไม่แน่ใจว่านี่จะเป็นปัญหาหรือไม่: ฉันเดาว่าจุดที่น่าหลงไหลส่วนใหญ่ควรถูกเกณฑ์ตามเนื่องจากการเปลี่ยนแปลงของความหนาแน่นดูค่อนข้างฉับพลันในภาพของคุณ

หากปัญหานี้เกิดขึ้นคุณสามารถลองใช้วิธีอื่นเพื่อหาส่วนประกอบที่เชื่อมต่อ สำหรับทุกจุด X เราคำนวณระยะทางไปยังเพื่อนบ้านที่ใกล้ที่สุด D (X) เราเริ่มต้นด้วยจุดที่น้อยที่สุด D (X) และดำเนินการBFS (หรือDFSลำดับที่ไม่สำคัญ) เราเพิ่มจุดใด ๆ ที่ Y ซึ่ง D (Y) ไม่ใหญ่กว่า D (X) (ตามปัจจัยที่ปรับค่าได้) ที่เราเริ่มต้น หากเราพบจุด Y ที่มีขนาดใหญ่เกินไป D (Y) เราจะลบขอบ (X, Y) ทำเครื่องหมาย Y เป็น 'หลงทาง' และทำราวกับว่าเราไม่เคยไปเยี่ยม Y ใน BFS ของเรา หากปรับให้ถูกต้องสิ่งนี้ควรป้องกันปัญหาที่ฉันอธิบายข้างต้น

แนวคิดทางเลือกในการแก้ไขปัญหานี้ทำหน้าที่ในพื้นที่มากขึ้น: คุณสามารถทำ BFS และติดตาม D (X) ต่ำสุด (ฉันใช้ D (X) เป็นตัวชี้วัดความหนาแน่นรอบจุด) ที่พบมากที่สุด 10 BFS- ขั้นตอนก่อนหน้านี้และหากเราพบ Y ที่มี D (Y) ที่ใหญ่กว่า D (X) นี้มากเราก็ทำเช่นเดียวกันกับวิธีแก้ปัญหา (ศักยภาพ) อื่น ๆ ที่ฉันเสนอ

ในฐานะที่เป็นข้อจำกัดความรับผิดชอบ: ความคิดทั้งหมดข้างต้นที่ฉันคิดไว้ในตอนนี้ฉันไม่รู้จริง ๆ ว่าปัญหานี้ได้รับการศึกษามาก่อนหรือไม่ดังนั้นฉันอาจแตกหน่อไร้สาระ เพียงลองใช้ความคิด (ไม่ว่าจะเป็นความคิดของฉันหรือของคุณเอง) ที่ฟังดูสมเหตุสมผลสำหรับคุณและดูว่ามันใช้งานได้จริงหรือไม่แล้วมุ่งเน้นที่การนำไปใช้อย่างมีประสิทธิภาพ


2

การใช้การสลายตัวแบบแยกส่วนคุณสามารถสร้างต้นไม้ที่จะมีอนุภาคทั้งหมดเป็นใบไม้และโหนดบนจะจัดกลุ่มเหล่านี้ ขึ้นอยู่กับทรีนั้นคุณสามารถกำหนดมาตรการที่ใช้กับทุกโหนดของมันตั้งแต่รูทจนถึงลีฟด้านล่าง คุณหยุดการแวะผ่านลงล่างนี้เมื่อการวัดถึงขีด จำกัด ที่ผู้ใช้กำหนด การวัดหนึ่งอย่างนั้นอาจเป็นความหนาแน่นของเปลือกนูนของอนุภาคทั้งหมดในกระจุก


1

ฉันคิดว่าคุณอยู่หลังอัลกอริทึมการเรียนรู้เครื่องการจัดกลุ่ม

หน้านี้จากชุดเครื่องมือPython SciKit Learnมีรูปภาพที่แนะนำอัลกอริทึม DBSCAN (Wikipedia) อาจเป็นสิ่งที่คุณกำลังมองหา ดูเหมือนว่าเหมาะสมที่สุดเนื่องจากพารามิเตอร์อินพุตคือขนาดพื้นที่ใกล้เคียงขณะที่อัลกอริทึมการจัดกลุ่มส่วนใหญ่ต้องการจำนวนกลุ่มซึ่งคุณไม่ทราบล่วงหน้า

"อัลกอริทึมที่ยึดตามความหนาแน่นสำหรับการค้นหากลุ่มในฐานข้อมูลเชิงพื้นที่ขนาดใหญ่พร้อมเสียงรบกวน" Ester, M. , HP Kriegel, J. Sander และ X. Xu ในการประชุมวิชาการการค้นพบความรู้และการทำเหมืองข้อมูลในพอร์ตแลนด์หรือ , AAAI Press, pp. 226–231 1996


0

ฉันกำลังคิดเกี่ยวกับปัญหานี้ ฉันไม่ใช่ผู้เชี่ยวชาญด้านฟิสิกส์ดังนั้นจงอดทนกับฉัน

ดูเหมือนว่ามันไม่ใช่ระยะห่างระหว่างอนุภาคที่นับเพื่อกำหนดกระจุก มันเป็นสนามแรงโน้มถ่วงทับซ้อนกันหรือไม่

ใช้อนุภาค P และตรวจสอบว่าอนุภาคอื่นใดมีเขตแรงโน้มถ่วงซ้อนทับกัน

จากนั้นนำหนึ่งในนั้นและทำสิ่งเดียวกัน เป้าหมายของคุณคือไม่พบอนุภาคทั้งหมดในกอ แต่เพื่อค้นหาขอบเขตของมัน

ทำซ้ำจนกว่าจะพบกระจุกทั้งหมด

ทีนี้ย้อนกลับไปหามวลของกระจุก คุณจะกำจัดอนุภาคที่หลงทางและคุณสามารถใช้ขอบเขตของกอเพื่อหามวล

ฉันไม่แน่ใจว่าสิ่งนี้จะช่วยได้หรือไม่ แต่ทั้งหมดนี้คือสิ่งที่ฉันคิดได้


อะไรคือแรงโน้มถ่วงเขต ?
David Cowden

0

ในตอนท้ายของแต่ละการจับเวลาคุณสามารถแปลงข้อมูลเป็นกราฟคำนวณต้นไม้ทอดขั้นต่ำจากนั้นเริ่มลบขอบที่เกินขีด จำกัด ที่แน่นอน นั่นควรให้คุณกระจุกและวิธีง่ายๆในการแจกแจงอนุภาคในแต่ละกลุ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.