Lời mở đầu Machine learning đang là xu hướng công nghệ phát triển mạnh và có nhiều bước tiến đột phá, thu hút sự quan tâm của những người trong và ngoài ngành. Cùng với đó Python là ngôn ngữ lập trình được sự dụng rộng rãi trong nghiên cứu, phát triển và ứng dụng Machine Learning. Sự phổ biến đó là nhờ vào các đặc điểm của Python: dễ học và dễ sử dụng, có nhiều thư viện và framework, có nhiều cộng đồng và doanh nghiệp hỗ trợ và tính di động, có thể mở rộng. Với sự phát triển như vậy, việc học ngôn ngữ lập trình Python cũng như nghiên cứu về Machine learning trở nên vô cùng quan trọng.
Với sự hướng dẫn tận tình của PGS. Trịnh Văn Loan, em đã bước đầu tiếp cận với cách sử dụng ngôn ngữ lập trình Python và các kiến thức và giải thuật cơ bản của Machine Learning. Báo cáo này là sự tổng kết quá trình học và nghiên cứu của em trong thời gian vừa qua. Rất mong nhận được sự chỉ bảo, đóng góp của thầy.
Em xin chân thành cảm ơn. Hà Nội, ngày 11 tháng 01 năm 2021 Lê Minh Tú 1. Chuyển mã nguồn C sang Python 1. Nhập vào bán kính hình tròn và in ra chu vi, diện tích.14 r = float(input("Nhap ban kinh hinh tron: ")) c = 2 * r * pi s = r * r * pi print("Chu vi hinh tron la: "+format(c, ".2f")) print("Dien tich hinh tron la: "+format(s, ".2f")) Dễ dàng nhận thấy sự đơn giản của Python, không cần các khai báo hàm main() như C, khai báo class rồi phương thức main() như Java gây sự khó hiểu cho người mới bắt đầu.
Python đơn thuần chỉ cần các câu lệnh vô cùng rõ ràng và dễ hiểu. Điểm đặc biệt nhất là Python không dùng dấu chẩm phẩy cuối câu lệnh mà dùng dấu xuống dòng và không có câu lệnh khai báo biến, biến được tạo ra khi nó được gán một giá trị và tự động ép kiểu theo giá trị mà nó được gán. Ngoài ra một điểm khác nữa giữa Python với các ngôn ngữ lập trình khác: thay vì 2 câu lệnh gồm in ra yêu cầu nhập và một lệnh để đọc dữ liệu nhập vào thì nay chỉ cần một lệnh. Đấy chính là ưu điểm của Python giúp code dễ đọc và dễ hiểu hơn.
Tuy nhiên cần ép kiểu phù hợp vì mặc định dữ liệu đọc vào từ lệnh input() là kiểu xâu, do đó trong trường hợp trên ta cần lồng nó trong hàm ép kiểu float(). Ở câu lệnh in ra, ta cần định dạng hoặc chuyển về dạng xâu với các biến kiểu số. Không như C++ với cout hay Java cộng trực tiếp số với xâu. Ở trên trong lệnh format, ".2f" là in ra số thực với 2 số thập phân sau dấu phẩy.
Một lưu ý nữa với câu lệnh print() trong Python đó là nó sẽ tự động xuống dòng, không như các ngôn ngữ khác thường cần thêm ký hiệu đặc biệt “\n” để thực hiện xuống dòng. Vậy trong trường hợp không muốn xuống dòng ta cần xử lý như thế nào? Các ví dụ sau sẽ minh họa rõ hơn trường hợp này với tham số end trong lệnh print(). Tính diện tích hình thang khi nhập vào 2 đáy và chiều cao print("Nhap 2 canh day hinh thang: ") a = float(input()) b = float(input()) h = float(input("Nhap chieu cao hinh thang: ")) s = h * (a + b) / 2 print("Dien tich hinh thang la:"+format(s, ".2f")) Ta nhập vào kích thước 2 đáy và chiều cao sau đó tính toán diện tích hình thang bằng chiều cao nhân tổng 2 đáy chia 2. In ra bit thứ n của số a a = int(input("Nhap so nguyen duong a: ")) n = int(input("Nhap so nguyen duong n: ")) b = (a & (1 << n)) print("Bit thu "+str(n)+" cua " + str(a)+" la: "+str(b)) Phép toán dịch bit 1<<n thu được số có bit thứ n là 1 còn lại là 0, khi AND a sẽ cho ta bit thứ n của a.
Toán tử str(a) dùng để ép kiểu biến a từ kiểu số nguyên sang kiểu xâu, khi đó mới có thể thực hiên phép cộng xâu để có thể in ra trong lệnh print(). Nhập vào số có 3 chữ số và in ra theo thứ tự ngược lại n = int(input("Nhap so nguyen duong co 3 chu so n: ")) c = n % 10 b = (n // 10) % 10 a = (n // 100) % 10 print("So "+str(n)+" viet theo chieu nguoc lai la: "+str(c) +str(b)+str(a)) Sau khi nhập vào số n. Ta tiến hành tách các chữ số trong n nhập vào, sau đó in chúng ra theo thứ tự ngược lại. Ta hoàn toàn có thể thực hiện với số có số chữ số bất kì: n = int(input("Nhap so nguyen duong n: ")) a = [] temp = n while temp: a.append(temp % 10) temp //= 10 print("So "+str(n)+" viet theo chieu nguoc lai la: ", end="") for i in range(0, len(a)): print(str(a[i]), end="") Trong Python, nếu thực hiện phép chia hai số nguyên bằng toán tử / thì kết quả lại là một số thực thay vì một số nguyên.
Do đó với phép chia lấy phần nguyên, ta cần sử dụng toán tử //. Ở phần mở rộng bài toán, ta có tạo mảng a=[] mà không cần biết trước kiểu dữ liệu của các phần tử là gì. Và để thêm phần tử vào mảng, ta dùng lệnh append(). Nó thể hiện ưu điểm của Python khi cho phép sử dụng mảng tĩnh không cần biết trước số phần tử.
Với cách sử dụng vòng lặp, Python lại không hề sử dụng dấu ngoặc {} để đánh dấu phần câu lệnh trong vòng lặp mà lại sử dụng thụt đầu dòng với ý nghĩa nhóm các câu lệnh liên tiếp thụt vào sẽ là nhóm câu lệnh trong vòng lặp. Với vòng lặp while, sau điều kiện cần có dấu hai chấm : (Python không có do … while). Với vòng lặp for, cú pháp for i in range (start, end, increase) sẽ thay cho for(int i=start; i<end; i+= increase). Tuy nhiên có thể rút gọn thành for i in range (start, end) hoặc for i in range (end) với mặc định rằng start =0 và increase =1.
Mặc định này là phù hợp với đa số trường hợp chúng ta sử dụng vòng lặp for, do đó nó rút gọn code đi rất nhiều. Ở ví dụ này, chúng ta đã thấy cách in ra mà không mặc định xuống dòng bằng các đưa vào tham số end để chỉ ra cách kết thúc câu in ra. Thay vì mặc định end=”\n”, ta in end=”” để kết thúc là rỗng, con trỏ in ra sẽ ở tại ví trị kết thúc câu. Câu tiếp theo in ra sẽ bắt đầu từ đây.
In ra mã ASCII của một ký tự bất kỳ nhập vào c = input("Nhap ky tu c: ") print("Ma ASCII cua ky tu "+c+" la: "+str(ord(c))) Với c nhập vào , ta sử dụng hàm ord(c) trả về mã ASCII của ký tự c. Tuy nhiên tham số của ord() bắt buộc phải là loại ký tự. Nếu nhập vào xâu sẽ sinh ra lỗi. Nhập điểm Toán, Lý, Hóa và in ra điểm trung bình, điểm lớn nhất và nhỏ nhất print("Nhap 3 diem Toan, Ly, Hoa: ") dToan = float(input()) dLy = float(input()) dHoa = float(input()) dTB = (dToan + dLy + dHoa) / 3 dMax = max(dToan, dLy, dHoa) dMin = min(dToan, dLy, dHoa) print("Diem trung binh la: " + format(dTB, ".2f")) print("Diem cao nhat la: "+format(dMax, ".2f")) print("Diem thap nhat la: "+format(dMin, ".2f")) Ta sử dụng 3 biến để lưu điểm Toán, Lý, Hóa nhập vào.
Để tìm giá trị lớn nhất và giá trị nhỏ nhất, ta sử dụng hàm min() và hàm max(). Giải phương trình bậc nhất ax+b=0 print("Nhap he so a va b: ") a = float(input()) b = float(input()) if a == 0: if b == 0: print("Phuong trinh co vo so nghiem.") else: print("Phuong trinh vo nghiem.") else: x = - b / a print("Phuong trinh co nghiem x = "+format(x, ".2f")) Với các tham số a,b ta xác định được phương trình ax + b = 0 cần giải. - Nếu a=0, sẽ xảy ra hai trường hợp: b=0 thì phương trình có vô số nghiệm còn b khác 0, phương trình vô nghiệm. - Nếu a khác 0, phương trình có nghiệm duy nhất x =-b/a.
Để thực hiện xét trường hợp, ta cần sử dụng các lệnh rẽ nhánh. Tương tự với vòng lặp, câu lệnh if … else …của Python không sử dụng dấu ngoặc để đánh dấu các lệnh được thực hiện bên trong nó mà cũng thụt đầu dòng các lệnh. Sau điều kiện ta cũng cần sử dụng dấu hai chấm :. Giải phương trình bậc hai: ax2 + bx + c =0 import math print("Nhap he so a, b va c: ") a = float(input()) b = float(input()) c = float(input()) if a == 0: if b == 0: if c == 0: print("Phuong trinh co vo so nghiem.") else: print("Phuong trinh vo nghiem.") else: x = -c / b print("Phuong trinh co nghiem x = "+format(x, ".2f")) else: delta = b * b - 4 * a * c if delta < 0: print("Phuong trinh vo nghiem.") elif delta == 0: x = -b / (2 * a) print("Phuong trinh co nghiem kep x = "+format(x, ".sqrt(delta)) / (2 * a) print("Phuong trinh co 2 nghiem x1 = "+format(x1, ".6f")) Phương trình 2x2 + 6x – 9 =0 có 2 nghiệm phân biệt Phương trình 4x2 + 6x + 9 =0 vô nghiệm Để giải phương trình ax2 + bx + c =0, ta cần tính biệt thức Δ = b2−4 ac - Với Δ < 0, phương trình vô nghiệm.
−b - Với Δ = 0, phương trình có nghiệm kép x= 2 a - Với Δ > 0, phương trình có 2 nghiệm x1, x2 : −b+√ Δ −b – √ Δ x1 = ; x2 = 2a 2a Ở ví dụ trên, khi ta cần kiểm tra điều kiện nào đó trong lệnh else, thay vì else if(<điều kiện>) như các ngôn ngữ khác, ta lại sử dụng từ khóa elif <điều kiện>. Để thực hiện căn bậc hai, ta cần sử dụng hàm sqrt() trong thư viện math. Trong đó, lệnh import math để khai báo thư viện và math.sqrt() để sử dụng hàm. Kiểm tra 3 số a, b và c có phải 3 cạnh của tam giác, nếu có thì là tam giác gì.
print("Nhap he so a, b va c: ") a = float(input()) b = float(input()) c = float(input()) if (a + b > c) & (a + c > b) & (b + c > a): print("Day la 3 canh cua tam giac.") if (a == b) & (b == c): print("Day la tam giac deu.") elif (a == b) | (b == c) | (a == c): print("Day la tam giac can.") if (a * a + b * b == c * c) | (a * a + c * c == b * b) | (b * b + c * c == a * a): print("Day la tam giac vuong.") else: print("Day khong phai la 3 canh cua tam giac.