Feature normalize và Gradient Descent cho multivariate problem
Machine Learning cơ bản với NumPy

Danh sách bài học
Feature normalize và Gradient Descent cho multivariate problem
Nội dung bài viết Học nhanh
Dẫn nhập
Trong bài trước, chúng ta đã tìm hiểu về THUẬT TOÁN GRADIENT DESCENT CHO LINEAR REGRESSION.
Ở bài này Kteam sẽ giới thiệu đến các bạn Feature Normalize và Gradient Descent cho multivariate problem.
Nội dung
Để theo dõi bài này tốt nhất bạn cần có kiến thức về:
- LẬP TRÌNH PYTHON CƠ BẢN
- GIỚI THIỆU MACHINE LEARNING VÀ CÀI ĐẶT NUMPY
- MA TRẬN VÀ VECTOR VỚI NUMPY
- LINEAR REGRESSION VÀ HÀM hθ(x) CHO LINEAR REGRESSION.
- THUẬT TOÁN GRADIENT DESCENT CHO LINEAR REGRESSION
Trong bài này chúng ta sẽ cùng tìm hiểu về:
- Vì sao phải Feature Normalize?
- Công thức Feature Normalize.
- Ứng dụng Feature Normalize vào multivariate problem.
Vì sao phải Feature Normalize ?
Thuật toán Gradient Descent sẽ chạy nhanh hơn với những vùng dữ liệu nhỏ.
Ví dụ:
Với việc dự đoán chất lượng gạo từ độ dài hạt, ta chỉ cần xử lí với những số từ 0-3 cm, thuật toán Gradient Descent sẽ chạy khá nhanh.
Nhưng với dự đoán giá đất, ta phải xử lí diện tích rất rộng, và giá tiền lên đến vài chục nghìn $ hay vài tỷ đồng, hầu hết thuật toán training sẽ overload và nếu có thể xử lí hết thì tốc độ cũng rất chậm.
Vì thế chúng ta cần phải quy chuẩn các input về một khoảng nhất định để việc training được tối ưu nhất. Các khoảng dữ liệu có thể như sau:
-1 < x <= 1
Hoặc:
-0.5 < x <= 0.5
Không có một quy chuẩn cụ thể x sẽ nằm trong khoảng nào, nhưng để tối ưu nhất, vùng dữ liệu (x lớn nhất – x nhỏ nhất) nên <= 1 và trung bình của toàn bộ x gần bằng 0.
Để thực hiện 2 yêu cầu này, chúng ta tách Feature Normalize thành 2 phần: Feature Scaling (đưa vùng dữ liệu về -0.5 < x <= 0.5) và Mean Normalization (đưa trung bình của x về gần 0).
Công thức Feature Normalize
Feature Scaling
Standard Deviation là gì?
Standard Deviation (độ lệch chuẩn) có thể hiểu là độ biến động của dữ liệu. Dữ liệu càng ổn định (ít chênh lệch), độ lệch chuẩn càng thấp. Kteam sẽ không đi sâu phần toán học của Standard Deviation, các bạn có thể tìm hiểu thêm tại Wikipedia.
Trong numpy, ta có thể tính độ lệch chuẩn bằng hàm std():
np.std(<mảng dữ liệu>,<index>,dtype = <kiểu dữ liệu>)
Trong đó:
- Mảng dữ liệu là ma trận hoặc vector cần tìm độ lệch chuẩn, trong Feature Normalize chính là ma trận X input của chúng ta.
- Index: Nếu bằng 0 sẽ tính độ lệch chuẩn theo từng cột (trả về độ lệch chuẩn của từng cột), bằng 1 sẽ tính theo hàng.
- Kiểu dữ liệu: Kiểu dữ liệu càng phức tạp, độ chính xác càng cao, trong bài này Kteam sử dụng kiểu np.float64.
Lưu ý:
Vì Standard Deviation là độ biến động của dữ liệu, nếu tất cả dữ liệu giống nhau, std = 0.
Công thức Feature Scaling
Để thực hiện Feature Scaling, ta chỉ cần lấy X chia cho độ lệch chuẩn:
với
Tuy nhiên, ta sẽ không thực hiện Feature Normalize với bias feature (x0 = 1), vì thế sau khi Feature Normalize xong, ta sẽ gán giá trị x0 = 1 lại.
Thực hiện std cho x0 sẽ trả về kết quả là 0, nếu tiếp tục lấy x/0 sẽ bị lỗi chia cho 0, nên ta phải cho x0 một độ biến động giả bằng cách gán x0 đầu tiên bằng 100 (để x0 không còn “luôn bằng 1”)
Ta thực hiện Feature Scaling với numpy như sau:
Mean Normalize
Để thực hiện Mean Normalize, ta sẽ tính trung bình từng feature rồi lấy feature cũ trừ trung bình.
Hàm tính trung bình – mean() với numpy:
np.std(<mảng dữ liệu>,<index>)
Trong đó:
- Mảng dữ liệu là ma trận hoặc vector cần tìm trung bình, trong Feature Normalize chính là ma trận X input của chúng ta.
- Index: Nếu bằng 0 sẽ tính trung bình theo từng cột (trả về trung bình của từng cột), bằng 1 sẽ tính theo hàng.
Công thức Feature Normalize khi có Mean Normalize:
với
Trong đó:
đọc là mu
Áp dụng vào hàm Normalize:
Trả kết quả
Hàm normalize sẽ trả về 3 kết quả: norm, và s.
và s được trả về để thuận tiện cho việc predict (trước khi predict phải Normalize input).
Áp dụng Feature Normalize vào multivariate problem
Load data
Ta sẽ define một hàm riêng để load data, tiết kiệm thời gian hơn:
Normalize data
Train data
Để train data, ta gọi hàm Gradient Descent đã viết sẵn với alpha = 0.1 và iter = 400
Predict kết quả
Đầu tiên, ta phải normalize input với mu và s, sau đó mới dùng hàm predict
Resources
Các bạn có thể download các file text được sử dụng trong bài viết tại:
Kết luận
Qua bài này chúng ta đã cùng nhau tìm hiểu về hàm Feature Normalize và áp dụng vào multivariate problem.
Ở bài sau, Kteam sẽ giới thiệu về PHƯƠNG PHÁP NORMAL EQUATION CHO LINEAR REGRESSION.
Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.
Tải xuống
Tài liệu
Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Feature normalize và Gradient Descent cho multivariate problem dưới dạng file PDF trong link bên dưới.
Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com
Đừng quên like và share để ủng hộ Kteam và tác giả nhé!

Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.
Khóa học
Machine Learning cơ bản với NumPy
Với mục đích giới thiệu đến mọi người về Machine Learning cũng như tạo điểm khởi đầu cho các bạn mới, muốn tham gia và tìm hiểu ban đầu về lĩnh vực khá hot này. Cùng Kteam tìm hiểu về Machine Learning cơ bản với ngôn ngữ Python.
Thông qua khóa học MACHINE LEARNING VỚI NUMPY, Kteam sẽ hướng dẫn các kiến thức cơ bản của thuật toán Machine Learning để các bạn có thể tạo ra những sản phẩm Machine Learning của riêng mình.
ai giải thích giúp mình làm thế nào để chọn alpha với iter cho chuẩn được không. Như coi trong clip thấy bảo là dựa vào bộ data. Nhưng dựa như thế nào, và đánh giá ra sao. Mong mọi người giải thích giúp. Xin cảm ơn.
Em đã kiểm tra code giống anh, nhưng kết quả thì lại báo lỗi như sau:
RuntimeWarning: overflow encountered in multiply
return bound(*args, **kwds)
Và giá trị đạt tối ưu số rất lớn:
Dat duoc toi uu tai I = 25 ; J = 232357601251212426499071501417501549453565987891232423445476554888062374409818437862864249792132937502186024781976541263938880019081861767687708104327777415261319786638227173530035783911342118742010940293895017444063004656462459212359153564182343182308246280546178795627927030974179353355522504191142526976.000000.
Em có cảm giác chương trình tính toán phần thập phân rất lớn. Ví dụ khi print J_hist như sau:
[[0.00000000e+000 1.34932124e+022]
[1.00000000e+000 2.88109127e+033]
[2.00000000e+000 6.15175001e+044]
.....
Cám ơn ae giúp đỡ.
Sao sau cùng lại tạo một array input mới vậy.
Và sao lại dùng (input - mu)/s trong khi mu và s là 2 giá trị tính độ lệch chuẩn cho X chứ ko phải cho Input :D
hi vọng tác giả giải đáp câu nói : " khi các feature có giá trị lớn thì việc thực hiện gradient descent sẽ lâu hơn " . Theo mình hiểu thì việc quá chênh lệch độ lớn giữa các feature sẽ gây ra hiện tượng chênh lệch vai trò giữa các feature , khi trọng số w được cập nhật thì với những feature có giá trị lớn sẽ làm cho biến động của các feature này lớn hơn hẳn các feature khác . Còn việc thực hiện gradient descent thì thuật toán dừng khi nó đã hội tụ và tốc độ hội tụ phụ thuộc vào learning rate , điểm khởi tạo , momentum ,v,v,v chứ nhỉ đâu có phụ thuộc vào độ lớn feature ?