Hướng dẫn element trong python
Trụ sở chính: Show
Nội dung chính
Văn phòng: Số 27-3RD, Sunrise D, The Manor Central Park, đường Nguyễn Xiển, phường Đại Kim, quận Hoàng Mai, TP. Hà Nội. Liên hệ truyền thông: 0929.536.185 Email: [email protected] Chịu trách nhiệm nội dung: Ông Trần Anh Tú TEK4.VN giữ bản quyền nội dung trên website này. Cấm sao chép dưới mọi hình thức nếu không có sự chấp thuận bằng văn bản. Tất cả các bài tập trong bài viết này có thể được thực hiện trực tiếp trên trình duyện qua trang web FundaML
0. Giới thiệu về NumpyMặc dù các bài học trong khoá này có thể được thực hiện trực tiếp trên trình duyệt, tôi vẫn khuyến khích các bạn cài đặt Python và Numpy vào trong máy tính cá nhân để việc lập trình được thuận tiện hơn. Tôi giả sử các bạn đã từng sử dụng Python và có kiến thức cơ bản về Python. Nếu bạn chưa học Python bao giờ, dưới đây là một vài khoá học và trang web mà tôi thấy có chất lượng tốt:
Chú ý rằng phiên bản Python được sử dụng ở đây là Python 3. 0.1. Cài đặt NumpyNumpy là một thư viện của Python hỗ trợ cho việc tính toán các mảng nhiều chiều, có kích thước lớn với các hàm số đã được tối ưu áp dụng lên các mảng nhiều chiều đó. Numpy đặc biệt hữu ích khi thực hiện các hàm số liên quan tới Đại Số Tuyến Tính. Bạn đọc có thể tham khảo tài liệu về numpy. Để cài đặt Numpy và các thư viện thường dùng trong Machine Learning, bạn có thể tham khảo các bài hướng dẫn bằng Tiếng Việt dưới đây:
Sau khi cài đặt xong, trong Python, chúng ta cần khai báo: để có thể bắt đầu sử dụng các hàm số của numpy. Vì numpy là thư viện được sử dụng thường xuyên nên nó thường được khai báo gọn lại thành
Có một điểm đặc biệt cần lưu ý: biến numpy là các biến mutable. Bạn cần phân biệt rõ biến mutable và immutable trong Python. Tiếp theo, chúng ta sẽ làm quen với cách sử dụng numpy từ đơn giản tới ít đơn giản hơn. Các bạn có thể di chuyển giữa các bài học thông qua nút “Lesson Outline” và hai nút điều hướng ở đầu trang FundaML. 1.1 Khởi tạo mảng 1 chiều1.1.1. Khai báo vectorTrong Numpy, vector được hiểu là một mảng 1 chiều. Ví dụ: để có một vector
Chúng ta ngầm hiểu rằng thư viện numpy đã được khai báo bởi: Các dòng không bắt đầu với Xin nhắc lại, Numpy không quy ước vector hàng hay vector cột mà chỉ coi một vector là một mảng một chiều. Nếu bạn thực sự muốn có một vector cột, bạn cần phải coi nó là một ma trận có số chiều thứ hai bằng 1, và khi đó phải khai báo với numpy rằng đó là một mảng hai chiều. Chúng ta sẽ quay lại vấn đề này trong bài Ma trận. Để hiểu thêm về hàm Cú pháp
1.2. Kiểu dữ liệu của mảng1.2.1. Kiểu dữ liệuNếu khai báo:
ta sẽ thấy các thành phần của
Ta cũng có thể ép kiểu, ví dụ kiểu dữ liệu thực
Phần này không có bài tập. 1.3. Khởi tạo các mảng một chiều đặc biệt1.3.1. Mảng toàn giá trị 0 hoặc 1Vector \(\mathbf{0}\) là một vector đặc biệt được dùng rất thường xuyên để khởi tạo. Để tạo một vector \(\mathbf{0}\) có số phần tử là
Tương tự như thế, với mảng toàn giá trị 1, ta sẽ dùng hàm
Ngoài ra, numpy còn cung cấp hai hàm đặc biệt
1.3.2. Cấp số cộngĐể tạo mảng các số nguyên từ
Để tạo mảng các số nguyên từ
Để tạo một cấp số cộng với phần tử đầu là
Nếu
Bài tập 1: Xây dựng mảng các luỹ thừa của 2 nhỏ hơn 1025, bao gồm cả Bài tập 2: Xây dựng mảng gồm 10 phần tử, trong đó 9 phần tử đầu bằng 3, phần tử cuối cùng bằng 1.5. 1.4. Truy cập mảng một chiều1.4.1. Kích thước của mảngKích thước của một mảng numpy
Kết quả trả về là một tuple. Nếu Để lấy giá trị 1.4.2. Chỉ sốMỗi thành phần trong mảng 1 chiều tương ứng với một chỉ số. Chỉ số trong numpy, cũng giống như chỉ số trong python, bắt đầu bằng 0. Nếu mảng 1 chiều có 1.4.3. Đọc từng phần tử của vectorGiả sử:
thì thành phần đầu tiên (bằng Các thành phần tiếp theo được truy cập bằng 1.4.4. Chỉ số ngượcTrong Python có một điểm đặc biệt là Chỉ số ngược. Cho một mảng 1 chiều
Tương tự như thế, phần từ thứ hai
từ cuối sẽ được truy cập bằng chỉ số Chú ý: Nếu một mảng một chiều 1.4.5. Thay đổi giá trị một phần tử của mảngĐể thay giá trị một phần tử của mảng, ta dùng câu lệnh đơn giản:
Bài
tập: Thay toàn bộ các phần tử của mảng bằng trung bình cộng các phần tử trong mảng đó, sử dụng vòng 1.5. Truy cập nhiều phần tử của mảng một chiềuĐể truy cập nhiều phần tử của một mảng một chiều một lúc, chúng ta có nhiều cách khác nhau: 1.5.1. ĐọcVí dụ:
Trong ví dụ này,
Ngoài ra, cách đánh chỉ số của mảng
1.5.2. GhiTa cũng có thể thay đổi giá trị của nhiều phần tử trong mảng. Ví dụ:
1.5.3. Đọc thêmNumpy Indexing and Slicing Bài tập: Cho trước một số tự nhiên Ví dụ: Với 1.6. Tính toán giữa các mảng một chiều và số vô hướng1.6.1. Phép toán giữa mảng một chiều với một số vô hướng.Để cộng/trừ/nhân/chia/luỹ thừa mọi phần tử một mảng 1 chiều
Chú ý rằng về mặt toán học, không có phép chia cho vector. Tuy nhiên, trong Python, ta vẫn hiểu phép chia một số cho một mảng sẽ tương đương với lấy số đó chia cho từng phần tử trong mảng. 1.6.2. Phép toán giữa hai mảng một chiềuĐể có thể tính toán được hai mảng một chiều, số phần tử của
hai mảng phải như nhau. Kết quả cũng là một mảng một chiều cùng chiều với hai mảng đó. Các phép toán
1.6.3. Các hàm toán họcCác hàm toán học trong numpy như:
Hàm Bài tập: Cho một mảng 1 chiều 1.7. Norm 1Norm 1 của một vector \(\mathbf{x} \in \mathbb{R}^d\), kỹ hiệu là \(||\mathbf{x}||_1\), được định nghĩa tổng trị tuyệt đối các phần tử của vector đó: \[ ||\mathbf{x}||_1 = |x_0| + |x_1| + \dots + |x_{d-1}| = \sum_{i = 0}^{d-1} |x_i | \] Bài tập: Viết hàm số tính tổng trị tuyệt đối các phần tử của một mảng một chiều. (Gợi ý: 1.8. Hàm Softmax cho mảng một chiềuSoftmax Regression là một trong số những thuật toán được sử dụng nhiều nhất trong các bài toán Classification. Khi triển khai mô hình này, chúng ta cần lập trình hàm softmax. Cho một vector \(\mathbf{z} \in \mathbb{R}^d\). Hàm softmax khi áp dụng lên vector \(\mathbf{z}\) sẽ tạo ra một vector \(\mathbf{a}\) cùng chiều với \(\mathbf{z}\) và phần tử thứ \(i\) (tính từ 0) của nó được xác định bởi: \[ a_i = \frac{\exp(z_i)}{\sum_{j=0}^{d-1} \exp(z_j)} \] với: \[ \exp(u) = e^u \] Bạn đọc có thể chứng minh được các phần tử của \(\mathbf{a}\) đều nằm trong khoảng \((0, 1)\) và có tổng bằng 1. Vì vậy, vector \(\mathbf{a}\) còn được coi là vector xác suất, mỗi phần tử ứng với xác suất của một điểm dữ liệu thuộc vào một class nào đó. Bài tập: Hãy lập trình hàm softmax. Gợi ý: Sử dụng hàm 1.9. Tích vô hướng của hai vectors - Norm 2Tích vô hướng (inner product) của hai vectors
Trong numpy, còn hai cách khác để tính tích vô hướng:
Bài tập: Tính norm 2 của một vector - vector này được biểu diễn dưới dạng mảng numpy một chiều. Norm 2 của một vector \(\mathbf{x}\), được ký hiệu là \(||\mathbf{x}||_2\), được định nghĩa là căn bậc hai của tổng bình phương các phần tử của nó. \[ ||\mathbf{x}||_2 = \sqrt{x_0^2 + x_1^2 + \dots + x_{d-1}^2} \] trong đó: \(x_1, \dots, x_{d-1}\) là các phần tử của vector \(\mathbf{x} \in \mathbb{R}^d\). Norm 2 được sử dụng rất nhiều trong Machine Learning. Có một hàm khác giúp trực tiếp tính norm, chúng ta sẽ tìm hiểu sau. Tìm hiểu thêm: Norm của vector và ma trận 1.10. min, max, armin, argmax của mảng một chiều1.10.1. min, maxĐể tìm giá trị lớn nhất hay nhỏ nhất của mảng một chiều, chúng ta đơn giản sử dụng hàm
hoặc:
1.10.2. argmin, argmaxĐể tìm chỉ số mà tại đó mảng một chiều đạt giá trị nhỏ nhất
hay lớn nhất, ta có thể sử dụng
hoặc:
Bài tập: Trong bài toán classification, sử dụng Softmax Regression, giả sử ta đã tính được xác suất để một điểm dữ liệu thuộc vào mỗi class. Các xác suất này được lưu dưới dạng một mảng một chiều mà phần tử thứ Chú ý: Mảng chứa xác suất này thường được tính bằng cách áp dụng hàm softmax vào score vector. Hàm softmax giữ nguyên thứ tự của vector đầu vào, vì vậy chỉ số của lớp có xác suất cao nhất cũng là chỉ số của lớp có score cao nhất. (Mời bạn đọc thêm bài Softmax Regression để biết thêm chi tiết). Softmax II - Phiên bản ổn địnhNhắc lại công thức tính softmax của một vector \(\mathbf{z} \in \mathbb{R}^C\) (ở đây \(C\) là số lượng lớp trong bài toán phân lớp): \[ a_i = \frac{\exp(z_i)}{\sum_{j=0}^{C-1} \exp(z_j)}, ~~ \forall i = 0, 1, \dots, C-1\] (Xem lại Hàm Softmax cho mảng một chiều.) Khi một trong các \(z_i\) quá lớn, việc tính toán \(\exp(z_i)\) có thể gây ra hiện tượng tràn số (overflow), ảnh hưởng lớn tới kết quả của hàm softmax. Có một cách khắc phục hiện tượng này bằng cách dựa trên quan sát sau: \[ \begin{eqnarray} \frac{\exp(z_i)}{\sum_{j=0}^{C-1} \exp(z_j)} = \frac{\exp(-b)\exp(z_i)}{\exp(-b)\sum_{j=0}^{C-1} \exp(z_j)} = \frac{\exp(z_i-b)}{\sum_{j=0}^{C-1} \exp(z_j-b)} \end{eqnarray} \] với \(b\) là một hằng số bất kỳ. Vậy một phương pháp đơn giản giúp khắc phục hiện tượng overflow là trừ tất cả các \(z_i\) đi một giá trị đủ lớn. Trong thực nghiệm, giá trị đủ lớn này thường được chọn là \(c = \max_i z_i\), tức giá trị lớn nhất của \(z_i\). Vậy chúng ta có thể viết lại hàm Đọc thêm Softmax Regression. Bài tập: Dựa vào công thức phía trên, hay viết hàm Sau khi đã ‘Nộp bài’ và nhận được kết quả chính xác, bạn hãy thử làm một thí nghiệm nhỏ dưới đây:
Nói cách khác, hàm Chú ý: Bạn có thể nhìn thấy thông báo ‘Kết quả không chính xác’, đừng quan tâm. Đây là câu trả về khi đáp án của bạn khác với đáp án
ban đầu, tức khi Nếu có câu hỏi, Bạn có thể để lại comment bên dưới hoặc trên Forum để nhận được câu trả lời sớm hơn. |