การทดสอบซอฟต์แวร์ทางสถิติ


10

เทคนิค / แนวทางใดที่มีประโยชน์ในการทดสอบซอฟต์แวร์เชิงสถิติ ฉันสนใจโปรแกรมที่ใช้การประมาณค่าพารามิเตอร์โดยใช้โอกาสสูงสุด

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

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

คำตอบ:


8

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

  • ผมเขียนที่มีประสิทธิภาพ แต่ยากที่จะใช้การดำเนินงานของเคนดอลทดสอบเอกภาพบีกับมันผมเขียนการดำเนินงานสาย 50 ตายง่ายๆที่วิ่งใน2) O(N log N)O(N2)

  • ฉันเขียนโค้ดบางอย่างเพื่อทำการถดถอยสัน อัลกอริทึมที่ดีที่สุดสำหรับการทำสิ่งนี้ขึ้นอยู่กับว่าคุณอยู่ในกรณีหรือดังนั้นฉันต้องการอัลกอริธึมสองประการ n>pp>n

ในทั้งสองกรณีนี้ฉันใช้เทคนิคที่เป็นที่รู้จักกันดีในภาษาการเขียนโปรแกรม D (ซึ่งไม่มีการดำเนินการ) ดังนั้นฉันจึงตรวจสอบผลลัพธ์บางอย่างกับอาร์อย่างไรก็ตามการทดสอบมอนเตคาร์โลจับข้อบกพร่องที่ฉันไม่เคยจะจับได้ .

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

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


5

ไม่แน่ใจว่านี่เป็นคำตอบที่ตรงกับคำถามของคุณหรือไม่ แต่อย่างน้อยก็เกี่ยวข้องกัน

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

  1. เราได้ทำการทดสอบสมมติฐานทางสถิติสองสามประเภทซึ่งหนึ่งในนั้นคือการทดสอบแบบจำลองไคสแควร์ที่เหมาะสม - การทดสอบไคสแควร์ของจำนวนตัวอย่างในถังขยะที่พิจารณาจากค่าผกผันของ CDF ของการแจกแจงความน่าจะเป็น ตัวอย่างเช่นเพื่อทดสอบการสร้างตัวอย่างการแจกจ่าย Cauchy ฉันใช้งานบางอย่าง

    with(Statistics):
    infolevel[Statistics] := 1:
    distribution := CauchyDistribution(2, 3):
    sample := Sample(distribution, 10^6):
    ChiSquareSuitableModelTest(sample, distribution, 'bins' = 100, 'level' = 0.001);
    

    เนื่องจากฉันสามารถสร้างตัวอย่างได้มากเท่าที่ฉันต้องการฉันสามารถทำให้ค่อนข้างเล็กได้α

  2. สำหรับการแจกแจงที่มีช่วงเวลาที่ จำกัด ฉันคำนวณจำนวนช่วงเวลาตัวอย่างในมือข้างหนึ่งและอีกนัยหนึ่งฉันคำนวณสัญลักษณ์ช่วงเวลาการแจกแจงที่สอดคล้องกันและข้อผิดพลาดมาตรฐานของพวกเขา ดังนั้นสำหรับเช่นการกระจายเบต้า:

    with(Statistics):
    distribution := BetaDistribution(2, 3):
    distributionMoments := Moment~(distribution, [seq(1 .. 10)]);
    standardErrors := StandardError[10^6]~(Moment, distribution, [seq(1..10)]);
    evalf(distributionMoments /~ standardErrors);
    

    นี่แสดงรายการของตัวเลขที่ลดลงซึ่งสุดท้ายคือ 255.1085766 ดังนั้นแม้ขณะที่ 10 ค่าของช่วงเวลาที่เป็นมากกว่า 250 ครั้งมูลค่าของข้อผิดพลาดมาตรฐานของช่วงเวลาตัวอย่างสำหรับตัวอย่างที่มีขนาดที่ 6 ซึ่งหมายความว่าฉันสามารถใช้การทดสอบที่ทำงานมากหรือน้อยดังนี้106

    with(Statistics):
    sample := Sample(BetaDistribution(2, 3), 10^6):
    sampleMoments := map2(Moment, sample, [seq(1 .. 10)]);
    distributionMoments := [2/5, 1/5, 4/35, 1/14, 1/21, 1/30, 4/165, 1/55, 2/143, 1/91];
    standardErrors := 
      [1/5000, 1/70000*154^(1/2), 1/210000*894^(1/2), 1/770000*7755^(1/2), 
       1/54600*26^(1/2), 1/210000*266^(1/2), 7/5610000*2771^(1/2), 
       1/1567500*7809^(1/2), 3/5005000*6685^(1/2), 1/9209200*157366^(1/2)];
    deviations := abs~(sampleMoments - distributionMoments) /~ standardErrors;
    

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

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


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

2

Bruce McCullough มีอุตสาหกรรมคอทเทจเล็กน้อยในการประเมินซอฟต์แวร์เชิงสถิติ (ในแง่ที่กว้างที่สุดเขายังทดสอบ Microsoft Excel และพบว่ามันต้องการ) เอกสารสองฉบับที่แสดงส่วนหนึ่งของวิธีการของเขาอยู่ที่นี่และที่นี่


2

วิลเลียมกูลด์ได้รับรายละเอียดมากมายจากประธานาธิบดี StataCorp ในบทความ Stata Journal 1เป็นบทความที่น่าสนใจมากเกี่ยวกับการควบคุมคุณภาพของซอฟต์แวร์ทางสถิติ

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