ฉันรู้ว่าสูตรที่ง่ายต่อการจัดการสำหรับ CDF ของการแจกแจงแบบปกติค่อนข้างขาดหายไปเนื่องจากฟังก์ชันข้อผิดพลาดที่ซับซ้อนอยู่ในนั้น
แต่ผมสงสัยว่ามี AA สูตรที่ดีสำหรับ ) หรือการประมาณ "ทันสมัย" สำหรับปัญหานี้อาจเป็น
ฉันรู้ว่าสูตรที่ง่ายต่อการจัดการสำหรับ CDF ของการแจกแจงแบบปกติค่อนข้างขาดหายไปเนื่องจากฟังก์ชันข้อผิดพลาดที่ซับซ้อนอยู่ในนั้น
แต่ผมสงสัยว่ามี AA สูตรที่ดีสำหรับ ) หรือการประมาณ "ทันสมัย" สำหรับปัญหานี้อาจเป็น
คำตอบ:
มันขึ้นอยู่กับสิ่งที่คุณกำลังมองหา ด้านล่างนี้เป็นรายละเอียดโดยย่อและการอ้างอิง
มากของวรรณกรรมสำหรับศูนย์ใกล้เคียงรอบ ๆ ฟังก์ชั่น
สำหรับ 0 นี่เป็นเพราะฟังก์ชั่นที่คุณให้สามารถถูกจำแนกเป็นความแตกต่างอย่างง่ายของฟังก์ชั่นด้านบน (อาจมีการปรับค่าคงที่) ฟังก์ชันนี้มีชื่อเรียกหลายชื่อรวมถึง "ส่วนท้ายของการแจกแจงแบบปกติ", "อินทิกรัลอินทิกรัลปกติ" และ "เกาส์ซี - ฟังก์ชั่น " เพื่อชื่อไม่กี่ คุณจะเห็นการประมาณอัตราส่วนของ Millsซึ่งก็คือ
ที่นี่ฉันแสดงรายการอ้างอิงบางอย่างเพื่อวัตถุประสงค์ต่าง ๆ ที่คุณอาจสนใจ
การคำนวณ
มาตรฐานความเป็นจริงสำหรับการคำนวณฟังก์ชัน function หรือฟังก์ชันข้อผิดพลาดเสริมที่เกี่ยวข้องคือ
เจดับบลิวโคเหตุผลเซฟประการสำหรับฟังก์ชั่นข้อผิดพลาด , คณิตศาสตร์ คอมพ์ , 1969, pp. 631--637
การใช้งานทุกครั้ง (การเคารพตนเอง) ใช้เอกสารนี้ (MATLAB, R, ฯลฯ )
การประมาณ "แบบง่าย"
Abramowitz และ Stegunมีหนึ่งอยู่บนพื้นฐานของการขยายตัวพหุนามของการเปลี่ยนแปลงของการป้อนข้อมูล บางคนใช้มันเป็น "ความแม่นยำสูง" โดยประมาณ ฉันไม่ชอบมันเพื่อจุดประสงค์นี้เพราะมันทำงานได้ไม่ดีประมาณศูนย์ ยกตัวอย่างเช่นการประมาณของพวกเขาไม่ได้ผลผลิตQ ( 0 ) = 1 / 2ซึ่งผมคิดว่าเป็นใหญ่ไม่มีไม่มี บางครั้งสิ่งเลวร้ายเกิดขึ้นเพราะสิ่งนี้
Borjesson และ Sundberg ให้การประมาณค่าแบบง่าย ๆ ซึ่งทำงานได้ดีสำหรับแอพพลิเคชั่นส่วนใหญ่ที่ต้องการความแม่นยำเพียงไม่กี่หลัก ความผิดพลาดแน่นอนจะไม่เลวร้ายยิ่งกว่า 1% ซึ่งค่อนข้างดีเมื่อพิจารณาจากความเรียบง่าย ประมาณพื้นฐานคือ Q ( x ) = 1
PO Borjesson และ CE Sundberg ประการที่เรียบง่ายของการทำงานข้อผิดพลาด Q (x) สำหรับการใช้งานการสื่อสาร IEEE Trans commun , COM-27 (3): 639–643, มีนาคม 2522
นี่คือพล็อตข้อผิดพลาดสัมพัทธ์สัมบูรณ์
วรรณกรรมวิศวกรรมไฟฟ้าจมอยู่กับการประมาณเช่นนั้นและดูเหมือนว่าพวกเขาจะได้รับความสนใจอย่างล้นหลาม หลายคนยากจนหรือขยายไปสู่การแสดงออกที่แปลกและซับซ้อน
คุณอาจจะดู
W. Bryc เครื่องแบบประมาณหนึ่งไปทางขวาตามปกติ คณิตศาสตร์ประยุกต์และการคำนวณ 127 (2-3): 365–374, เมษายน 2545
ส่วนต่อเนื่องของ Laplace
Laplace มีส่วนอย่างต่อเนื่องที่สวยงามซึ่งมีอัตราผลตอบแทนต่อเนื่องขอบเขตบนและล่างสำหรับค่าของทุก 0 ในแง่ของอัตราส่วนของ Mills
ที่สัญกรณ์ที่ผมเคยใช้ค่อนข้างมาตรฐานสำหรับส่วนอย่างต่อเนื่องเช่น ) สำนวนนี้ไม่ได้มาบรรจบกันอย่างรวดเร็วมากสำหรับธุรกิจขนาดเล็กxแม้ว่าและมัน diverges ที่x = 0
เศษส่วนต่อเนื่องนี้จริง ๆ แล้วทำให้ขอบเขต "ง่าย" จำนวนมากบนที่ "ค้นพบ" ในช่วงกลางถึงปลายปี 1900 มันง่ายที่จะเห็นว่าสำหรับเศษส่วนต่อเนื่องในรูปแบบ "มาตรฐาน" (เช่นประกอบด้วยค่าสัมประสิทธิ์จำนวนเต็มบวก) การตัดเศษส่วนที่คำแปลก (แม้) จะให้ขอบเขตบน (ล่าง)
ดังนั้น Laplace บอกเราทันทีว่า ทั้งสองเป็นขอบเขตที่ "ค้นพบ" ในช่วงกลางปี 1900 ในแง่ของ Q -function นี่เท่ากับ x
แจ้งให้ทราบล่วงหน้าโดยเฉพาะอย่างยิ่งที่ไม่เท่าเทียมกันดังกล่าวข้างต้นได้ทันทีหมายความว่า x ความจริงนี้สามารถสร้างขึ้นได้โดยใช้กฎของ L'Hopital เช่นกัน สิ่งนี้ยังช่วยอธิบายทางเลือกของรูปแบบการทำงานของการประมาณ Borjesson-Sundberg ทางเลือกของการใด ๆ∈ [ 0 , 1 ]รักษาสมดุล asymptotic เป็นx →การ ∞ พารามิเตอร์bทำหน้าที่เป็น "การแก้ไขความต่อเนื่อง" ใกล้ศูนย์
นี่คือพล็อตของ -function และขอบเขต Laplace สองอัน
CI ซีลีมีกระดาษจากช่วงต้นปี 1990 ที่ไม่เป็น "การแก้ไข" สำหรับค่าเล็ก ๆ ของxดู
CI C. Lee เมื่อวันที่ Laplace อย่างต่อเนื่องส่วนหนึ่งสำหรับปกติ แอน Inst statist คณิตศาสตร์. , 44 (1): 107–120, มีนาคม 1992
ความน่าจะเป็นของ Durrett : ทฤษฎีและตัวอย่างแสดงขอบเขตบนและล่างแบบคลาสสิกบนในหน้า 6-7 ของรุ่นที่ 3 มันมีความหมายสำหรับค่าที่มากกว่าของx (พูด, x > 3 ) และมีความตึงเชิงเส้นกำกับ
หวังว่านี่จะช่วยให้คุณเริ่มต้นได้ หากคุณมีความสนใจเฉพาะเจาะจงมากขึ้นฉันอาจชี้คุณไปที่อื่นได้
ฉันคิดว่าฉันสายเกินไปที่จะเป็นฮีโร่ แต่ฉันต้องการแสดงความคิดเห็นในโพสต์ของคาร์ดินัลและความคิดเห็นนี้ใหญ่เกินไปสำหรับกล่องที่ตั้งใจไว้
สำหรับคำตอบนี้ฉันสมมุติว่า ; สูตรการสะท้อนที่เหมาะสมที่สามารถใช้สำหรับเชิงลบx
ฉันใช้มากขึ้นในการจัดการกับข้อผิดพลาดการทำงานของตัวเอง แต่ฉันจะพยายามที่จะแต่งสิ่งที่ฉันรู้ในแง่ของอัตราส่วน Mills ของR ( x ) (ตามที่กำหนดในคำตอบของพระราชา)
มีวิธีการอื่นในการคำนวณฟังก์ชันข้อผิดพลาด (ประกอบ) นอกเหนือจากการใช้การประมาณ Chebyshev เนื่องจากการใช้การประมาณ Chebyshev ต้องการการจัดเก็บของค่าสัมประสิทธิ์ไม่กี่วิธีการเหล่านี้อาจมีขอบถ้าโครงสร้างอาร์เรย์เป็นบิตราคาแพงในสภาพแวดล้อมการคำนวณของคุณ (คุณสามารถอินไลน์สัมประสิทธิ์ ระเบียบ)
สำหรับ "เล็ก" , Abramowitz และ Stegun เป็นซีรี่ส์ที่มีมารยาทดี (อย่างน้อยก็ประพฤติดีกว่าซีรี่ส์ Maclaurin ทั่วไป):
(ดัดแปลงจากสูตร 7.1.6)
โปรดทราบว่าค่าสัมประสิทธิ์ของในซีรีย์c j = 2 j j !สามารถคำนวณได้โดยเริ่มต้นด้วยc0=1แล้วใช้สูตรเรียกซ้ำcj+1=cj 3 สิ่งนี้จะสะดวกเมื่อใช้ชุดข้อมูลเป็นวนรอบการสรุป
พระคาร์ดินัลให้ Laplacian เศษส่วนต่อเนื่องเป็นวิธีการผูกอัตราส่วนของ Mills สำหรับขนาดใหญ่; สิ่งที่ไม่เป็นที่รู้จักกันดีคือเศษส่วนต่อเนื่องยังมีประโยชน์สำหรับการประเมินเชิงตัวเลข
Lentz , ธ อมป์สันและบาร์เน็ตต์มาอัลกอริทึมสำหรับตัวเลขการประเมินส่วนอย่างต่อเนื่องเป็นผลิตภัณฑ์ที่ไม่มีที่สิ้นสุดซึ่งมีประสิทธิภาพมากขึ้นกว่าวิธีปกติของการคำนวณเศษส่วนต่อเนื่อง "ย้อนกลับ" ซึ่งเป็น แทนที่จะแสดงอัลกอริธึมทั่วไปฉันจะแสดงให้เห็นว่ามันเชี่ยวชาญในการคำนวณอัตราส่วนของ Mills อย่างไร:
ทำซ้ำสำหรับ j=1,2,… D j = 1
Cj=x+j
โดยที่กำหนดความแม่นยำ
CF มีประโยชน์โดยที่ซีรีย์ที่กล่าวถึงก่อนหน้านี้จะเริ่มบรรจบกันอย่างช้าๆ คุณจะต้องทดสอบด้วยการพิจารณา "จุดพัก" ที่เหมาะสมเพื่อเปลี่ยนจากซีรีย์เป็น CF ในสภาพแวดล้อมการคำนวณของคุณ นอกจากนี้ยังมีทางเลือกอื่นในการใช้ซีรีย์ asymptotic แทน Laplacian CF แต่ประสบการณ์ของฉันคือ Laplacian CF นั้นดีพอสำหรับการใช้งานส่วนใหญ่
ในที่สุดหากคุณไม่จำเป็นต้องคำนวณฟังก์ชั่นข้อผิดพลาด (เสริม) อย่างแม่นยำมาก (เช่นมีเพียงไม่กี่หลักที่สำคัญ) มีการประมาณขนาดกะทัดรัด เนื่องจาก Serge Winitzki นี่คือหนึ่งในนั้น:
(คำตอบนี้ แต่เดิมปรากฏในการตอบสนองต่อคำถามที่คล้ายกันแล้วปิดเป็นซ้ำซ้อน OP ต้องการเพียง "การ" การดำเนินการของการแยกแบบเกาส์ไม่จำเป็นต้อง "สถานะของศิลปะ" ในความเห็นของเขามันก็เห็นได้ชัดว่าค่อนข้างง่าย จะต้องมีการนำไปใช้ระยะสั้น)
เป็นความคิดเห็นชี้ให้เห็นคุณจะต้องบูรณาการรูปแบบไฟล์ PDF มีหลายวิธีในการทำอินทิกรัล นานมาแล้วเมื่อการคำนวณช้าและมีราคาแพงเดวิดฮิลล์ใช้การประมาณโดยใช้เลขคณิตอย่างง่าย (ฟังก์ชันเชิงเหตุผลและการยกกำลัง) มันมีความแม่นยำแม่นยำสองเท่าสำหรับอาร์กิวเมนต์ทั่วไป (ระหว่าง และ ประมาณ) ใน 1,973 เขาเผยแพร่รุ่น Fortran ในสถิติประยุกต์ที่เรียกว่า ALNORM.F. ในช่วงหลายปีที่ผ่านมาฉันได้แจ้งเรื่องนี้ให้กับสภาพแวดล้อมที่หลากหลายซึ่งไม่มีอินทิกรัล (เกาส์เซียน) หรือมีผู้ต้องสงสัย (เช่น Excel)
MatLab รุ่น (ที่มีการอ้างเหตุผลความเหมาะสม) ที่มีอยู่ในhttp://people.sc.fsu.edu/~jburkardt/m_src/asa005/alnorm.m รหัส Fortran รุ่นดั้งเดิมที่ไม่มีเอกสารจะปรากฏในเว็บไซต์"Koders Code Search" (sic)
หลายปีที่ผ่านมาฉันบอกเรื่องนี้กับ AWK รุ่นนี้อาจเป็นที่พอใจมากกว่าสำหรับนักพัฒนาสมัยใหม่ในการพอร์ตเนื่องจากไวยากรณ์ C-like (แทนที่จะเป็น Fortran) และความคิดเห็นเพิ่มเติมที่ฉันใส่เมื่อพัฒนาและทดสอบเพราะฉันต้องการเพิ่มความแม่นยำให้สูงขึ้น มันปรากฏด้านล่าง
สำหรับผู้ที่ไม่มีประสบการณ์มากในการแปลโค้ดทางวิทยาศาสตร์ / คณิตศาสตร์ / สถิติคำแนะนำบางคำ : ความผิดพลาดในการพิมพ์เพียงครั้งเดียวสามารถสร้างข้อผิดพลาดร้ายแรงที่อาจตรวจไม่พบได้ง่าย (เชื่อฉันเกี่ยวกับเรื่องนี้ผมได้ทำจำนวนมากของพวกเขา.) เสมอมักจะสร้างการทดสอบอย่างระมัดระวังและละเอียดถี่ถ้วน เนื่องจากฟังก์ชั่นอินทิกรัล / Gaussian integral / error มีอยู่ในตารางจำนวนมากและซอฟต์แวร์มากมายมันง่ายและรวดเร็วในการจัดทำค่าจำนวนมากของฟังก์ชั่นพอร์ตของคุณและเปรียบเทียบอย่างเป็นระบบ (เช่นกับคอมพิวเตอร์ไม่ใช่ด้วยตา) ค่าที่จะแก้ไขให้ถูกต้อง คุณสามารถดูการทดสอบที่จุดเริ่มต้นของรหัสของฉัน: มันสร้างตารางของค่าใน -8.5: 8.5 (โดย 0.1) ซึ่งสามารถ piped (ผ่าน STDOUT) ไปยังโปรแกรมอื่นสำหรับการตรวจสอบอย่างเป็นระบบ
อีกวิธีการทดสอบ - สำหรับผู้ที่มีพื้นฐานการวิเคราะห์เชิงตัวเลขเพียงพอที่จะทราบวิธีการประเมินข้อผิดพลาดที่คาดหวัง - จะเป็นการแยกความแตกต่างของค่าและเปรียบเทียบกับ PDF (ซึ่งคำนวณอย่างง่ายดาย)
โดยวิธีการ: รหัสนี้เป็นเพียงสำหรับกรณีที่มีค่าเฉลี่ยของ และส่วนเบี่ยงเบนมาตรฐานของหน่วย ("sigma") แต่นั่นคือทั้งหมดที่ต้องการ: รวมจาก ถึง เมื่อค่าเฉลี่ยคือ และ SD คือ เพียงแค่คำนวณ และนำalnorm
ไปใช้กับมัน
ผมทดสอบพอร์ตของalnorm
การมาติกาซึ่งคำนวณค่าความแม่นยำโดยพลการ เพื่อเปรียบเทียบผลลัพธ์นี่คือโครงร่างของบันทึกธรรมชาติของอัตราส่วนค่าหางส่วนบน กับ . (ข้อผิดพลาดเชิงบวกหมายถึงalnorm
มีขนาดใหญ่เกินไป)
ค่านั้นถูกต้องเสมอ เมื่อเทียบกับความน่าจะเป็นหางเล็ก ๆ เต็มที คุณสามารถดูได้ว่าการคำนวณสลับไปที่สูตร asymptotic (ที่) และเห็นได้ชัดว่าสูตรนี้มีความแม่นยำมากเป็น เพิ่มขึ้น พล็อตหยุดที่ เพราะที่นี่เป็นจุดที่การยกกำลังสองความแม่นยำเริ่มเกิดขึ้นน้อยเกินไป
ตัวอย่างเช่นalnorm[-6.0]
ผลตอบแทน ในขณะที่มูลค่าที่แท้จริงเท่ากับ ประมาณ สิ่งแรกที่แตกต่างในหลักสิบสอง
NB ในส่วนของการแก้ไขนี้ฉันเปลี่ยนUPPER_TAIL_IS_ZERO
จาก15.
เป็น16.
ในโค้ด: มันทำให้ผลลัพธ์มีความแม่นยำมากขึ้นเล็กน้อย ระหว่าง และ . (สิ้นสุดการแก้ไข)
#----------------------------------------------------------------------#
# ALNORM.AWK
# Compute values of the cumulative normal probability function.
# From G. Dallal's STAT-SAK (Fortran code).
# Additional precision using asymptotic expression added 7/8/92.
#----------------------------------------------------------------------#
BEGIN {
for (i=-85; i<=85; i++) {
x = i/10
p = alnorm(x, 0)
printf("%3.1f %12.10f\n", x, p)
}
exit
}
function alnorm(z,up, y,aln,w) {
#
# ALGORITHM AS 66 APPL. STATIST. (1973) VOL.22, NO.3:
# Hill, I.D. (1973). Algorithm AS 66. The normal integral.
# Appl. Statist.,22,424-427.
#
# Evaluates the tail area of the standard normal curve from
# z to infinity if up, or from -infinity to z if not up.
#
# LOWER_TAIL_IS_ONE, UPPER_TAIL_IS_ZERO, and EXP_MIN_ARG
# must be set to suit this computer and compiler.
LOWER_TAIL_IS_ONE = 8.5 # I.e., alnorm(8.5,0) = .999999999999+
UPPER_TAIL_IS_ZERO = 16.0 # Changes to power series expression
FORMULA_BREAK = 1.28 # Changes cont. fraction coefficients
EXP_MIN_ARG = -708 # I.e., exp(-708) is essentially true 0
if (z < 0.0) {
up = !up
z = -z
}
if ((z <= LOWER_TAIL_IS_ONE) || (up && z <= UPPER_TAIL_IS_ZERO)) {
y = 0.5 * z * z
if (z > FORMULA_BREAK) {
if (-y > EXP_MIN_ARG) {
aln = .398942280385 * exp(-y) / \
(z - 3.8052E-8 + 1.00000615302 / \
(z + 3.98064794E-4 + 1.98615381364 / \
(z - 0.151679116635 + 5.29330324926 / \
(z + 4.8385912808 - 15.1508972451 / \
(z + 0.742380924027 + 30.789933034 / \
(z + 3.99019417011))))))
} else {
aln = 0.0
}
} else {
aln = 0.5 - z * (0.398942280444 - 0.399903438504 * y / \
(y + 5.75885480458 - 29.8213557808 / \
(y + 2.62433121679 + 48.6959930692 / \
(y + 5.92885724438))))
}
} else {
if (up) { # 7/8/92
# Uses asymptotic expansion for exp(-z*z/2)/alnorm(z)
# Agrees with continued fraction to 11 s.f. when z >= 15
# and coefficients through 706 are used.
y = -0.5*z*z
if (y > EXP_MIN_ARG) {
w = -0.5/y # 1/z^2
aln = 0.3989422804014327*exp(y)/ \
(z*(1 + w*(1 + w*(-2 + w*(10 + w*(-74 + w*706))))))
# Next coefficients would be -8162, 110410
} else {
aln = 0.0
}
} else {
aln = 0.0
}
}
return up ? aln : 1.0 - aln
}
### end of file ###