[Handbook] Linear Regession
This post hasn't been updated for 5 years
Giới thiệu
Hồi quy tuyến tính là một mô hình cơ bản của Học có giám sát trong Machine Learning. Bài viết giới thiệu về cơ sở lý thuyết và các áp dụng thực tế của mô hình hồi quy tuyến tính.
Cơ sở lý thuyết
Vấn đề. Cho ma trận , vector . Tìm vector sao cho đạt giá trị nhỏ nhất.
Ý tưởng: Nếu ta tìm được mà và vuông góc với nhau thì:
Khi đó giá trị nhỏ nhất của sẽ đạt tại .
Hai vector và vuông góc đồng nghĩa với , với mọi
Ta có thể chọn ra vector là sao cho
Lúc này nên hay với giả sử rằng
Kết luận. Như vậy để đạt giá trị nhỏ nhất thì
Chú ý. là giả nghịch đảo của , ký hiệu là .
Trong Python, hàm tính giả nghịch đảo này là numpy.linalg.pinv
Áp dụng vào bài toán hồi quy
Bài toán. Trong thí nghiệm xác định hằng số cặp nhiệt điện , ta có công thức , trong đó là suất điện động nhiệt điện và là nhiệt độ. Ta có bảng số liệu sau:
T | E |
---|---|
50 | 1.16 |
55 | 1.30 |
60 | 1.78 |
65 | 2.00 |
70 | 2.48 |
75 | 2.57 |
80 | 2.91 |
Công việc của ta là tìm và tốt nhất.
Đặt và trong đó ký hiệu cho cột toàn số .
Ta muốn là nhỏ nhất
Nói cách khác là nhỏ nhất, do đó
Giải quyết bằng Python.
import numpy as np
import matplotlib.pyplot as plt
X = np.array([[50, 55, 60, 65, 70, 75, 80]]).T
ones = np.ones((7, 1))
Xbar = np.concatenate((ones, X), axis=1) # Ghép thêm cột 1 vào X
y = np.array([[1.16, 1.30, 1.78, 2.00, 2.48, 2.57, 2.91]]).T
Xdagger = np.linalg.pinv(Xbar)
w = np.dot(Xdagger, y)
print("E0 = %f, C = %f" %(w[0][0], w[1][0]))
new_line = np.dot(Xbar, w)
plt.plot(X, y, 'ro')
plt.plot(X, new_line)
plt.show()
Kết quả:
E0 = -1.913214, C = 0.060643
Mở rộng. Ngoài có thể tìm hàm bậc nhất ra, ta có thể tìm các hàm khác phức tạp hơn, miễn sao ta có thể biểu diễn qua phép nhân hai ma trận là được:
Cho các điểm , ta sẽ biểu diễn một đường cong "gần sát" với các điểm trên.
Ta biểu diễn các điểm trên lên đồ thị:
import numpy as np
import matplotlib.pyplot as plt
X = np.array([[-1, 0, 1, 2, 3, 4, 5]]).T
y = np.array([[8.5, 2.7, 0.4, -1, -0.2, 3.2, 8.1]]).T
plt.plot(X, y, 'ro')
plt.show()
Thấy rằng nó có dạng một Parabol nên ta đoán hàm số có dạng
Thấy rằng nên ta sẽ thêm cột vào và tính kết quả:
import numpy as np
import matplotlib.pyplot as plt
X = np.array([[-1, 0, 1, 2, 3, 4, 5]]).T
y = np.array([[8.5, 2.7, 0.4, -1, -0.2, 3.2, 8.1]]).T
plt.plot(X, y, 'ro')
ones = np.ones((7, 1))
Xbar = np.concatenate((X, X*X), axis=1)
Xbar = np.concatenate((ones, Xbar), axis=1)
Xdagger = np.linalg.pinv(Xbar)
w = np.dot(Xdagger, y)
X = np.linspace(-1, 5, num=20).reshape(20, 1)
ones = np.ones((20, 1))
Xbar = np.concatenate((X, X*X), axis=1)
Xbar = np.concatenate((ones, Xbar), axis=1)
new_line = np.dot(Xbar, w)
plt.plot(X, new_line)
plt.show()
Kết quả không tệ:
Kết luận.
Qua các ví dụ trên, các bạn cũng phần nào hiểu được cách hoạt động, và khả năng của mô hình Hồi quy tuyến tính, và cho thấy nó có thể áp dụng với nhiều kiểu hàm khác nhau. Tuy nhiên không phải kiểu hàm nào cũng có thể áp dụng được và nếu dữ liệu đầu vào gặp nhiễu thì chúng ra sẽ nhận được kết quả không mong muốn.
Mong rằng với chút kiến thức của mình thì sẽ phần nào giúp các bạn hiểu rõ hơn về mô hình này.
Tài liệu tham khảo.
[1] Advanced Topics in Linear Algebra, The Moore-Penrose Inverse and Least Squares, Ross MacAusland
[2] Thí nghiệm vật lý đại cương A, Nguyễn Minh Châu, Nguyễn Dương Hùng
All Rights Reserved