φυβλαςのβλογ
บล็อกของ phyblas



ความน่าจะเป็นเบื้องต้นสำหรับเขียนโปรแกรม บทที่ ๑: เราศึกษาความน่าจะเป็นไปเพื่ออะไร
เขียนเมื่อ 2020/07/25 19:05
แก้ไขล่าสุด 2021/09/28 16:42

บทความนี้จะเขียนเกี่ยวกับเรื่องความน่าจะเป็น โดยมีการเขียนโปรแกรมภาษาไพธอนเพื่อช่วยในการอธิบายให้เห็นภาพด้วย

เนื้อหาจะเน้นในส่วนที่เป็นพื้นฐานของการเขียนโปรแกรมหรืองานทางวิทยาศาสตร์






วัตถุประสงค์ของการศึกษาเรื่องความน่าจะเป็น

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

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

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

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

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

หลักสถิติและความน่าจะเป็นก็ยังเป็นพื้นฐานของการวิเคราะห์ข้อมูลโดยเทคนิคการเรียนรู้ของเครื่อง (机器学习, machine learning)ซึ่งได้กลายเป็นวิธีการที่นิยามอย่างมากในการทำนายสิ่งต่างๆ

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

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

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

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

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

ดังนั้นเนื้อหาตรงนี้จึงถือเป็นคณิตศาสตร์ฉบับสำหรับนักเขียนโปรแกรม มากกว่าที่จะไว้สำหรับคนที่จะศึกษาคณิตศาสตร์จริงจัง

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




ใช้คอมพิวเตอร์เป็นตัวช่วยในการทำความเข้าใจเรื่องความน่าจะเป็น

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

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

แต่เพื่อที่จะเห็นความน่าจะเป็นของเหตุการณ์ต่างๆมักจะต้องทำซ้ำไปมาหลายครั้งยิ่งเยอะยิ่งดี แต่การทดลองทำจริงนั้นมักจะกินเวลา

ในยุคหลังๆมานี้เราสามารถใช้คอมพิวเตอร์เพื่อจำลองเหตุการณ์ต่างๆได้โดยที่ไม่ต้องทำการทดลองจริง

คอมพิวเตอร์สามารถจำลองการสุ่มได้ สามารถสร้างค่าตัวเลขแบบสุ่มออกมาได้ในเวลาอันรวดเร็ว

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

นอกจากนี้หากต้องการสุ่มค่าพร้อมๆกันเป็นจำนวนมากหากใช้มอดูล numpy จะทำได้เร็วกว่า นอกจากนี้มอดูลเสริมอื่นๆเช่น scipy ก็มีฟังก์ชันที่ช่วยให้สุ่มโดยมีการแจกแจงตามรูปแบบที่ต้องการ

ในที่นี้ตั้งใจจะใช้การเขียนโปรแกรมเป็นตัวกลางเพื่อให้เข้าใจเรื่องความน่าจะเป็นเท่านั้น ดังนั้นเพื่อความเข้าใจง่ายๆแม้แต่กับคนที่ไม่เคยใช้ไพธอน ในที่นี้จะใช้มอดูล random ธรรมดา สุ่มทีละค่าโดยวนซ้ำด้วย for แม้ว่าในทางปฏิบัติแล้วสำหรับไพธอนนั้นใช้ numpy อาจมีประสิทธิภาพกว่า

เกี่ยวกับวิธีการใช้มอดูล random ในรายละเอียดอ่านได้ใน ฟังก์ชันที่เกี่ยวข้องกับการสุ่มใน python

นอกจากนี้ยังใช้ matplotlib ในการวาดภาพประกอบต่างๆ แต่จะไม่เน้นตรงนี้ เพื่อที่คนที่ไม่ได้ใช้ matplotlib จะสามารถเข้าใจได้ด้วย




ความน่าจะเป็นบอกถึงอะไร

ปกติเวลาพูดถึงความน่าจะเป็นจะพูดว่าโอกาสเกิดเป็นสัดส่วนเท่าไหร่ เป็นเลขเศษส่วนหรือทศนิยมซึ่งค่าไม่เกิน 1 หรืออาจเขียนร้อยละ เช่น ลูกเต๋ามีโอกาสออกแต่ละหน้า 1/6 พรุ่งนี้มีโอกาสฝนตก 70%

หรืออย่างเช่นเล่นเกมแล้วมอนสเตอร์ตัวหนึ่งที่มีโอกาสดร็อปไอเท็มอยู่ 10% (หรือ 1/10) แบบนี้หมายความว่าอย่างไร? หมายความว่าถ้าหากล้มมอนสเตอร์ไป 10 ตัวจะต้องได้ไอเท็มสักอันใช่หรือไม่?

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

ถ้าโอกาสเป็น 1/10 ทุกครั้ง ต่อให้เราพลาดมาแล้ว 9 ครั้ง ก็ไม่ใช่ว่าครั้งที่ 10 จะมีโอกาสได้แน่นอน แต่โอกาสได้ก็เป็น 1/10 เหมือนเดิม หรือต่อให้ลองเป็นร้อยครั้งก็ไม่มีทางที่ได้แน่นอน 100%

ดังนั้นการทำความเข้าใจว่าค่าความน่าจะเป็นที่รู้มานี้ช่วยบอกอะไรเราได้ตีความได้ว่าอย่างไรนั้นก็เป็นวัตถุประสงค์สำคัญอย่างหนึ่ง

และรวมไปถึงตีความว่าความน่าจะเป็นของเหตุการณ์หนึ่งจะทำให้เกิดความน่าจะเป็นของเหตุการณ์อื่นเป็นเท่าไหร่ตามมาด้วย

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




การหาความน่าจะเป็นจากเหตุการณ์ที่เกิดขึ้น

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

ในสถานการณ์ที่เราไม่รู้ว่าความน่าจะเป็นของเหตุการณ์ใดเป็นเท่าไหร่ เราอาจต้องทดลองเพื่อจะได้รู้

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

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

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

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

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




เหตุการณ์นี้สรุปได้จริงๆหรือแค่บังเอิญ

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

เช่นยกตัวอย่างสมมุติว่าโยนเหรียญหัวก้อย เหรียญโดยทั่วไปน่าจะมีโอกาสออกหัวหรือก้อยเท่ากัน แต่พอโยนไป 4 ครั้งได้หัว 3 ก้อย 1 แบบนี้แสดงว่าเหรียญนี้มีโอกาสออกหัวมากกว่าจริงๆ หรือว่าแค่บังเอิญ

แล้วถ้าเปลี่ยนใหม่เป็นโยนเหรียญ 40 ครั้งออกหัว 27 ครั้ง ออกก้อย 13 ครั้ง แบบนี้สรุปได้ว่าเหรียญนี้ถูกทำให้มีโอกาสออกหัวมากกว่าจริงๆ ไม่ใช่แค่บังเอิญ

ถ้าคิดตามสามัญสำนึกแล้ว เมื่อโยนแค่ 4 ครั้งก็คงจะมองได้ว่าเป็นแค่เรื่องบังเอิญ แม้จะได้หัวมากกว่าก้อยถึง 3 เท่าแต่ก็คงรู้สึกว่ายังไม่อาจด่วนสรุปว่าเหรียญนี้โกงจริงๆ

แต่พอโยนไปถึง 40 ครั้งแล้วพบว่าเหรียญออกหัวมากกว่าอย่างเห็นได้ชัดแบบนี้แม้จำนวนที่ได้หัวจะมากกว่าก้อยแค่ 27/3≈2.1 เท่า ซึ่งน้อยกว่าตอนโยนแค่ 4 ครั้ง แต่กลับรู้สึกว่ามั่นใจในผลสรุปนี้มากกว่าเดิม

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

อีกทั้งมีอีกหลายเหตุการณ์ที่ไม่สามารถใช้สามัญสำนึกมาคิดได้ หรือแม้แต่ผิดไปจากสามัญสำนึกด้วย ซึ่งมีตัวอย่างให้เห็นมากมาย

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




ขอบเขตและลำดับเนื้อหา

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

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

ต่อมาก็จะดูเรื่องการแจกแจงความน่าจะเป็น โดยเริ่มจากกรณีของค่าแบบไม่ต่อเนื่องซึ่งเข้าใจง่ายกว่าก่อน (บทที่ ๔)

แล้วก็แสดงตัวอย่างการแจกแจงของค่าไม่ต่อเนื่องที่พบได้ในชีวิตประจำวัน ได้แก่การแจกแจงทวินาม (บทที่ ๕), การแจกแจงแบบเรขาคณิต (บทที่ ๖) และการแจกแจงแบบปัวซง (บทที่ ๗)

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

จากนั้นก็จะแสดงตัวอย่างของการแจกแจงของค่าแบบต่อเนื่องที่มักพบในชีวิตประจำวัน เช่น การแจกแจงเอ็กซ์โพเนนเชียล (บทที่ ๑๐), การแจกแจงเบตา (บทที่ ๑๑), การแจกแจงแบบปกติ (บทที่ ๑๒) และการแจกแจงแบบปกติหลายตัวแปร (บทที่ ๑๓)




บทถัดไป >> บทที่ ๒



-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คณิตศาสตร์ >> ความน่าจะเป็น

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2019年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文