CoCalc Public Filesassignment1 / Lab1_BasicPrograming.ipynbOpen with one click!
Author: taweesak samanchuen
Views : 38
Compute Environment: Ubuntu 20.04 (Default)

แนะนำ 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

1. กำหนดค่าให้ตัวแปร

เราจะเริ่มต้นการคำนวณอย่างง่ายกันเช่น เราหากต้องการกำหนดค่าให้กับตัวแปร a เป็น 10 เราก็จะกำหนดแบบนี้ a = 10 หลังจากนั้นทำการกด "shift" + "enter" เพื่อ run โปรแกรม

In [ ]:
a = 10

ในการเขียน code แต่ละ statement (1 บรรทัดของ code) หลังจากที่เกิดทำงานตาม code นั้นแล้วก็จะมีการแสดงผลออกมา ซึ่งบางครั้งจะทำให้การทำงานช้าและเกิดความรำคาญในการทำงาน เราสามารถปิดการแสดงของ statement นั้นได้โดยการใช้ semicolon (;) เช่น

In [ ]:
b = 2;

เราจะสังเกตุเห็นว่าหลังจาก run โปรแกรมใน cell ดังกล่าวจะไม่การแสดงค่าอะไรออกมา นอกจากนั้นยังอยากให้สังเกตุว่าการเขียนโปรแกรมจะทำงานจากด้านขวามือของเครื่องหมาย "=" แล้วนำค่าที่ได้ไปใส่ไว้ในตัวแปรทางด้านซ้ายมือของเครื่องหมาย "=" ทุกครั้ง เราไม่สามารถเขียนสลับด้านกันได้ เช่น

In [ ]:
10 = a

หากต้องการนำ a และ b มาบวกกันสามารถทำได้ดังนี้

In [ ]:
a + b

ให้สังเกตุว่า a + b ในกรณีนี้จะไม่มีเครื่อง "=" ผลจากการ run โปรแกรมนี้จะถูกนำไปเก็บไว้ในตัวแปร ans ซึ่งเป็น default ของ MATLAB/Octave หากต้องการเรียกใช้คำตอบล่าสุดอีกครั้งให้พิมคำว่า ans

In [ ]:
ans
In [ ]:
ans + 1

ในการเขียนโปรแกรมโดยทั่วไปนั้นตัวพิมพ์เล็กตัวพิมใหญ่จะมีความหมายต่างกัน นั้นคือ a \neq A
หลักการประกาศตัวแปรอย่างง่ายคือ

  1. เข้าใจได้ง่ายและไม่สับสน
  2. ห้ามขึ้นต้นด้วยตัวเลข
  3. ตัวพิมพ์เล็กพิมห์ใหญ่เป็นคนละตัวกัน (Case sensitive) เทคนิคการกำหนดชื่อตัวแปรที่มีหลายคำประกอบกัน ที่นิยมใช้นั้นมีอยู๋ 2 แบบคือ camel case style (เช่น twoWord) และ snake case style (เช่น two_word)
คำสั่ง: ให้แทนค่า "" ด้วย code ของผู้เรียน
In [ ]:
% ให้แทนค่า "" ด้วยค่าบางอย่างเพื่อให้ได้ C ได้คำตอบเป็น Expected Vaule a = 10; d = ""; % Your code here c = a + d

คำตอบ

c = 110

ชนิดของตัวแปรมีความสำคัญในการเขียนโปรแกรม เพราะจะส่งผลกับการใช้งานทั้งเรื่องความถูกต้องและความเร็วการทำงาน เช่นตัวแปร char, string, int, double เป็นต้น การกำหนดชนิดของตัวแปรสามารถทำได้โดยการกำหนดค่าลงไปตรงๆ ได้เลย ไม่ต้องมีการประกาศไว้ก่อนและสามารถเปลียนชนิดของตัวแปรหลังจากที่ใช้งานไปแล้วได้ ทำให้การเขียนโปรแกรมทำได้ง่าย

In [ ]:
x1 = 'a' x2 = 'word' x3 = 3 + 2i x4 = int16(3) whos

Exercise 1

จงเขียนโปรแกรมเพื่อคำนวณค่า y=aX+by = aX + b กำหนดให้ค่า x=2x = 2, a=1a = 1, b=3b = 3

In [ ]:
x = 2; a = 1; % Your code here, replace "" with your code b = 3; % Your code here, replace "" with your code y = a*x + b % Your code here, replace "" with your code

≈ y = 5

2. Matrices and Arrays

MATLAB เป็นคำย่อของ "matrix laboratory" ในขณะที่ภาษาการเขียนโปรแกรมอื่นๆ ส่วนใหญ่ทำงานกับตัวเลขทีละตัว MATLAB® ได้รับการออกแบบมาเพื่อทำงานบนเมทริกซ์และอาร์เรย์ทั้งหมดเป็นหลัก

ตัวแปร MATLAB/Octave ทั้งหมดเป็นอาร์เรย์หลายมิติไม่ว่าข้อมูลประเภทใด เมทริกซ์คืออาร์เรย์สองมิติที่มักใช้สำหรับพีชคณิตเชิงเส้น

Array Creation

ในการสร้างอาร์เรย์ที่มี 4 องค์ประกอบในแถวเดียวให้แยกองค์ประกอบด้วยเครื่องหมายจุลภาค (,) หรือช่องว่าง

In [5]:
a = [10,20, 30, 40]
a = 10 20 30 40

ตัว array a จะเก็บค่า [10,20,30,40][10, 20 ,30, 40] ไว้ โดยเราสามารถเข้าถึงแต่ละค่าโดยการเรียกผ่าน index ทีใช้ชี้ตำแหน่งของตัวแปรเช่น ต้องแสดงค่าตัวแรกของ a

In [ ]:
a(1)
In [ ]:
a(2)

Martix Creation

ในการสร้างเมทริกซ์ที่มีหลายแถวให้แยกแถวด้วยอัฒภาค (;)

In [ ]:
b = [2,3,5; 1, 1, 3]

การเข้าถึงสมาชิกของ matrix ตำแหน่งที่ row 2 และ column 3 เขียนได้ดังนี้

In [ ]:
b(2,3)

Matrix Operation

นอกจากการสร้าง Matrix ด้วยการกำหนดค่าโดยตรงแล้วนั้น เรายังสามารถสร้าง Matrix พิเศษที่ MATLAB/Octave ได้เตรียมไว้ให้คือ

  1. zeros() ใช้สร้าง Matrix ของค่า 0
  2. ones() ใช้สร้าง Martix ของค่า 1
  3. eye() ใช้สร้าง diagonal martix ของค่า 1
  4. rand() ใช้สร้าง Martix ของค่าซุ่มแบบ Uniform Distribution คือมีค่าอยู่ระหว่าง 0-1 s
  5. randn() ใช้สร้าง Martix ของค่าซุ่มแบบ Normal Distribution

ดังตัวอย่างดังนี้

In [3]:
% create/initialize matrices zeros(), ones(), eye(), rand(), randn() % create matrix A = [1 2 3 4] B = [3 4 5 6] C = [10;20;30;40] zeroMaritx = zeros(2,3) oneMatrix = ones(4) eyeMatrix = eye(4) randMatrix = rand(5) gaussRandMatrix = randn(6)
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 ออกมาเช่น

In [ ]:
size(A)

บางครั้งเราต้องการปรับแต่ขนาดของ matrix สามารถทำได้โดยการใช้คำสั่ง reshape() เช่น

In [ ]:
reshape(A, 2,2)

ต่อมาเราจะมาดูเรื่องการ บวก ลบ Matrix กัน เราสามารถทำการ บวก ลบ ได้แบบเดียวกับการ บวก ลบ ค่า scalar ได้คือ

In [4]:
A + B A - B
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]

In [ ]:
A * B

แบบนี้จะคูณกับไม่ได้เพราะไม่สอดคลองตามเงื่อนไขที่ได้กล่าวไป เพราะ a มี column เป็น 4 ในขณะที่ b มี row 1 ก็จะคูณกันไม่ได้ แต่ถ้าเป็นกรณี aca*c จะคูณกันได้เช่น

In [ ]:
A*C

หากเราต้องการให้สมาชิกของ Matrix คูณกันในตำแหน่งสมาชิกเดียวกันซึ่งจะเรียนว่า Frobenius inner product ดังนี้

In [ ]:
A.*B

ส่วนเรื่องการหาร matrix จะไม่ขอกล่าวถึงในเอกสารนี้ เพราะก็คือการนำ inverse Matrix ของตัวหาร มาคูณด้วยตัวต้้งนั้นเองซึ่งไม่ได้ใช้ในการเรียน ML จึงไม่ขอกล่าวถึงในเอกสารนี้

Transpose Matrix เป็นอีกเรื่องที่มีความสำคัญเนื่องจากจำเป็นต้องใช้ในการเรียนนี้ Transpose คือการสลับ row กับ column ของ Matrix โดยในภาษาคณิตศาสตร์จะใช้เป็น ATA^T สำหรับการเขียน code ใน Matlab สามารถทำได้ง่ายๆ คือ AA' เช่น

In [ ]:
disp('Martix A') A disp('Transpose Martix A') A'

Exercise 2

กำหนดให้ X=(2355325410)X = \left( \begin{matrix} 2 & 3 & 5 \\ 5 & 3 & 2 \\ 5 & 4 & 10 \end{matrix} \right) Y=(0.50.80.60.850.20.4)Y = \left( \begin{matrix} 0.5 & 0.8 & 0.6 \\ 0.85 & 0.2 & 0.4 \end{matrix} \right) จงเขียน Code เพื่อคำนวนหาค่า Z=XYZ = X*Y'

In [ ]:
X = [2 3 5; 5 3 2; 5 4 10]; Y = ""; % Your code here, replace "" with your code Z = "" % Your code here, replace "" with your code

คำตอบ

Z =

6.4000    4.3000
6.1000    5.6500 
11.7000    9.0500

3. Control Statement

Loop คือการที่เราให้โปรแกรมทำซ้ำสิ่งได้สิ่งหนึ่ง โดยแทนที่เราเขียน code ซ้ำหลายๆ ครั้ง เช่นเราต้องให้เกิดการแสดงผลของค่า 5 ครั้ง เราสามารถเขียนเป็น code แบบธรรมดาได้เป็น

In [ ]:
a = 10; disp(a); disp(a); disp(a); disp(a); disp(a);

ถ้าเราเขียนเป็น Loop จะได้ดังนี้

In [ ]:
a = 10; for i = 1:5 disp(a); end

นอกจากการใช้ for สำหรับการทำ Loop ใน MATLAB/Octave ยังมีรูปแบบอีกเช่น while, do while เช่น

In [ ]:
%% while loop i = 0; while i < 10 a = 10 + i i = i + 1 end

เราสามารถควบคุมเงื่อนไขการทำงานของโปรแกรมได้การใช้เป็น เงื่อนไข (condition statement) เช่นการใช้ if-else ดังนี้

In [ ]:
%% if-else if i > 10 fprintf('i > 10\n') else fprintf('i <= 10\n') end

Exercise 3.1

จงปรับแก้โปรแกรมด้านล่างต่อไปนี้เพื่อให้แสดงค่าสมาชิก A ตั้งแต่แรกถึงตัวที่ 4

In [ ]:
A=[1 2 3 4 5 6 7]; D = []; loopNumber = ""; % Your code here, replace "" with your code for i=1:loopNumber D(i) = A(i); end disp('Value of D') D

คำตอบที่คาดหวัง

Value of D
D =

1 2 3 4

Exercise 3.2

จงเขียนโปรแกรม x=45+46+....+1000x = 45+ 46+....+1000

In [ ]:
A=[45:1000]; loopNumber = ""; % Your code here, replace "" with your code x = 0; for i=1:loopNumber x = x + A(i); end disp('Value of x') x

คำตอบที่คาดหวัง

Value of x
x = 499510

4. Function

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

In [ ]:
function z = testfunc(x, y) z = x + y ; end
In [ ]:
a = [1,2,3]; b = [10,20,30]; c = [100,2,300]; testfunc(a,b) testfunc(a,c)

จะเห็นว่าเราสามารถเรียกใช้ฟังก์ชันซ้ำได้ และถ้าหากต้องการแก้ไขข้อผิดพลาดของฟังก์ชันก็สามารถเข้าไปแก้ได้ในฟังก์ชันเพียงที่เดียวเท่านั้น

Exercise 4

จงเขียนแก้ฟังก์ชันด้านล่างนี้ซึ่งเป็นสูตรการคำนวนพื้นที่วงกลม πr2\pi r^2

Hint

"pi" in Matlab is defined as 3.1415
"^" is power operation

In [ ]:
function A = circleArea(r) A = ""; % your code here end
In [ ]:
r = 2 circleArea(r)

Expected value

r = 2 ans = 12.566

5. Plot Graph

เราสามารถแสดงกราฟต่างๆ ได้ด้วยการใช้คำสั่ง plot() โดยให้ศึกษาจากตัวอย่างต่อไปนี้

In [ ]:
x = 1:100; % create x = 1, 2, ... 100; y = sin(2*pi*x/20); plot(x,y);
In [ ]:
x = -10:0.1:10; plot (x, sin (x)); xlabel ('x'); ylabel ("sin (x)"); title ("Simple 2-D Plot");
In [ ]:
t = -5:0.1:5; x = 2 - (t - 4).^2 .* (t + 3).^3; plot (t, x)
In [ ]:
tx = ty = linspace (-8, 8, 41)'; [xx, yy] = meshgrid (tx, ty); r = sqrt (xx .^ 2 + yy .^ 2) + eps; tz = sin (r) ./ r; mesh (tx, ty, tz); xlabel ("tx"); ylabel ("ty"); zlabel ("tz"); title ("3-D Sombrero plot");

Exercise 5

จงเขียนโปรแกรมเพื่อ plot กราฟของสมการ y=x21y = x^2 -1

In [ ]:
x = -10:0.2:10; y = x.^2 -1; plot(""); % your code here

6. Special Cell Design

เราสามารถใช้ตัวอย่างด้านล่างเพื่อกำหนดสีสันของแต่ละ Cell เพื่อใช่ช่วยแบบประเภทของ cell ทำให้การใช้งาน jupyter notebook น่าอ่านขึ้น

Example: Use yellow boxes for examples that are not inside code cells, or use for mathematical formulas if needed.
Up to you: Use green boxes sparingly, and only for some specific purpose that the other boxes can't cover. For example, if you have a lot of related content to link to, maybe you decide to use green boxes for related links from each section of a notebook.
Just don't: In general, avoid the red boxes. These should only be used for actions that might cause data loss or another major issue.
คำสั่ง: ให้แทนค่า "" ด้วย code ของผู้เรียน

7. การติดตั้งระบบพัฒนา Jupyter Notebook

การติดตั้ง Jupyter Notebook เพื่อใช้งานบนเครื่อง PC

เราสามารถติดตั้ง Jupyter Notebook ให้สามารถทำงานได้บน PC ด้วยหลากหลายวิธี อาทิการติดตั้งด้วยผ่าน Python pip หรือ จะใช้เป็น Anaconda โดยในที่จะใช้เป็น python 3.7.8 ดังนี้

  1. ติดตั้ง python for Window version ตามความเหมาะสม เช่น ver 3.7.8 ตอนติดตั้งต้องอย่าลืม click เลือก add path python ด้วย
  2. หลังจากติดตั้ง 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

  1. ติดตั้ง Octave for window
  2. ติดตั้ง octave_kernel เพื่อให้ใช้ octave ใน jupyter notebook ได้โดย run คำสั่ง pip install octave_kernel https://pypi.org/project/octave-kernel/
  3. ต้อง Add path สำหรับ octave-cli
  4. ถ้าต้องการแก้ไข 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
  5. ถ้าต้องการให้ plot graph ได้ให้ติดตั้ง gnuplot โดยใช้คำสั่ง pip install PyGnuplot

เท่านี้ก็เสร็จแล้ว สามารถใช้งาน Octave บน Jupyter Notebook ได้แล้ว

In [ ]: