มีวิธีการอะไรง่าย ๆ สำหรับการสุ่มตัวอย่างแบบ 2D ฟังก์ชั่น


22

ฉันมีฟังก์ชั่นสองมิติ ซึ่งมีค่าที่ฉันต้องการตัวอย่าง ฟังก์ชั่นนั้นมีราคาแพงมากในการคำนวณและมันมีรูปร่างที่ซับซ้อนดังนั้นฉันต้องหาวิธีที่จะได้รับข้อมูลมากที่สุดเกี่ยวกับรูปร่างของมันโดยใช้จำนวนจุดตัวอย่างน้อยที่สุด(x,Y)

มีวิธีการอะไรที่ดีในการทำสิ่งนี้?

สิ่งที่ฉันมีจนถึงตอนนี้

  • ฉันเริ่มต้นจากชุดของจุดที่มีอยู่ซึ่งฉันได้คำนวณค่าฟังก์ชันแล้ว (ซึ่งอาจเป็นจุดที่เป็นรูปสี่เหลี่ยมจัตุรัสหรืออย่างอื่น)

  • จากนั้นฉันคำนวณ Delaunay Triangulation ของจุดเหล่านี้

  • ถ้าสองจุดที่อยู่ใกล้เคียงในการหาสมการ Delaunay อยู่ไกลพอ ( ) และค่าฟังก์ชันแตกต่างกันพอสมควร ( ) จากนั้นฉันก็แทรกจุดใหม่ที่อยู่ตรงกลางระหว่างพวกเขา ฉันทำสิ่งนี้สำหรับแต่ละจุดที่อยู่ใกล้เคียง>ΔX>Δ

เกิดอะไรขึ้นกับวิธีนี้?

มันใช้งานได้ค่อนข้างดี แต่ในฟังก์ชั่นที่คล้ายกับอันนี้มันไม่เหมาะเพราะจุดตัวอย่างมีแนวโน้มที่จะ "กระโดดข้าม" สันเขาและไม่สังเกตว่ามันอยู่ที่นั่น

กราฟิกทางคณิตศาสตร์

มันสร้างผลลัพธ์เช่นนี้ (หากความละเอียดของตารางจุดเริ่มต้นหยาบพอสมควร):

กราฟิกทางคณิตศาสตร์

พล็อตด้านบนนี้แสดงจุดที่คำนวณค่าฟังก์ชัน (จริง ๆ แล้วเซลล์ Voronoi รอบตัวพวกเขา)

กราฟิกทางคณิตศาสตร์

พล็อตด้านบนนี้แสดงการประมาณค่าเชิงเส้นที่สร้างจากจุดเดียวกันและเปรียบเทียบกับวิธีการสุ่มตัวอย่างแบบบิวท์อินของ Mathematica (สำหรับความละเอียดเริ่มต้นเดียวกัน)

จะปรับปรุงได้อย่างไร?

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

มันจะดีกว่าที่จะคำนึงถึงความโค้งหรืออย่างน้อยอนุพันธ์อันดับสองเมื่อเพิ่มคะแนนการปรับแต่ง

คำถาม

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

หรือมีวิธีอื่นใดอีกในการคำนวณตำแหน่งของคะแนนการปรับแต่งในวิธีที่เหมาะสมที่สุด?

ฉันจะนำไปใช้ใน Mathematica แต่คำถามนี้ส่วนใหญ่เกี่ยวกับวิธีการ สำหรับบิต "ใช้งานง่าย" ไม่นับว่าฉันใช้ Mathematica (เช่นนี้ทำได้ง่ายมากเพราะมีแพ็คเกจสำหรับทำ Delaunay triangulation)

มีปัญหาอะไรในทางปฏิบัติที่ฉันใช้กับสิ่งนี้

ฉันกำลังคำนวณแผนภาพเฟส มันมีรูปร่างที่ซับซ้อน ในภูมิภาคหนึ่งค่าของมันคือ 0 ในอีกภูมิภาคหนึ่งอยู่ระหว่าง 0 ถึง 1 มีการกระโดดที่คมชัดระหว่างสองภูมิภาค (มันไม่ต่อเนื่อง) ในภูมิภาคที่ฟังก์ชันมีค่ามากกว่าศูนย์มีทั้งความแปรผันที่ราบรื่นและความไม่ต่อเนื่องสองสามอย่าง

ค่าฟังก์ชันถูกคำนวณตามการจำลองของ Monte Carlo ดังนั้นบางครั้งคาดว่าจะมีค่าฟังก์ชั่นหรือเสียงรบกวนที่ไม่ถูกต้อง ปัจจัยสุ่ม)

ฉันเคยถามสิ่งนี้ใน Mathematica.SE แล้วแต่ฉันไม่สามารถลิงก์กับมันได้ คำถามนี้เกี่ยวกับวิธีการไม่ใช่การนำไปใช้


ตอบกลับ @suki

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

กราฟิกทางคณิตศาสตร์ กราฟิกทางคณิตศาสตร์ กราฟิกทางคณิตศาสตร์ กราฟิกทางคณิตศาสตร์

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

UPDATE

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

นี่คือสองตัวอย่าง:

EX1 EX2

ครั้งแรกจะแสดงผลลัพธ์ที่ได้เมื่อสุ่มตัวอย่างรอบความไม่ต่อเนื่องตรง ที่สองแสดงการกระจายจุดตัวอย่างสำหรับกรณีที่คล้ายกัน

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


มีการพัฒนาใหม่ในเรื่องนี้หรือไม่?
Andrei

คำตอบ:


10

ฉันทำงานกับปัญหาที่คล้ายกับในขณะนี้กลับ

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

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

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

ในรหัส MATLAB ของฉันฉันใช้คลาสพื้นฐานเพื่อดูแลเครื่องจักรส่วนใหญ่ด้วยวิธีนามธรรมบางประการ:

  • weight(self) เพื่อตัดสินใจเลือกลำดับความสำคัญที่สามเหลี่ยมจะแยกย่อยถัดไป
  • choosePoints(self,npoints = "auto") เพื่อตัดสินคะแนนใหม่เพื่อประเมินตามน้ำหนักของแต่ละสามเหลี่ยม

ฉันพบว่าการตั้งค่านี้มีความยืดหยุ่นมาก:

  • การตั้งค่าของคลาสย่อย weight()ฟังก์ชั่นไปยังพื้นที่ของรูปสามเหลี่ยมสร้างความหนาแน่นของตาข่ายคงที่
  • การตั้งค่า weight()เพื่อคำนวณค่าฟังก์ชันเฉลี่ยเมื่อพื้นที่ของรูปสามเหลี่ยมให้การสุ่มตัวอย่างความน่าจะเป็นแบบกึ่งสุ่ม
  • การใช้ var(triangle.zs)สามารถทำได้สำหรับฟังก์ชั่นที่มีเอาต์พุตไบนารี่สิ่งที่ฉันรู้สึกคือการค้นหาแบบแบ่งส่วนแบบทั่วไปมากกว่า 1 มิติ
  • การใช้area + var(triangle.zs)นั้นค่อนข้างมีประสิทธิภาพในการวางความหนาแน่นคงที่ทุกที่และเพิ่มความหนาแน่นตามแนวลาดชันใด ๆ

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

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

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

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

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

นั่นจะมีข้อมูลเพียงพอที่จะรับค่าประมาณของเมทริกซ์ Hessian ที่สมบูรณ์ คุณสามารถหามันได้โดยทำอย่างน้อยกำลังสองของz = c1*x + C2*y c11*x^2+c12*x*y+c22*y^2จุดยอดทั้งหมดในรูปสามเหลี่ยมที่น่าสนใจ (จัดศูนย์กลางของระบบพิกัดบนรูปสามเหลี่ยมก่อน)

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

บางทีความคลาดเคลื่อนรวมของกำลังสองของค่า z ที่สัมพันธ์กับการประมาณระนาบของจุดเหล่านั้นน่าจะเป็นการวัดที่มีประโยชน์ว่าเอฟเฟกต์ลำดับที่สองที่น่าสนใจเป็นอย่างไร


Updated:

นั่นดูสมเหตุสมผลสำหรับฉัน

จริง ๆ แล้วฉันไม่เคยไปที่ขอบปลอกพิเศษ มันรบกวนฉันเล็กน้อย แต่สำหรับสิ่งที่ฉันทำมันก็เพียงพอแล้วที่จะเริ่มต้นด้วยจุดต่าง ๆ มากมายรอบ ๆ ขอบ

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

แต่เนื่องจากคุณไม่คาดหวังว่าเนื้อความหลักของ mesh จะมีสามเหลี่ยมอัตราส่วนสูงดังนั้นคุณสามารถใช้ฟังก์ชันเช่นฟังก์ชันfreeboundaryของ Matlab เพื่อหาขอบเขตแล้วรันอัลกอริทึมเดียวกันในขอบเขตน้อยกว่าหนึ่งมิติ หากทำถูกต้องบนลูกบาศก์ตัวอย่างเช่นคุณอาจได้ความหนาแน่นของตาข่ายเท่ากันที่ขอบบนใบหน้าและภายในลูกบาศก์ น่าสนใจ

สิ่งหนึ่งที่ฉันไม่เคยพบทางออกที่ดีสำหรับคือความจริงที่ว่ารุ่นของฉันจะไม่สำรวจนอกตัวเรือนูนของชุดจุดเริ่มต้น


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

คุณช่วยโปรดดูการแก้ไขและชี้แจงของฉันได้ไหม?
Szabolcs

ปรากฎว่าปลอกพิเศษไม่สามารถหลีกเลี่ยงได้ไม่ว่าฉันจะใช้ชุดรูปแบบการจัดสรรแบบใด ในกรณีของฉันฉันมีการไล่ระดับสีสูงในแนวตั้งฉาก แต่ไม่ขนานกับมันซึ่งทำให้สิ่งต่าง ๆ ไม่มีประสิทธิภาพหากฉันไม่ได้เป็นกรณีพิเศษที่ขอบ
Szabolcs

ปัญหาที่ฉันพบอีกประการหนึ่งคือการหาสมการอีกครั้งทำให้สามเหลี่ยมขนาดใหญ่ปรากฏขึ้นเป็นครั้งคราวเมื่อจุดยอดมีค่าฟังก์ชันที่แตกต่างกัน ฉันลงเอยด้วยสิ่งต่าง ๆ เช่นนี้: i.stack.imgur.com/nRPwi.pngเป็นพล็อตความหนาแน่นแบบประมาณเชิงเส้นและi.stack.imgur.com/208bP.pngคือจุดสุ่มตัวอย่าง (ไม่เหมือนกันทุกประการ) นี่เป็นเพียงความไม่ต่อเนื่องตามแนวเส้นตรง คุณประสบปัญหานี้หรือไม่ ถ้าใช่คุณแก้ปัญหาได้อย่างไร? คุณดึงข้อมูลทั้งหมดหลังจากแต่ละขั้นตอนการจัดสรรหรือไม่
Szabolcs

ฉันไม่แน่ใจว่าสมการนี้มีความหมายอะไรที่นี่ แต่ละจุดที่คุณประเมินคือค่าของฟังก์ชั่น ณ จุดหนึ่งดังนั้นทำไมไม่ทำอย่างที่พวกเขาใช้ในวิธีการแบบไร้ตาข่าย? en.wikipedia.org/wiki/Smoothed-particle_hydrodynamicsนอกจากนี้คุณยังสามารถประเมินอนุพันธ์ในลักษณะนี้ ...
meawoppl

0

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

การแก้ไขอย่างรวดเร็วอย่างหนึ่งจะพิจารณาชุดของสี่จุดโดยใช้จุดศูนย์ถ่วงและการประมาณ | dfdx | + | dfdy | ใช้จุดทั้งสี่เหล่านั้น อีกทางเลือกหนึ่งคือใช้สามจุด (เช่นสามเหลี่ยม) และใช้การไล่ระดับสีสูงสุดของพื้นผิวเหนือพวกเขา

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