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


9

สำหรับแอปพลิเคชันการเรียนรู้ของเครื่องกลุ่มของฉันจำเป็นต้องคำนวณระยะทางแบบยุคลิดเพื่อ kเพื่อนบ้านที่ใกล้ที่สุดในชุด X แต่ละ x(XY)Rd (สำหรับ d ระหว่าง 5 ถึงประมาณ 100 และ |X||Y|ไม่กี่ร้อยถึงไม่กี่ล้าน) ขณะนี้เรากำลังใช้กำลังดุร้ายO(d|X||XY|) เข้าใกล้หรือสิ่งที่ชัดเจนด้วยการเปิด kd-tree Xซึ่งเมื่อใด d สูงและ |X|ค่อนข้างต่ำไม่เคยชนะ (ทุกอย่างอยู่ในหน่วยความจำ)

ดูเหมือนว่าจะต้องมีวิธีที่ดีกว่ากำลังดุร้าย - อย่างน้อยหนึ่งที่ใช้ประโยชน์จากความไม่เท่าเทียมกันของสามเหลี่ยมหรืออาจมีแฮชที่มีความอ่อนไหว การประมาณที่สมเหตุสมผลพอสมควรก็อาจเป็นไปได้เช่นกัน

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


2
kd-trees DO ใช้ประโยชน์จากความไม่เท่าเทียมกันของสามเหลี่ยม คุณได้ลองใช้ต้นไม้การแยกข้อมูลพิเศษอื่น ๆ หรือไม่? อีกสิ่งหนึ่งที่คุณอาจพิจารณา (ฉันไม่รู้อะไรเกี่ยวกับอัลกอริทึมการเรียนรู้ของเครื่องของคุณ) ว่าจุดเฉพาะมีแนวโน้มที่จะมีโครงสร้างหรือไม่ซึ่งอาจช่วยให้คุณค้นหาไฮเปอร์เพลนได้อย่างรวดเร็วและใช้พวกมันในต้นไม้ การแยกประสานงานซึ่งทำงานในระดับสูงต่ำ
Ross Snider

@RossSnider ขอบคุณสำหรับคำแนะนำ และแน่นอนว่าต้นไม้ KD ใช้ความไม่เท่าเทียมกันของสามเหลี่ยม แต่ฉันคิดถึงสิ่งที่จะเร็วกว่าแรงเดรัจฉาน :) คุณต้องการแนะนำการแบ่งพาร์ติชันข้อมูลเชิงพื้นที่ชนิดใด? จากรายการของวิกิพีเดียอาจใช้ vp-trees ดูเหมือนว่าใช้ได้และดูเหมือนว่าพวกเขาจะดีกว่า kd-trees สำหรับระยะทางแบบยุคลิด และฉันจะคิดว่าถ้ามีวิธีเฉพาะปัญหาที่ดีกว่าในการนิยามไฮเปอร์เทนแบบแยกได้ แต่ไม่มีใครจำได้
Dougal

ฉันเดาว่าฉันหวังว่าความจริงที่ว่าเรารู้ว่าเรากำลังประเมินสิ่งนี้สำหรับทุกคน X(เช่นเดียวกับประเด็นอื่น ๆ ) จะช่วยให้ความช่วยเหลือบางอย่างในอัลกอริทึม ฉันไม่แน่ใจว่าเป็นอย่างนั้น
Dougal

คืออะไร kตามปกติในแอปพลิเคชันของคุณ
Suresh Venkat

1
@SureshVenkat เรามักจะใช้ kประมาณ 3 บางครั้งใหญ่กว่าเล็กน้อย
Dougal

คำตอบ:


10

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

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


เคล็ดลับดี ควรจะใช้ตัวอย่างอีกครั้งสำหรับจุดสอบถามที่แตกต่างกันด้วยใช่ไหม ดังนั้นในการคำนวณk-earest-neighbour สำหรับแต่ละจุดในชุดฉันจะต้องสร้างโครงสร้างข้อมูล O(klogn)ครั้ง
Dougal

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

@SureshVenkat อ่าแน่นอน ฉันจะนั่งลงและหาความน่าจะเป็นที่แท้จริง ขอบคุณทุกคน!
Dougal

ถ้าคุณทำ O(klog(1/δ)) ตัวอย่างจากนั้นแต่ละแบบสอบถามจะประสบความสำเร็จด้วยความน่าจะเป็น 1δ. โปรดสังเกตว่าเคล็ดลับนี้ดีกว่าเล็กน้อยในการดูเหลือบแรก - คุณมีO(klogn) ตัวอย่างขนาดของแต่ละคน O(n/k) (ด้วยความน่าจะเป็นสูงถ้า kไม่ใหญ่เกินไป) ซึ่งหมายถึงเวลาสอบถามที่ดีขึ้นสำหรับตัวอย่างแต่ละตัวอย่าง
Sariel Har-Peled

3

วิธีแก้ปัญหาโดยประมาณราคาถูกโดยใช้ "แฮชที่มีความอ่อนไหวต่อท้องถิ่น" คือการแปลงแต่ละจุดให้อยู่ในรูปแบบของอินเตอร์เล็ดบิต

[xxx, yyy, zzz] -> xyzxyzxyz

จากนั้นเรียงลำดับ radix สำหรับการประมวลผลล่วงหน้า

เลือกจุดที่ต้องการสืบค้นและไป k คะแนนทั้งสองทิศทางเพื่อให้ได้ขนาด 2kตั้ง; จากนั้นนำkthใกล้จุดของคุณมากที่สุด ดูบทความนี้โดย Connor และ Kumar ด้วย

ดูเอกสารนี้โดยสิทธิชัยและ Kosaraju

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