version 001
Authors: Taweesak Samanchuen
การเรียนครั้งนี้ เราจะใช้ 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
a = 10
ในการเขียน code แต่ละ statement (1 บรรทัดของ code) หลังจากที่เกิดทำงานตาม code นั้นแล้วก็จะมีการแสดงผลออกมา ซึ่งบางครั้งจะทำให้การทำงานช้าและเกิดความรำคาญในการทำงาน เราสามารถปิดการแสดงของ statement นั้นได้โดยการใช้ semicolon (;) เช่น
b = 2;
เราจะสังเกตุเห็นว่าหลังจาก run โปรแกรมใน cell ดังกล่าวจะไม่การแสดงค่าอะไรออกมา นอกจากนั้นยังอยากให้สังเกตุว่าการเขียนโปรแกรมจะทำงานจากด้านขวามือของเครื่องหมาย "=" แล้วนำค่าที่ได้ไปใส่ไว้ในตัวแปรทางด้านซ้ายมือของเครื่องหมาย "=" ทุกครั้ง เราไม่สามารถเขียนสลับด้านกันได้ เช่น
10 = a
หากต้องการนำ a และ b มาบวกกันสามารถทำได้ดังนี้
a + b
ให้สังเกตุว่า a + b ในกรณีนี้จะไม่มีเครื่อง "=" ผลจากการ run โปรแกรมนี้จะถูกนำไปเก็บไว้ในตัวแปร ans ซึ่งเป็น default ของ MATLAB/Octave หากต้องการเรียกใช้คำตอบล่าสุดอีกครั้งให้พิมคำว่า ans
ans
ans + 1
ในการเขียนโปรแกรมโดยทั่วไปนั้นตัวพิมพ์เล็กตัวพิมใหญ่จะมีความหมายต่างกัน นั้นคือ a = A
หลักการประกาศตัวแปรอย่างง่ายคือ
% ให้แทนค่า "" ด้วยค่าบางอย่างเพื่อให้ได้ C ได้คำตอบเป็น Expected Vaule a = 10; d = ""; % Your code here c = a + d
c = 110
ชนิดของตัวแปรมีความสำคัญในการเขียนโปรแกรม เพราะจะส่งผลกับการใช้งานทั้งเรื่องความถูกต้องและความเร็วการทำงาน เช่นตัวแปร char, string, int, double เป็นต้น การกำหนดชนิดของตัวแปรสามารถทำได้โดยการกำหนดค่าลงไปตรงๆ ได้เลย ไม่ต้องมีการประกาศไว้ก่อนและสามารถเปลียนชนิดของตัวแปรหลังจากที่ใช้งานไปแล้วได้ ทำให้การเขียนโปรแกรมทำได้ง่าย
x1 = 'a' x2 = 'word' x3 = 3 + 2i x4 = int16(3) whos
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
MATLAB เป็นคำย่อของ "matrix laboratory" ในขณะที่ภาษาการเขียนโปรแกรมอื่นๆ ส่วนใหญ่ทำงานกับตัวเลขทีละตัว MATLAB® ได้รับการออกแบบมาเพื่อทำงานบนเมทริกซ์และอาร์เรย์ทั้งหมดเป็นหลัก
ตัวแปร MATLAB/Octave ทั้งหมดเป็นอาร์เรย์หลายมิติไม่ว่าข้อมูลประเภทใด เมทริกซ์คืออาร์เรย์สองมิติที่มักใช้สำหรับพีชคณิตเชิงเส้น
ในการสร้างอาร์เรย์ที่มี 4 องค์ประกอบในแถวเดียวให้แยกองค์ประกอบด้วยเครื่องหมายจุลภาค (,) หรือช่องว่าง
a = [10,20, 30, 40]
a =
10 20 30 40
ตัว array a จะเก็บค่า [10,20,30,40] ไว้ โดยเราสามารถเข้าถึงแต่ละค่าโดยการเรียกผ่าน index ทีใช้ชี้ตำแหน่งของตัวแปรเช่น ต้องแสดงค่าตัวแรกของ a
a(1)
a(2)
ในการสร้างเมทริกซ์ที่มีหลายแถวให้แยกแถวด้วยอัฒภาค (;)
b = [2,3,5; 1, 1, 3]
การเข้าถึงสมาชิกของ matrix ตำแหน่งที่ row 2 และ column 3 เขียนได้ดังนี้
b(2,3)
นอกจากการสร้าง Matrix ด้วยการกำหนดค่าโดยตรงแล้วนั้น เรายังสามารถสร้าง Matrix พิเศษที่ MATLAB/Octave ได้เตรียมไว้ให้คือ
ดังตัวอย่างดังนี้
% 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 ออกมาเช่น
size(A)
บางครั้งเราต้องการปรับแต่ขนาดของ matrix สามารถทำได้โดยการใช้คำสั่ง reshape() เช่น
reshape(A, 2,2)
ต่อมาเราจะมาดูเรื่องการ บวก ลบ Matrix กัน เราสามารถทำการ บวก ลบ ได้แบบเดียวกับการ บวก ลบ ค่า scalar ได้คือ
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]
A * B
แบบนี้จะคูณกับไม่ได้เพราะไม่สอดคลองตามเงื่อนไขที่ได้กล่าวไป เพราะ a มี column เป็น 4 ในขณะที่ b มี row 1 ก็จะคูณกันไม่ได้ แต่ถ้าเป็นกรณี a∗c จะคูณกันได้เช่น
A*C
หากเราต้องการให้สมาชิกของ Matrix คูณกันในตำแหน่งสมาชิกเดียวกันซึ่งจะเรียนว่า Frobenius inner product ดังนี้
A.*B
ส่วนเรื่องการหาร matrix จะไม่ขอกล่าวถึงในเอกสารนี้ เพราะก็คือการนำ inverse Matrix ของตัวหาร มาคูณด้วยตัวต้้งนั้นเองซึ่งไม่ได้ใช้ในการเรียน ML จึงไม่ขอกล่าวถึงในเอกสารนี้
Transpose Matrix เป็นอีกเรื่องที่มีความสำคัญเนื่องจากจำเป็นต้องใช้ในการเรียนนี้ Transpose คือการสลับ row กับ column ของ Matrix โดยในภาษาคณิตศาสตร์จะใช้เป็น AT สำหรับการเขียน code ใน Matlab สามารถทำได้ง่ายๆ คือ A′ เช่น
disp('Martix A') A disp('Transpose Martix A') A'
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
a = 10; disp(a); disp(a); disp(a); disp(a); disp(a);
ถ้าเราเขียนเป็น Loop จะได้ดังนี้
a = 10; for i = 1:5 disp(a); end
นอกจากการใช้ for สำหรับการทำ Loop ใน MATLAB/Octave ยังมีรูปแบบอีกเช่น while, do while เช่น
%% while loop i = 0; while i < 10 a = 10 + i i = i + 1 end
เราสามารถควบคุมเงื่อนไขการทำงานของโปรแกรมได้การใช้เป็น เงื่อนไข (condition statement) เช่นการใช้ if-else ดังนี้
%% if-else if i > 10 fprintf('i > 10\n') else fprintf('i <= 10\n') end
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
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
function z = testfunc(x, y) z = x + y ; end
a = [1,2,3]; b = [10,20,30]; c = [100,2,300]; testfunc(a,b) testfunc(a,c)
จะเห็นว่าเราสามารถเรียกใช้ฟังก์ชันซ้ำได้ และถ้าหากต้องการแก้ไขข้อผิดพลาดของฟังก์ชันก็สามารถเข้าไปแก้ได้ในฟังก์ชันเพียงที่เดียวเท่านั้น
function A = circleArea(r) A = ""; % your code here end
r = 2 circleArea(r)
r = 2 ans = 12.566
เราสามารถแสดงกราฟต่างๆ ได้ด้วยการใช้คำสั่ง plot() โดยให้ศึกษาจากตัวอย่างต่อไปนี้
x = 1:100; % create x = 1, 2, ... 100; y = sin(2*pi*x/20); plot(x,y);
x = -10:0.1:10; plot (x, sin (x)); xlabel ('x'); ylabel ("sin (x)"); title ("Simple 2-D Plot");
t = -5:0.1:5; x = 2 - (t - 4).^2 .* (t + 3).^3; plot (t, x)
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");
x = -10:0.2:10; y = x.^2 -1; plot(""); % your code here
เราสามารถติดตั้ง Jupyter Notebook ให้สามารถทำงานได้บน PC ด้วยหลากหลายวิธี อาทิการติดตั้งด้วยผ่าน Python pip หรือ จะใช้เป็น Anaconda โดยในที่จะใช้เป็น python 3.7.8 ดังนี้
สำหรับภาษาที่ใช้ในการเรียนนี้ เราจะได้เรียนรู้ภาษาในการเขียนโปรแกรมทางด้านวิทยาศาสตร์ที่ง่ายแต่มีประสิทธิภาพคือ MATLAB/Octave โดยจะต้องติดตั้งเพิ่มเติมหลังจากที่ได้ติดตั้ง Jupyter Notebook แล้ว กระบวนการติดตั้งได้สรุปไว้แล้วดังนี้ (ไม่แนะนำสำหรับผู้ที่ไม่มีประสบการณ์ติดตั้งด้วย pip)
เท่านี้ก็เสร็จแล้ว สามารถใช้งาน Octave บน Jupyter Notebook ได้แล้ว