Tag Archives: วิทย์ม.ต้น

วิทย์ม.ต้น: ใช้ Python ทำงานโดยเปิดไฟล์แล้วอ่านทีละบรรทัด

วันนี้เด็กๆม.ต้นหัดใช้  Python อ่านข้อมูลจากไฟล์เพื่อทำงานครับ เทคนิควันนี้คือเปิดไฟล์แล้วอ่านข้อมูลมาทีละบรรทัด แล้วทำงานกับบรรทัดนั้นๆ เป็นวิธีที่ใช้บ่อยๆในงานหลายๆอย่างครับ ตัวอย่างวันนี้เราเปิดไฟล์ที่มีคำศัพท์ภาษษาอังกฤษสองแสนกว่าคำ โดยแต่ละบรรทัดจะมีคำหนึ่งคำ มีตัวอย่างการใช้ตัวแปรประเภท dictionary เพื่อลดจำนวนครั้งของการอ่านไฟล์ และตัวอย่างหน้าตาผลลัพธ์ที่เหมาะให้โปรแกรมอื่นๆเอาข้อมูลไปใช้ต่อ หน้าตา Jupyter Notebook เป็นอย่างนี้ครับ:

ท่านสามารถเปิดดู Notebook ได้ที่  http://nbviewer.jupyter.org/urls/witpoko.com/wp-content/uploads/2018/11/หัดอ่านไฟล์.ipynb หรือจะโหลดไปเล่นเองที่เครื่องก็โหลดจากที่ https://witpoko.com/wp-content/uploads/2018/11/หัดอ่านไฟล์.ipynb นะครับ ถ้าจะเล่นเองต้องมีไฟล์คำศัพท์ภาษาอังกฤษ เช่นถ้ามี macOS ไฟล์ก็จะอยู่ที่ /usr/share/dict/words ถ้าไม่มีก็สามารถไปหาได้ที่ https://github.com/dwyl/english-words/ เป็นต้นครับ

 

วิทย์ม.ต้น: Cognitive Biases สามอัน, ปล่อยลูกบอลกระดาษผ่านอากาศ

วันนี้สำหรับมัธยมต้นพวกเราคุยกันเรื่อง cognitive biases ที่เด็กๆไปอ่านในหนังสือ The Art of Thinking Clearly ในสัปดาห์ที่ผ่านมาครับ คราวนี้เรื่อง Contrast Effect, Availability Bias, The It’ll-Get-Worse-Before-It-Gets-Better Fallacy

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

Availability bias คือเรามักจะคิดว่าสิ่งที่เราคิดถึงได้ง่าย จำได้ง่าย เป็นสิ่งที่มีเยอะ (ไปมากกว่าความเป็นจริง) หรือเราจะพิจารณาทางเลือกที่เราเห็นเท่านั้นไม่ค่อยคิดถึงทางเลือกที่เป็นไปได้อื่นๆ เช่นเราได้ยินข่าวเครื่องบินตกทำให้เราคิดว่าการเดินทางโดยสารการบินไม่ปลอดภัย (ทั้งๆที่ปลอดภัยมาก) หรือเราอ่านข่าวคนถูกรางวัลที่ 1 บ่อยๆ ทำให้เราคิดว่าเราก็น่าจะถูกรางวัลที่ 1 ได้บ้างเหมือนกัน หรือมีคนเสนอข้อเสนอสองสามอย่างมาให้เราตัดสินใจ ทำให้เราเลือกหนึ่งในข้อเสนอนั้นๆทั้งๆที่จริงๆเราอยากได้อย่างอื่นที่ไม่ได้ถูกเสนอมาด้วย

The It’ll-Get-Worse-Before-It-Gets-Better Fallacy คือให้เราระวังคำแนะนำหรือคำทำนายที่คลุมเครือ ตรวจสอบได้ยากว่าถูกต้องหรือผิดพลาด ทำให้เราต้องเสียเวลารอคอยไปเรื่อยๆครับ

ตอนเราคุยกันเรื่อง availability bias ผมเขียนโปรแกรม Python เป็นตัวอย่างให้เด็กๆดูว่าเราจะตรวจสอบได้อย่างไรว่ามีแบบไหนมากกว่าระหว่างคำภาษาอังกฤษที่ขึ้นต้นด้วยตัวอักษร e หรือคำที่ตัวอักษรตัวที่สามคืออักษร e โดยอ่านรายการคำศัพท์ภาษาอังกฤษแล้วนับแสดงผลให้ดูครับ หน้าตาประมาณนี้ สามารถดูตัวเต็มได้ที่ http://nbviewer.jupyter.org/urls/witpoko.com/wp-content/uploads/2018/11/count-words.ipynb หรือโหลดไปเปิดเองที่ https://witpoko.com/wp-content/uploads/2018/11/count-words.ipynb นะครับ:

ทำไว้เป็น Jupyter Notebook ครับ โหลดได้ที่ https://witpoko.com/wp-content/uploads/2018/11/count-words.ipynb นะครับ
ทำไว้เป็น Jupyter Notebook ครับ โหลดได้ที่ https://witpoko.com/wp-content/uploads/2018/11/count-words.ipynb นะครับ
ตัวฟังก์ชั่นเขียนให้เด็กๆอ่านและเข้าใจง่ายๆตรงไปตรงมาครับ
ตัวฟังก์ชั่นเขียนให้เด็กๆอ่านและเข้าใจง่ายๆตรงไปตรงมาครับ

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

เวลาเหลือเราเลยเล่นปล่อยลูกบอลกระดาษขนาดต่างๆกันให้ตกผ่านอากาศลงสู่พื้นครับ ลองดูวิดีโอนะครับ:

วิทย์ม.ต้น: รู้จัก Markdown ใน Jupyter Notebook, วิธีแก้ปัญหาแบบ Brute Force

วันนี้เด็กๆม.ต้นรู้ว่าใน Jupyter Notebook เราสามารถพิมพ์ข้อความ ใส่รูปภาพ ใส่วิดีโอ เพื่ออธิบายว่า notebook ของเราทำอะไรบ้างครับ วิธีทำก็คือไปที่เมนู Cell/Cell Type/Markdown ก็จะทำให้สิ่งที่เราจะพิมพ์เป็นข้อความแบบมีฟอร์แมทต่างๆเช่นตัวหนา ตัวเอียงได้ ไม่จำเป็นต้องเป็นคำสั่งเพื่อการคำนวณในภาษา Python อย่างเดียว

ตัวอย่างการใช้ Markdown ใน Jupyter Notebook ดูได้ในคลิปนี้ครับ ตัวอย่างให้เรามาลองเองอยู่ที่ลิงก์นี้ครับ:

สรุปคำสั่ง Markdown ดูได้ที่ Learn X in Y Minutes (Where X=markdown)  ครับ

สำหรับคนที่หัดใช้ Jupyter Notebook เรียนรู้จาก Jupyter Notebook for Beginners: A Tutorial หรือดูคลิปข้างล่างนี้ได้ครับ:

พอเราใส่คำอธิบายต่างๆด้วย Markdown ได้แล้ว เราสามารถสร้างเอกสารที่รวบรวมเนื้อหาและผลการคำนวณต่างๆไว้ด้วยกัน สามารถส่งให้กันได้ หรือให้คนอื่นเอาไปใช้ได้ง่ายๆครับ ตัวอย่างก็เช่น notebook ที่อาจารย์ Peter Norvig ทำไว้ที่ List of IPython (Jupyter) Notebooks by Peter Norvig สำหรับเด็กๆที่เรียนรู้เรื่องความน่าจะเป็นก็อาจเข้าไปดู A Concrete Introduction to Probability (using Python) เป็นตัวอย่างครับ

 ผมไปเจอวิดีโอสอน Python ที่ใช้ได้อีกอันหนึ่ง ยาว 4 ชั่วโมงกว่าๆ เลยเอามาแนะนำให้เด็กๆรู้จักด้วยครับ เผื่อใครชอบดูคลิปมากกว่าอ่าน:

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

เช่นข้อแรกมีข้อความที่ถูกเข้ารหัสด้วย  Caesar cipher คือตัวอักษรภาษาอังกฤษถูกแทนที่ด้วยตัวอักษรอีกตัวที่ห่างออกไประยะคงที่ เช่นถ้าระยะเท่ากับ 2 ก็จะมีการแทนที่แบบ A => C, B => D, C => E, …, X => Z, Y => A, Z => B เป็นต้น ดังนั้นถ้ามีข้อความเข้ารหัสอ่านไม่ออกแบบนี้ เราก็สามารถทดลองการแทนที่ตัวอักษรกลับ 26 แบบแล้วลองอ่านข้อความที่ได้มาเลยก็ได้ครับ

ตัวอย่างฟังก์ชั่นเข้ารหัสและถอดรหัสแบบ Caesar Cipher
ตัวอย่างฟังก์ชั่นเข้ารหัสและถอดรหัสแบบ Caesar Cipher
เข้ารหัสและถอดรหัสจะได้ข้อความตั้งต้น
เข้ารหัสและถอดรหัสจะได้ข้อความตั้งต้น
เราได้ข้อความที่เข้ารหัสมาอ่านไม่ออก แต่ทดลองถอดรหัสทุกแบบที่เป็นไปได้ แล้วจะพบข้อความที่อ่านออก
เราได้ข้อความที่เข้ารหัสมาอ่านไม่ออก แต่ทดลองถอดรหัสทุกแบบที่เป็นไปได้ แล้วจะพบข้อความที่อ่านออก

อีกข้อคือได้โจทย์ XX + YY + ZZ = XYZ โดยที่ X, Y, และ Z เป็นเลขโดด 0-9 ให้หาค่าของ X, Y, และ Z เราก็สามารถแก้ปัญหาแบบ brute force ได้เพราะแบบที่เป็นไปได้ของ  X, Y, และ Z มีเพียง 1,000 แบบเท่านั้น (X เป็นได้ 10 แบบ คูณกับ Y เป็นได้ 10 แบบ คูณกับ Z เป็นได้ 10 แบบ เท่ากับ 1,000 แบบ) เราเขียนโค้ด Python ง่ายๆแบบนี้ คือให้ค่า X, Y, และ Z  เปลี่ยนไปเรื่อยๆแล้วดูว่าค่าไหนทำให้ XX + YY + ZZ = XYZ ก็พิมพ์ผลออกมา จะได้ว่า X, Y, Z คือ 0, 0, 0 หรือ 1, 9, 8 แต่คำตอบ 0, 0, 0 เป็นคำตอบที่ไม่น่าสนใจ ดังนั้นเราจึงเลือก X, Y, Z = 1, 9, 8 ซึ่งทำให้ 11 + 99 + 88 = 198:

จะได้ว่า X, Y, Z คือ 0, 0, 0 หรือ 1, 9, 8 แต่คำตอบ 0, 0, 0 เป็นคำตอบไม่น่าสนใจ ดังนั้นเราจึงเลือก X, Y, Z  = 1, 9, 8 ซึ่งทำให้ 11 + 99 + 88 = 198
จะได้ว่า X, Y, Z คือ 0, 0, 0 หรือ 1, 9, 8 แต่คำตอบ 0, 0, 0 เป็นคำตอบไม่น่าสนใจ ดังนั้นเราจึงเลือก X, Y, Z = 1, 9, 8 ซึ่งทำให้ 11 + 99 + 88 = 198

ผมบอกเด็กๆว่าเราสามารถเขียนโปรแกรมอย่างนี้สร้างโจทย์ไปหลอกน้องๆได้ ให้ลองไปคิดดู