Lab 1: Basic Programing
version 001
Authors: Taweesak Samanchuen
สารบัญ
แนะนำ Jupyter Notebook และ Cocalc
การเรียนครั้งนี้ เราจะใช้ Jupyter Notebook เป็นเครื่องมื่อในการศึกษาและทดสอบการทำงานของ Machine Learning เป็นหลัก ซึ่งจะเป็นสภาพแวดล้อมในการเขียนโปรแกรมที่ทำให้ส่วนที่เป็นเนื้อหาและ code อยู่ในพื้นที่เดียวกัน ทำให้สะดวกต่อการเรียนรู้ โดยผู้เรียนสามารถเลือกที่จะติดตั้ง Jupyter Notebook ได้เองหรือจะใช้ผ่าน service ของ Cocalc ที่จะได้จัดเตรียมไว้ให้โดยไม่ต้องติดตั้งโปรแกรมอะไรอีกเลย
ผู้เรียนสามารถเข้าไปทดลองใช้งานใน Cocalc ได้ที่ www.cocalc.com การติดตั้ง Jupyter Notebook บน PC สามารถดูได้จากตอนท้ายของเอกสารนี้ ซึ่งไม่แนะนำสำหรับผู้ยังไม่คุ้นเคยกับติดตั้งโปรแกรมผ่าน Command line
ใน Lab นี้ เราจะได้ทดสอบการเขียนโปรแกรมด้วย octave ซึ่งเป็นภาษาที่ clone มากจาก MATLAB ซึ่งเป็นภาษาที่นิยมใช้กันในทางวิทยาศาสตร์และวิศวกรรม โดยมีความสามารถในการคำนวณและสามารถเขียนโปรแกรมได้ง่าย ทั้งนี้เมื่อผู้เรียนเกิดความคุ้นเคยกับการเขียนโปรแกรมในเบื้องต้นแล้ว เราก็จะได้เรียนรู้ภาษาอื่นที่มีความซับซ้อนขึ้นเช่น python เป็นต้น
หนังสือที่อยากแนะนำให้ศึกษาเพื่อใช้เขียนโปรแกรม MATLAB/Octave คือ https://gla.reru.ac.th/DLP/matlab-book-2nd-ed.pdf
ในการเขียน code แต่ละ statement (1 บรรทัดของ code) หลังจากที่เกิดทำงานตาม code นั้นแล้วก็จะมีการแสดงผลออกมา ซึ่งบางครั้งจะทำให้การทำงานช้าและเกิดความรำคาญในการทำงาน เราสามารถปิดการแสดงของ statement นั้นได้โดยการใช้ semicolon (😉 เช่น
เราจะสังเกตุเห็นว่าหลังจาก run โปรแกรมใน cell ดังกล่าวจะไม่การแสดงค่าอะไรออกมา นอกจากนั้นยังอยากให้สังเกตุว่าการเขียนโปรแกรมจะทำงานจากด้านขวามือของเครื่องหมาย "=" แล้วนำค่าที่ได้ไปใส่ไว้ในตัวแปรทางด้านซ้ายมือของเครื่องหมาย "=" ทุกครั้ง เราไม่สามารถเขียนสลับด้านกันได้ เช่น
หากต้องการนำ a และ b มาบวกกันสามารถทำได้ดังนี้
ให้สังเกตุว่า a + b ในกรณีนี้จะไม่มีเครื่อง "=" ผลจากการ run โปรแกรมนี้จะถูกนำไปเก็บไว้ในตัวแปร ans ซึ่งเป็น default ของ MATLAB/Octave หากต้องการเรียกใช้คำตอบล่าสุดอีกครั้งให้พิมคำว่า ans
ในการเขียนโปรแกรมโดยทั่วไปนั้นตัวพิมพ์เล็กตัวพิมใหญ่จะมีความหมายต่างกัน นั้นคือ a A
หลักการประกาศตัวแปรอย่างง่ายคือ
เข้าใจได้ง่ายและไม่สับสน
ห้ามขึ้นต้นด้วยตัวเลข
ตัวพิมพ์เล็กพิมห์ใหญ่เป็นคนละตัวกัน (Case sensitive) เทคนิคการกำหนดชื่อตัวแปรที่มีหลายคำประกอบกัน ที่นิยมใช้นั้นมีอยู๋ 2 แบบคือ camel case style (เช่น twoWord) และ snake case style (เช่น two_word)
คำตอบ
c = 110
ชนิดของตัวแปรมีความสำคัญในการเขียนโปรแกรม เพราะจะส่งผลกับการใช้งานทั้งเรื่องความถูกต้องและความเร็วการทำงาน เช่นตัวแปร char, string, int, double เป็นต้น การกำหนดชนิดของตัวแปรสามารถทำได้โดยการกำหนดค่าลงไปตรงๆ ได้เลย ไม่ต้องมีการประกาศไว้ก่อนและสามารถเปลียนชนิดของตัวแปรหลังจากที่ใช้งานไปแล้วได้ ทำให้การเขียนโปรแกรมทำได้ง่าย
≈ y = 5
2. Matrices and Arrays
MATLAB เป็นคำย่อของ "matrix laboratory" ในขณะที่ภาษาการเขียนโปรแกรมอื่นๆ ส่วนใหญ่ทำงานกับตัวเลขทีละตัว MATLAB® ได้รับการออกแบบมาเพื่อทำงานบนเมทริกซ์และอาร์เรย์ทั้งหมดเป็นหลัก
ตัวแปร MATLAB/Octave ทั้งหมดเป็นอาร์เรย์หลายมิติไม่ว่าข้อมูลประเภทใด เมทริกซ์คืออาร์เรย์สองมิติที่มักใช้สำหรับพีชคณิตเชิงเส้น
Array Creation
ในการสร้างอาร์เรย์ที่มี 4 องค์ประกอบในแถวเดียวให้แยกองค์ประกอบด้วยเครื่องหมายจุลภาค (,) หรือช่องว่าง
a =
10 20 30 40
ตัว array a จะเก็บค่า ไว้ โดยเราสามารถเข้าถึงแต่ละค่าโดยการเรียกผ่าน index ทีใช้ชี้ตำแหน่งของตัวแปรเช่น ต้องแสดงค่าตัวแรกของ a
Martix Creation
ในการสร้างเมทริกซ์ที่มีหลายแถวให้แยกแถวด้วยอัฒภาค (😉
การเข้าถึงสมาชิกของ matrix ตำแหน่งที่ row 2 และ column 3 เขียนได้ดังนี้
Matrix Operation
นอกจากการสร้าง Matrix ด้วยการกำหนดค่าโดยตรงแล้วนั้น เรายังสามารถสร้าง Matrix พิเศษที่ MATLAB/Octave ได้เตรียมไว้ให้คือ
zeros() ใช้สร้าง Matrix ของค่า 0
ones() ใช้สร้าง Martix ของค่า 1
eye() ใช้สร้าง diagonal martix ของค่า 1
rand() ใช้สร้าง Martix ของค่าซุ่มแบบ Uniform Distribution คือมีค่าอยู่ระหว่าง 0-1 s
randn() ใช้สร้าง Martix ของค่าซุ่มแบบ Normal Distribution
ดังตัวอย่างดังนี้
A =
1 2 3 4
B =
3 4 5 6
C =
10
20
30
40
zeroMaritx =
0 0 0
0 0 0
oneMatrix =
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
eyeMatrix =
Diagonal Matrix
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
randMatrix =
0.903598 0.575410 0.089274 0.324405 0.078481
0.620927 0.789067 0.976726 0.477648 0.811747
0.658674 0.866019 0.827046 0.428741 0.704039
0.651608 0.085414 0.602229 0.363210 0.122686
0.913996 0.423975 0.017505 0.393028 0.382749
gaussRandMatrix =
0.214346 0.666679 0.169518 -0.645566 0.320448 -0.820835
0.449228 1.214467 0.139916 -0.305164 -1.447451 -0.375945
-0.083791 1.414197 0.754434 -1.080073 0.493468 0.543648
-0.487444 -0.251696 1.234996 -0.363373 -1.239648 -0.686153
-0.699558 1.017463 0.020727 0.011218 -0.130480 0.726940
-0.360885 -1.301933 -0.719546 0.835904 1.123440 2.412885
บางครั้งเราต้องการทราบขนาดของ Matrix สามารถใช้คำสั่งได้ดังนี้ size() ก็จะบอก dimension ของ matrix ออกมาเช่น
บางครั้งเราต้องการปรับแต่ขนาดของ matrix สามารถทำได้โดยการใช้คำสั่ง reshape() เช่น
ต่อมาเราจะมาดูเรื่องการ บวก ลบ Matrix กัน เราสามารถทำการ บวก ลบ ได้แบบเดียวกับการ บวก ลบ ค่า scalar ได้คือ
ans =
4 6 8 10
ans =
-2 -2 -2 -2
ส่วนการคูณและหารนั้น จะเป็นการคูณหารแบบ Matrix คือใช้การคูณที่เรียว่า dot product โดยจะคูณได้นั้นะต้องเรื่องของความสอดคล้องของมิติของ Matrix นั้นคือ column ของ martix ตัวแรกจะต้องเท่ากับจำนวน row ของ matrix ตัวที่สองเช่น [reference https://www.mathwarehouse.com/algebra/matrix/multiply-matrix.php]
แบบนี้จะคูณกับไม่ได้เพราะไม่สอดคลองตามเงื่อนไขที่ได้กล่าวไป เพราะ a มี column เป็น 4 ในขณะที่ b มี row 1 ก็จะคูณกันไม่ได้ แต่ถ้าเป็นกรณี จะคูณกันได้เช่น
หากเราต้องการให้สมาชิกของ Matrix คูณกันในตำแหน่งสมาชิกเดียวกันซึ่งจะเรียนว่า Frobenius inner product ดังนี้
ส่วนเรื่องการหาร matrix จะไม่ขอกล่าวถึงในเอกสารนี้ เพราะก็คือการนำ inverse Matrix ของตัวหาร มาคูณด้วยตัวต้้งนั้นเองซึ่งไม่ได้ใช้ในการเรียน ML จึงไม่ขอกล่าวถึงในเอกสารนี้
Transpose Matrix เป็นอีกเรื่องที่มีความสำคัญเนื่องจากจำเป็นต้องใช้ในการเรียนนี้ Transpose คือการสลับ row กับ column ของ Matrix โดยในภาษาคณิตศาสตร์จะใช้เป็น สำหรับการเขียน code ใน Matlab สามารถทำได้ง่ายๆ คือ เช่น
คำตอบ
Z =
ถ้าเราเขียนเป็น Loop จะได้ดังนี้
นอกจากการใช้ for สำหรับการทำ Loop ใน MATLAB/Octave ยังมีรูปแบบอีกเช่น while, do while เช่น
เราสามารถควบคุมเงื่อนไขการทำงานของโปรแกรมได้การใช้เป็น เงื่อนไข (condition statement) เช่นการใช้ if-else ดังนี้
คำตอบที่คาดหวัง
Value of D
D =
1 2 3 4
คำตอบที่คาดหวัง
Value of x
x = 499510
จะเห็นว่าเราสามารถเรียกใช้ฟังก์ชันซ้ำได้ และถ้าหากต้องการแก้ไขข้อผิดพลาดของฟังก์ชันก็สามารถเข้าไปแก้ได้ในฟังก์ชันเพียงที่เดียวเท่านั้น
Expected value
r = 2 ans = 12.566
เราสามารถแสดงกราฟต่างๆ ได้ด้วยการใช้คำสั่ง plot() โดยให้ศึกษาจากตัวอย่างต่อไปนี้
7. การติดตั้งระบบพัฒนา Jupyter Notebook
การติดตั้ง Jupyter Notebook เพื่อใช้งานบนเครื่อง PC
เราสามารถติดตั้ง Jupyter Notebook ให้สามารถทำงานได้บน PC ด้วยหลากหลายวิธี อาทิการติดตั้งด้วยผ่าน Python pip หรือ จะใช้เป็น Anaconda โดยในที่จะใช้เป็น python 3.7.8 ดังนี้
ติดตั้ง python for Window version ตามความเหมาะสม เช่น ver 3.7.8 ตอนติดตั้งต้องอย่าลืม click เลือก add path python ด้วย
หลังจากติดตั้ง Python เสร็จ ต่อไปก็จะเป็นการติดตั้ง Jupyter notebook โดย run คำสั่ง pip install jupyter notebook บน command prompt รอจนกระทั้งติดตั้งเสร็จ ให้รองอ่านดูด้วยว่าการติดตั้งสมบูรณ์หรือไม่ ถ้าไม่มีการแจ้งเตือน error เป็นอันใช้ได้ 2.1 ทดสอบ run Jupyter notebook โดยใช้ kernel ของ python โดยการ run คำสัง Jupyter Notebook 2.2 ถ้าทุกอย่างถูกต้อง browser ก็จะเปิดหน้าของ Jupyter Notebook มาให้ 2.3 ทดลองเขียนโปรแกรมดู โดย kernel ภาษาที่มีในครั้งแรกนี้จะมีเพียง python เท่านั้น
สำหรับภาษาที่ใช้ในการเรียนนี้ เราจะได้เรียนรู้ภาษาในการเขียนโปรแกรมทางด้านวิทยาศาสตร์ที่ง่ายแต่มีประสิทธิภาพคือ MATLAB/Octave โดยจะต้องติดตั้งเพิ่มเติมหลังจากที่ได้ติดตั้ง Jupyter Notebook แล้ว กระบวนการติดตั้งได้สรุปไว้แล้วดังนี้ (ไม่แนะนำสำหรับผู้ที่ไม่มีประสบการณ์ติดตั้งด้วย pip)
การติดตั้ง Octave เพื่อใช้งานบน Jupyter Notebook
ติดตั้ง Octave for window
ติดตั้ง octave_kernel เพื่อให้ใช้ octave ใน jupyter notebook ได้โดย run คำสั่ง pip install octave_kernel https://pypi.org/project/octave-kernel/
ต้อง Add path สำหรับ octave-cli
ถ้าต้องการแก้ไข root directory สำหรับ jupyter notebook ให้ไปแก้ใน cofig ไฟล์ซึ่งจะต้อง run คำสั่ง jupyter notebook --generate-config เพื่อสร้าง config ไฟล์ขึ ้นมา แล้วไปทำการเพิ่ม directory ใน #c.NotebookApp.notebook_dir = '' เป็นอันเรียบร้อย https://medium.com/@jatupornjirundorn/การ-set-default-notebook-directory-สำหรับ-jupyter-notebook-749904d37d46
ถ้าต้องการให้ plot graph ได้ให้ติดตั้ง gnuplot โดยใช้คำสั่ง pip install PyGnuplot
เท่านี้ก็เสร็จแล้ว สามารถใช้งาน Octave บน Jupyter Notebook ได้แล้ว