วิธีการสร้างจุดกระจายอย่างสม่ำเสมอบนพื้นผิวของทรงกลม 3 มิติหน่วย?


68

ฉันสงสัยว่าจะสร้างจุดกระจายอย่างสม่ำเสมอบนพื้นผิวของทรงกลมหน่วย 3 มิติได้อย่างไร? หลังจากสร้างจุดเหล่านี้แล้ววิธีที่ดีที่สุดในการมองเห็นและตรวจสอบว่ามีความสม่ำเสมอบนพื้นผิวx2+y2+z2=1หรือไม่


หากเครื่องแบบคุณหมายถึง "ปกติ" ไม่มีทางที่จะทำนอกn = 2, 4, 6, 8, 12, 20.
Marcos

1
มีอะไรผิดปกติกับตัวอย่างจาก MultiVariateGaussian และเวกเตอร์นั้นเป็นปกติ: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))แล้ว v = v/v.norm(10000)
Pinocchio

คำตอบ:


72

วิธีมาตรฐานคือการสร้างบรรทัดฐานสามมาตรฐานและสร้างเวกเตอร์หน่วยจากพวกเขา นั่นคือเมื่อและλ 2 = X 2 1 + X 2 2 + X 2 3จากนั้น( X 1 / λ , X 2 / λ , X 3 / λ )กระจายอย่างสม่ำเสมอบน ทรงกลม วิธีนี้ใช้ได้ผลดีกับมิติทรงกลมd -dimensional เช่นกันXiN(0,1)λ2=X12+X22+X32(X1/λ,X2/λ,X3/λ)d

ใน 3D คุณสามารถใช้การสุ่มตัวอย่างการปฏิเสธ: ดึงจากการกระจายแบบสม่ำเสมอ[ - 1 , 1 ]จนกระทั่งความยาวของ( X 1 , X 2 , X 3 )น้อยกว่าหรือเท่ากับ 1 จากนั้น - เช่นเดียวกับ วิธีการก่อนหน้า - ปรับเวกเตอร์เป็นความยาวหน่วยปกติ จำนวนการทดลองที่คาดหวังต่อจุดกลมเท่ากับ2 3 / ( 4 π / 3 ) = 1.91 ในมิติที่สูงขึ้นจำนวนการทดลองที่คาดหวังจะเพิ่มขึ้นอย่างมากซึ่งทำให้ไม่สามารถทำได้อย่างรวดเร็วXi[1,1](X1,X2,X3)23/(4π/3)

มีหลายวิธีที่จะตรวจสอบความสม่ำเสมอเป็น วิธีที่เรียบร้อยแม้จะค่อนข้างเข้มข้นคอมพิวเตอร์อยู่กับฟังก์ชั่น K ริบลีส์ จำนวนที่คาดหวังของจุดภายใน (3D แบบยุคลิด) ระยะทางของสถานที่ตั้งบนทรงกลมใด ๆ เป็นสัดส่วนกับพื้นที่ของทรงกลมภายในระยะทางที่ρซึ่งเท่ากับเธρ 2 ด้วยการคำนวณระยะทางระหว่างจุดทั้งหมดคุณสามารถเปรียบเทียบข้อมูลกับอุดมคตินี้ได้ρρπρ2

หลักการทั่วไปของการสร้างกราฟิกเชิงสถิติแนะนำวิธีที่ดีในการทำการเปรียบเทียบคือการพล็อตค่าความแปรปรวนที่เหลือ - ความเสถียรกับi = 1 , 2 , , n ( n - 1 ) / 2 = เมตรที่d [ ผม]เป็นฉันTHเล็กที่สุดของระยะทางร่วมกันและอีฉัน = 2 ei(d[i]ei)i=1,2,,n(n1)/2=md[i]ith . เนื้อเรื่องควรใกล้กับศูนย์ (วิธีนี้ไม่เป็นทางการ)ei=2i/m

นี่คือรูปภาพของ 100 การจับฉลากอิสระจากการกระจายแบบกลมที่ได้จากวิธีแรก:

100 คะแนนทรงกลมสม่ำเสมอ

นี่คือพล็อตการวินิจฉัยระยะทาง:

พล็อตการวินิจฉัย

สเกล y แสดงให้เห็นว่าค่าเหล่านี้อยู่ใกล้กับศูนย์ทั้งหมด

นี่คือการสะสมของ 100 แปลงดังกล่าวเพื่อแนะนำสิ่งที่ขนาดเบี่ยงเบนจริงอาจเป็นตัวบ่งชี้ที่สำคัญของความไม่สม่ำเสมอ:

ค่าจำลอง

(แปลงเหล่านี้ดูน่ากลัวมากเช่นสะพานบราวเนียน ... อาจมีการค้นพบทางทฤษฎีที่น่าสนใจที่ซ่อนตัวอยู่ที่นี่)

ในที่สุดนี่คือพล็อตการวินิจฉัยของชุดสุ่ม 100 ชุดและอีก 41 จุดกระจายอย่างสม่ำเสมอในซีกโลกตอนบนเท่านั้น:

จำลองค่าที่ไม่สม่ำเสมอ

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


(X1/λ,X2/λ,X3/λ)

23
XN(0,In)Inn×nQQXN(0,In)XY=X/X2YQ=QX/QX2=QX/X2Q. เนื่องจากมีค่าคงที่ต่อการหมุนดังนั้นจึงเป็นและเนื่องจากเกือบจะแน่นอนดังนั้นมันจึงต้องกระจายอย่างสม่ำเสมอบนทรงกลม XYY2=1
พระคาร์ดินัล

3
@ ไมค์ไม่ใช่เพราะการกระจายละติจูดชุดไม่สม่ำเสมอทำให้การกระจายแบบสม่ำเสมอบนทรงกลม (พื้นผิวของทรงกลมส่วนใหญ่อยู่ในละติจูดที่ต่ำกว่าใกล้กับเส้นศูนย์สูตรห่างจากเสาคุณจำเป็นต้องมีการกระจายแบบแทน)ϕcos(ϕ)
whuber

1
@Ahsan เนื่องจากเมทริกซ์มุมฉากก่อตัวเป็นกลุ่มสกรรมกริยาของการอนุรักษ์พื้นที่ของทรงกลมการกระจายจึงมีรูปแบบที่สม่ำเสมอเหนือเซตย่อยของทรงกลมของรูปแบบ : แต่นี่คือทรงกลมทั้งหมด X/||X||2
whuber

1
@ ซีซาร์ "การกระจายเครื่องแบบ" (บนทรงกลม)
whuber

19

นี่คือรหัส R ที่ค่อนข้างง่าย

n     <- 100000                  # large enough for meaningful tests
z     <- 2*runif(n) - 1          # uniform on [-1, 1]
theta <- 2*pi*runif(n) - pi      # uniform on [-pi, pi]
x     <- sin(theta)*sqrt(1-z^2)  # based on angle
y     <- cos(theta)*sqrt(1-z^2)     

มันง่ายมากที่จะเห็นจากการก่อสร้างที่และดังนั้นแต่ถ้าจำเป็นต้องทำการทดสอบx2+y2=1z2x2+y2+z2=1

mean(x^2+y^2+z^2)  # should be 1
var(x^2+y^2+z^2)   # should be 0

และง่ายต่อการทดสอบว่าแต่ละและมีการกระจายอย่างสม่ำเสมอใน (ชัด ๆ คือ) ด้วยxy[1,1]z

plot.ecdf(x)  # should be uniform on [-1, 1]
plot.ecdf(y)
plot.ecdf(z)

เห็นได้ชัดว่าให้ค่าของ ,และมีการกระจายอย่างสม่ำเสมอรอบวงกลมรัศมีและสิ่งนี้สามารถทดสอบได้โดยดูที่การกระจายของอาร์กแทนเจนต์ของอัตราส่วน แต่เนื่องจากมีการกระจายระยะขอบเท่ากันกับและคำสั่งที่คล้ายกันจึงเป็นจริงสำหรับคู่ใด ๆ และสิ่งนี้ก็สามารถทดสอบได้เช่นกัน zxy1z2zxy

plot.ecdf(atan2(x,y)) # should be uniform on [-pi, pi]
plot.ecdf(atan2(y,z))
plot.ecdf(atan2(z,x))

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


ฉันแค่สงสัยว่าวิธีการของคุณในการสร้างคะแนน (x, y, z) เป็นหลักเหมือนกับวิธีการของ whuber หรือไม่?
Qiang Li

3
ไม่มันไม่ใช่: whuber ใช้ตัวเลขสุ่มสามตัวในขณะที่ฉันใช้สองหมายเลข Mine เป็นกรณีพิเศษของ "สร้างจุดบนด้วยความหนาแน่นที่เหมาะสม [สัดส่วนกับ ] แล้วลดขนาดลง" นี่คือสิ่งอำนวยความสะดวกเช่นนี้เป็นอย่างเป็นทางการ2 ทรงกลม [1,1](1z2)n/21n=2
เฮนรี่

3
หรือโดยทั่วไปให้สร้างจุดเครื่องแบบบนแผนที่โดยใช้การฉายภาพพื้นที่เท่ากัน (ของคุณคือพื้นที่เท่ากันของทรงกระบอก) จากนั้นจึงฉายกลับ (+1)
whuber

@whuber: แน่นอน offtopic แต่สำหรับทุกคนที่สนใจฉันมีตัวเลือกการโต้ตอบของโลกประมาณการแผนที่ที่นี่บางแห่งที่มีพื้นที่เท่ากัน
เฮนรี่

2
นี่เป็นวิธีการมาตรฐานที่ใช้กันมากในคอมพิวเตอร์กราฟิกส์ทฤษฎีบท Hat-Box ของอาร์คิมีดีส: mathworld.wolfram.com/ArchimedesHat-BoxTheorem.html
Edward KMETT

10

หากคุณต้องการสุ่มตัวอย่างคะแนนการกระจายอย่างสม่ำเสมอบนทรงกลม 3 มิติ (เช่นพื้นผิวของลูกบอล 3 มิติ) ให้ใช้การปฏิเสธแบบง่าย ๆ หรือวิธีการของ Marsaglia (Ann. Math. Statist., 43 (1972), pp. 645– 646) สำหรับขนาดต่ำอัตราส่วนการปฏิเสธนั้นค่อนข้างต่ำ

หากคุณต้องการสร้างจุดสุ่มจากทรงกลมและลูกบอลมิติสูงกว่านั้นขึ้นอยู่กับวัตถุประสงค์และขนาดของการจำลอง หากคุณไม่ต้องการจำลองสถานการณ์ขนาดใหญ่ให้ใช้วิธีการของมุลเลอร์ (คอมมิวนิตี้ ACM, 2 (1959), หน้า 19–20) หรือรุ่น "บอล" (ดูเอกสารของ Harman & Lacko ที่อ้างถึงด้านบน) นั่นคือ:

เพื่อให้ตัวอย่างกระจายอย่างสม่ำเสมอบน n-sphere (พื้นผิว) 1) สร้าง X จากการแจกแจงปกติแบบมาตรฐานมิติ n มิติ 2) หารแต่ละองค์ประกอบของ X โดย Euclidean norm ของ X

เพื่อให้ตัวอย่างกระจายอย่างสม่ำเสมอบน n-ball (ภายใน) 1) สร้าง X จาก (n + 2) - การแจกแจงแบบปกติสองมิติมาตรฐาน 2) หารแต่ละส่วนของ X ด้วย Euclidean norm ของ X และรับเฉพาะองค์ประกอบแรก

หากคุณต้องการจำลองสถานการณ์ขนาดใหญ่คุณควรศึกษาวิธีการเฉพาะเพิ่มเติม ฉันสามารถส่งเอกสารของ Harman และ Lacko ให้กับคุณตามวิธีการแจกแจงแบบมีเงื่อนไขซึ่งให้การจำแนกประเภทและการวางนัยทั่วไปของอัลกอริทึมบางอย่างที่กล่าวถึงในการสนทนานี้ ผู้ติดต่อสามารถดูได้ที่เว็บไซต์ของฉัน (http://www.iam.fmph.uniba.sk/ospm/Lacko)

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


มีอะไรผิดปกติกับตัวอย่างจาก MultiVariateGaussian และเวกเตอร์นั้นแค่ทำให้เป็นมาตรฐาน: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))แล้ว v = v/v.norm(10000)
Pinocchio

8

ฉันมีปัญหาที่คล้ายกัน (n-sphere) ระหว่างปริญญาเอกของฉันและหนึ่งใน 'ผู้เชี่ยวชาญ' การสุ่มตัวอย่างการปฏิเสธที่แนะนำจาก n-cube! แน่นอนนี่น่าจะเป็นยุคของจักรวาลเมื่อฉันดู n ตามลำดับของนักล่า

อัลกอริทึมที่ฉันใช้ด้วยนั้นง่ายมากและเผยแพร่ใน:

WP Petersen และ A. Bernasconic การสุ่มตัวอย่างแบบสม่ำเสมอจาก n-sphere: วิธีการรายงานทางเทคนิคแบบไอโซโทรปิก, TR-97-06, ศูนย์วิทยาศาสตร์คอมพิวเตอร์สวิส

ฉันยังมีเอกสารนี้ในบรรณานุกรมของฉันที่ฉันไม่ได้ดู คุณอาจพบว่ามีประโยชน์

Harman, R. & Lacko, V. เกี่ยวกับอัลกอริธึมการสลายตัวสำหรับการสุ่มตัวอย่างแบบสม่ำเสมอจาก spheres และ -balls วารสารการวิเคราะห์หลายตัวแปร, 2010nn


เป็นไปได้หรือไม่ที่จะโพสต์ลิงก์ที่ฉันสามารถหาข้อความเต็มของการอ้างอิงเหล่านี้ได้? ขอบคุณ
Qiang Li

ฉันไม่มีกระดาษให้ฉัน แต่หน้านี้ดูเหมือนจะอธิบายอัลกอริทึม (และอื่น ๆ อีกมากมาย) mlahanas.de/Math/nsphere.htm
emakalic

3
ดังที่ฉันเข้าใจ (จากกระดาษของ Petersen และ Bernasconic) สำหรับลูกบอล d-มิติเราสามารถสร้างรัศมีได้โดยการเพิ่ม U (0,1) ให้แปรเปลี่ยนเป็นพลังงาน (1 / d) และมุมสุดท้ายเป็นตัวแปรU (0,2 ) มุมกลางสามารถรับได้เช่นโดยที่คือ1)} สำหรับฉันเสียงนี้ค่อนข้างง่าย สิ่งที่ฉันสงสัยคือ: ถ้าฉันใช้ลำดับสุ่มแบบกึ่งสุ่มสำหรับเครื่องแบบของฉันฉันจะได้ความสวยงามในลูกบอลด้วยหรือไม่ πC.asin(uk)C1
πΓ(k2+0.5)Γ(k2+1)
Mohit

3

ฉันเคยมีปัญหานี้มาก่อนและนี่คือทางเลือกที่ฉันพบ

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

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

เพื่อให้ได้การแจกแจงที่ดีให้สมมติว่า U เป็นจำนวนสุ่มที่กระจายอย่างสม่ำเสมอ r คือรัศมี a คือพิกัดเชิงขั้วที่สองและ b คือพิกัดเชิงขั้วที่สาม

a = U * 360 b = U + U-1 จากนั้นเปลี่ยนเป็นคาร์ทีเซียนผ่าน x = r * sin (b) sin (a) z = r sin (b) cos (a) y = r sin (b)

ฉันเพิ่งพบสิ่งต่อไปนี้ซึ่งเป็นการพูดทางคณิตศาสตร์ที่ดีกว่า a = 2 (pi) * U b = cos ^ -1 (2U-1)

จริง ๆ แล้วไม่แตกต่างจากสูตรดั้งเดิมของฉันแม้ว่าของฉันจะเป็นองศากับเรเดียน

รุ่นล่าสุดนี้ควรจะสามารถใช้กับ hyperspheres ได้แม้ว่าจะไม่มีการเอ่ยถึงวิธีการทำให้สำเร็จ

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


2

นี่คือรหัสเทียม:

  1. vMultiVariateGaussian(μ,σI)
  2. v=vv

ใน pytorch:

v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
v = v/v.norm(2)

ฉันไม่เข้าใจเรื่องนี้ดีพอ แต่ฉันได้รับการบอกเล่าจาก whuber ว่า:

v = torch.normal(torch.zeros(10000), torch.eye(10000))
v = v/v.norm(2)

นอกจากนี้ยังถูกต้องเช่นการสุ่มตัวอย่างจาก univariate ปกติสำหรับแต่ละพิกัด


0

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

คุณอาจจะต้องผสมผสานและจับคู่กับวิธีที่คุณสร้างคะแนนด้วยวิธีที่คุณแมป ในแง่ของการสร้างจุด 2 มิติฉันคิดว่าลำดับสัญญาณที่มีความคลาดเคลื่อนต่ำจะเป็นจุดเริ่มต้นที่ดี (เช่นลำดับ Sobol ที่มีสัญญาณรบกวน) เนื่องจากมันมักจะสร้างจุดที่ไม่ได้ ผมไม่แน่ใจว่าเกี่ยวกับประเภทของการทำแผนที่จะใช้ แต่ Woflram โผล่ขึ้นฉาย Gnonomic ... ดังนั้นบางทีที่สามารถทำงาน?

MATLAB มีการดำเนินงานที่ดีของลำดับความคลาดเคลื่อนต่ำซึ่งคุณสามารถสร้างการใช้และการใช้ช่วงชิงq = sobolset(2) q = scramble(q)นอกจากนี้ยังมีกล่องเครื่องมือการแมปใน MATLAB ที่มีฟังก์ชั่นฉายภาพหลายแบบที่คุณสามารถใช้ในกรณีที่คุณไม่ต้องการรหัสการแมปและกราฟิกด้วยตัวเอง


1
การคาดการณ์ใด ๆ เหล่านี้สามารถรักษาความสม่ำเสมอของการสุ่มได้หรือไม่? ฉันจะตรวจสอบได้อย่างไรว่าการกระจายสุดท้ายของจุดเหล่านี้มีการกระจายอย่างสม่ำเสมอบนพื้นผิวของทรงกลมอย่างแท้จริงหรือไม่ ขอบคุณ
Qiang Li

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

3
จุดสุ่มแบบสม่ำเสมอในโปรเจคโณงอนิคส์จะไม่เหมือนกันในทรงกลมเนื่องจากโนมออนไม่ได้มีพื้นที่เท่ากัน ภาพที่เสนอโดยเฮนรี่ -> (จากเส้นลองจิจูด - ละติจูดไปจนถึงรูปสี่เหลี่ยมผืนผ้าใน ) มีพื้นที่เท่ากัน ( λ , sin ( ϕ ) ) R 2(λ,ϕ)(λ,sin(ϕ))R2
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.