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



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

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

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






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

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

ความน่าจะเป็น (概率, 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
-- opencv
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
maya
javascript
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文