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


14

ฉันมีชุดข้อมูลที่ใช้เป็นล้านจุดข้อมูลในแบบ 3 มิติ สำหรับการคำนวณที่ฉันทำฉันจำเป็นต้องคำนวณเพื่อนบ้าน (ค้นหาช่วง) ไปยังจุดข้อมูลแต่ละจุดในรัศมีลองปรับฟังก์ชั่นคำนวณข้อผิดพลาดสำหรับการพอดีทำซ้ำสำหรับ datapoint ต่อไปและอื่น ๆ รหัสของฉันทำงานอย่างถูกต้อง แต่ใช้เวลานานในการรันประมาณ 1 วินาทีต่อดาต้าพอยท์! อาจเป็นเพราะในแต่ละจุดจะต้องค้นหาทั้งชุดข้อมูล มีวิธีที่ฉันสามารถทำให้กระบวนการรวดเร็ว ฉันมีความคิดว่าถ้าฉันสามารถสร้างความสัมพันธ์แบบ adjacency บางอย่างระหว่างเพื่อนบ้านแรกแล้วนี่อาจช้าน้อยลง ถ้าช่วยได้ฉันพยายามค้นหาความกว้างของหน้าต่าง Parzen ที่เหมาะสมในแบบ 3 มิติ

คำตอบ:


9

ฉันขอแนะนำ googling สำหรับลำดับชั้นของขอบเขตที่ จำกัด (โดยเฉพาะทรี BSP) เมื่อพิจารณาจากคลาวด์พอยต์ของคุณคุณจะพบระนาบที่แยกออกเป็นสอง subclouds ที่เท่ากัน จากนั้นเมื่อคุณต้องการค้นหาชุดของจุดที่อยู่ภายในรัศมี R ของจุดทดสอบคุณสามารถเปรียบเทียบจุดทดสอบของคุณกับระนาบนั้นก่อนและหากความสูงเหนือมันคือมากกว่า R จากนั้นทั้ง subcloud ใต้ระนาบ จะต้องอยู่ห่างไกลกว่า R ด้วยเช่นกัน (ดังนั้นคุณไม่จำเป็นต้องตรวจสอบจุดเหล่านี้) คุณสามารถใช้ความคิดนี้ซ้ำเช่นกันในที่สุดก็ให้ความซับซ้อนของประเภท n log n แทน n-squared (นี่คือการแบ่งพื้นที่ BSP / ไบนารี


7

มีโครงสร้างข้อมูลหลายอย่างสำหรับจัดเก็บข้อมูลที่เก็บรักษาข้อมูลเกี่ยวกับตำแหน่งและความใกล้เคียง โดยอนุญาตให้มีการกำหนดเพื่อนบ้านที่ใกล้ที่สุดอย่างรวดเร็ว

โดยเฉพาะอย่างยิ่งR-ต้นไม้ (และรูปแบบเฉพาะเช่นR * -trees ) และX-ต้นไม้ ตัวเลือกมากมายที่ปรับให้เหมาะสมสำหรับการใช้งานที่แตกต่างกันเล็กน้อย

การเลือก R * -tree แทนที่จะค้นหาเพื่อนบ้านที่ไร้เดียงสาใกล้ที่สุดเป็นส่วนใหญ่ของฉันที่ได้รับตัวเร่งความเร็ว 10,000 ระดับจากรหัสเฉพาะ (ตกลงอาจจะไม่กี่ร้อยที่เป็น R * -tree, ส่วนที่เหลือเป็นเพราะไร้เดียงสามองขึ้นได้รับการเข้ารหัสไม่ดีเพื่อที่จะทุบแคช. :: :: ถอนหายใจ )

โครงสร้างเหล่านี้มีประสิทธิภาพการแทรก ( Nจำนวนจุดที่จัดเก็บ) โดยทั่วไปและความต้องการพื้นที่เก็บข้อมูลและประสิทธิภาพการค้นหาO ( log N )ดังนั้นพวกเขาจึงทำงานได้ดีถ้าคุณจะทำการค้นหาหลายครั้ง แต่ละจุดเหมือนใน DBSCAN); อย่างไรก็ตามบางคนก็มีประสิทธิภาพที่แย่ที่สุดO(NlogN)NO(logN)


5

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

ที่นั่นเราใช้รายการเซลล์ (หรือรายการเพื่อนบ้าน ) เพื่อช่วยให้เราทราบว่ามีอะไรใกล้เคียง สำหรับแอปพลิเคชันนี้รายการเซลล์น่าจะเป็นอัลกอริธึมที่ง่ายกว่าในการใช้:

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

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


คุณควรชี้ให้เห็นว่าความยาวของขอบเซลล์ควรมีอย่างน้อยรัศมีการค้นหาหรือถ้าแต่ละอนุภาคมีรัศมีการค้นหาของตัวเองแล้วก็คือรัศมีสูงสุด
Pedro

นั่นเป็นเรื่องจริงในกรณี MD ที่นี่เราไม่ทราบว่าสิ่งที่เป็นรัศมีเบื้องต้น
aeismail

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

4

แน่นอนคุณควรตรวจสอบต้นไม้ KDและoctreesซึ่งเป็นวิธีการของทางเลือกสำหรับชุดจุด (ในขณะที่มีการ BSPs วัตถุทั่วไปและกริดสำหรับความหนาแน่นมากขึ้นหรือน้อยชุด) สามารถกะทัดรัดและรวดเร็วลดค่าใช้จ่ายทั้งในหน่วยความจำและการคำนวณและง่ายต่อการใช้งาน

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


3

คุณน่าจะลองสร้างDelaunay triangulationขึ้นมา ใน 2D นั่นคือการวิเคราะห์ตำแหน่งของจุดข้อมูลที่มีเพื่อนบ้านที่ใกล้ที่สุดอยู่เสมอ สิ่งเดียวกันถือเป็นแบบ 3 มิติ แต่ด้วย tetrahedra

คุณสามารถสร้างรูปสามเหลี่ยมครั้งเดียวและจากนั้นค้นหาเพื่อนบ้านที่ใกล้ที่สุดโดยตรงในรูปสามเหลี่ยม ฉันคิดว่ามีอัลกอริทึมที่ดีในการสร้างสมการ: ใน 2D การสร้างสมการนั้นอยู่ในnเข้าสู่ระบบ(n) และต่อมาการค้นหาเพื่อนบ้านที่ใกล้ที่สุดคือเชิงเส้นในจำนวนจุดข้อมูล

หวังว่ามันจะช่วย!

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