Điều chỉnh đường cong là một loại tối ưu hóa nhằm tìm ra một tập hợp tham số tối ưu cho một hàm xác định phù hợp nhất với một tập hợp các quan sát nhất định
Không giống như học có giám sát, khớp đường cong yêu cầu bạn xác định chức năng ánh xạ các ví dụ về đầu vào thành đầu ra
Hàm ánh xạ, còn được gọi là hàm cơ sở, có thể có bất kỳ dạng nào bạn muốn, bao gồm đường thẳng [hồi quy tuyến tính], đường cong [hồi quy đa thức], v.v. Điều này mang lại sự linh hoạt và khả năng kiểm soát để xác định dạng đường cong, trong đó quy trình tối ưu hóa được sử dụng để tìm các tham số tối ưu cụ thể của hàm
Trong hướng dẫn này, bạn sẽ khám phá cách thực hiện khớp đường cong trong Python
Sau khi hoàn thành hướng dẫn này, bạn sẽ biết
- Điều chỉnh đường cong liên quan đến việc tìm các tham số tối ưu cho một hàm ánh xạ các ví dụ về đầu vào thành đầu ra
- Thư viện SciPy Python cung cấp API để khớp đường cong với tập dữ liệu
- Cách sử dụng khớp đường cong trong SciPy để khớp một loạt các đường cong khác nhau với một tập hợp các quan sát
Bắt đầu dự án của bạn với cuốn sách mới của tôi Tối ưu hóa cho Máy học, bao gồm các hướng dẫn từng bước và các tệp mã nguồn Python cho tất cả các ví dụ
Bắt đầu nàoKhớp đường cong với Python
Ảnh của Gael Varoquaux, bảo lưu một số quyền
Hướng dẫn tổng quan
Hướng dẫn này được chia thành ba phần;
- Lắp đường cong
- API Python lắp đường cong
- Ví dụ về việc lắp đường cong
Lắp đường cong
Điều chỉnh đường cong là một vấn đề tối ưu hóa để tìm ra một đường phù hợp nhất với tập hợp các quan sát
Cách dễ nhất là nghĩ về việc điều chỉnh đường cong theo hai chiều, chẳng hạn như đồ thị
Hãy xem xét rằng chúng tôi đã thu thập các ví dụ về dữ liệu từ miền vấn đề với đầu vào và đầu ra
Trục x là biến độc lập hoặc đầu vào của hàm. Trục y là biến phụ thuộc hoặc đầu ra của hàm. Chúng tôi không biết dạng hàm ánh xạ các ví dụ về đầu vào thành đầu ra, nhưng chúng tôi nghi ngờ rằng chúng tôi có thể tính gần đúng hàm với dạng hàm chuẩn
Điều chỉnh đường cong trước tiên bao gồm việc xác định dạng chức năng của hàm ánh xạ [còn được gọi là hàm cơ sở hoặc hàm mục tiêu], sau đó tìm kiếm các tham số cho hàm dẫn đến sai số tối thiểu
Lỗi được tính toán bằng cách sử dụng các quan sát từ miền và chuyển các đầu vào tới hàm ánh xạ ứng cử viên của chúng tôi và tính toán đầu ra, sau đó so sánh đầu ra được tính toán với đầu ra được quan sát
Khi đã khớp, chúng ta có thể sử dụng chức năng ánh xạ để nội suy hoặc ngoại suy các điểm mới trong miền. Người ta thường chạy một chuỗi các giá trị đầu vào thông qua chức năng ánh xạ để tính toán một chuỗi các kết quả đầu ra, sau đó tạo một biểu đồ đường của kết quả để cho biết đầu ra thay đổi như thế nào với đầu vào và mức độ phù hợp của đường với các điểm được quan sát
Chìa khóa để điều chỉnh đường cong là dạng của hàm ánh xạ
Một đường thẳng giữa đầu vào và đầu ra có thể được xác định như sau
- y = a * x + b
Trong đó y là đầu ra được tính toán, x là đầu vào và a và b là các tham số của hàm ánh xạ được tìm thấy bằng thuật toán tối ưu hóa
Đây được gọi là phương trình tuyến tính vì nó là tổng trọng số của các yếu tố đầu vào
Trong mô hình hồi quy tuyến tính, các tham số này được gọi là hệ số;
Phương trình này có thể được khái quát hóa cho bất kỳ số lượng đầu vào nào, nghĩa là khái niệm khớp đường cong không giới hạn ở hai chiều [một đầu vào và một đầu ra], nhưng có thể có nhiều biến đầu vào
Ví dụ: hàm ánh xạ dòng cho hai biến đầu vào có thể trông như sau
- y = a1 * x1 + a2 * x2 + b
Phương trình không nhất thiết phải là một đường thẳng
Chúng ta có thể thêm các đường cong trong hàm ánh xạ bằng cách thêm số mũ. Ví dụ: chúng ta có thể thêm phiên bản bình phương của đầu vào có trọng số theo tham số khác
- y = a * x + b * x^2 + c
Đây được gọi là hồi quy đa thức và thuật ngữ bình phương có nghĩa là nó là đa thức bậc hai
Cho đến nay, các phương trình tuyến tính thuộc loại này có thể phù hợp bằng cách tối thiểu hóa bình phương nhỏ nhất và có thể được tính toán theo phương pháp giải tích. Điều này có nghĩa là chúng ta có thể tìm thấy các giá trị tối ưu của các tham số bằng cách sử dụng một chút đại số tuyến tính
Chúng ta cũng có thể muốn thêm các hàm toán học khác vào phương trình, chẳng hạn như sin, cosin, v.v. Mỗi thuật ngữ được tính trọng số với một tham số và được thêm vào toàn bộ để đưa ra đầu ra;
- y = a * sin[b * x] + c
Việc thêm các hàm toán học tùy ý vào hàm ánh xạ của chúng ta thường có nghĩa là chúng ta không thể tính toán các tham số một cách phân tích và thay vào đó, chúng ta sẽ cần sử dụng thuật toán tối ưu hóa lặp lại
Đây được gọi là bình phương nhỏ nhất phi tuyến tính, vì hàm mục tiêu không còn lồi [nó phi tuyến tính] và không dễ giải quyết
Bây giờ chúng ta đã quen thuộc với khớp đường cong, hãy xem cách chúng ta có thể thực hiện khớp đường cong trong Python
Bạn muốn bắt đầu với các thuật toán tối ưu hóa?
Tham gia khóa học xử lý sự cố email miễn phí trong 7 ngày của tôi ngay bây giờ [có mã mẫu]
Nhấp để đăng ký và cũng nhận được phiên bản PDF Ebook miễn phí của khóa học
Bắt đầu Khóa học nhỏ MIỄN PHÍ của bạn ngay bây giờ
API Python lắp đường cong
Chúng tôi có thể thực hiện điều chỉnh đường cong cho tập dữ liệu của mình bằng Python
Thư viện mã nguồn mở SciPy cung cấp hàm curve_fit[] để điều chỉnh đường cong thông qua bình phương nhỏ nhất phi tuyến tính
Hàm lấy cùng một dữ liệu đầu vào và đầu ra làm đối số, cũng như tên của hàm ánh xạ sẽ sử dụng
Hàm ánh xạ phải lấy ví dụ về dữ liệu đầu vào và một số đối số. Các đối số còn lại này sẽ là các hệ số hoặc hằng số trọng số sẽ được tối ưu hóa bằng quy trình tối ưu hóa bình phương tối thiểu phi tuyến tính
Ví dụ: chúng tôi có thể có một số quan sát từ miền của chúng tôi được tải dưới dạng biến đầu vào x và biến đầu ra y
1
2
3
4
.. .
# tải các biến đầu vào từ một tệp
x_values = . . .
y_values = . . .
Tiếp theo, chúng ta cần thiết kế một hàm ánh xạ để khớp một dòng với dữ liệu và triển khai nó dưới dạng một hàm Python nhận đầu vào và đối số
Nó có thể là một đường thẳng, trong trường hợp đó nó sẽ trông như sau
1
2
3
# hàm mục tiêu
def mục tiêu[x, a, b, c]:
return a * x + b
Sau đó, chúng ta có thể gọi hàm curve_fit[] để khớp một đường thẳng với tập dữ liệu bằng cách sử dụng hàm đã xác định của chúng ta
Hàm curve_fit[] trả về các giá trị tối ưu cho hàm ánh xạ, e. g, các giá trị hệ số. Nó cũng trả về một ma trận hiệp phương sai cho các tham số ước tính, nhưng bây giờ chúng ta có thể bỏ qua điều đó
1
2
3
.. .
# đường cong vừa vặn
popt, _ = curve_fit[objective, x_values, y_values]
Khi đã khớp, chúng ta có thể sử dụng các tham số tối ưu và hàm ánh xạ object[] để tính toán đầu ra cho bất kỳ đầu vào tùy ý nào
Điều này có thể bao gồm đầu ra cho các ví dụ mà chúng tôi đã thu thập từ miền, nó có thể bao gồm các giá trị mới nội suy các giá trị được quan sát hoặc nó có thể bao gồm các giá trị ngoại suy nằm ngoài giới hạn của những gì được quan sát
1
2
3
4
5
6
7
.. .
# xác định giá trị đầu vào mới
x_new = . . .
# giải nén các tham số tối ưu cho hàm mục tiêu
a, b, c = popt
# sử dụng tham số tối ưu để tính giá trị mới
y_new = mục tiêu[x_new, a, b, c]
Bây giờ chúng ta đã quen với việc sử dụng API điều chỉnh đường cong, hãy xem một ví dụ đã hoạt động
Ví dụ về việc lắp đường cong
Chúng tôi sẽ phát triển một đường cong để phù hợp với một số quan sát dữ liệu kinh tế trong thế giới thực
Trong ví dụ này, chúng tôi sẽ sử dụng cái gọi là tập dữ liệu “Hồi quy kinh tế của Longley”;
- Suy thoái kinh tế của Longley [longley. csv]
- Mô tả hồi quy kinh tế của Longley [longley. tên]
Chúng tôi sẽ tự động tải xuống tập dữ liệu như một phần của ví dụ đã hoạt động
Có bảy biến đầu vào và 16 hàng dữ liệu, trong đó mỗi hàng xác định một bản tóm tắt các chi tiết kinh tế trong một năm từ 1947 đến 1962
Trong ví dụ này, chúng ta sẽ khám phá sự phù hợp giữa quy mô dân số và số người có việc làm mỗi năm
Ví dụ bên dưới tải tập dữ liệu từ URL, chọn biến đầu vào là “dân số” và biến đầu ra là “có việc làm” và tạo biểu đồ phân tán
1
2
3
4
5
6
7
8
9
10
11
12
# cốt truyện "Dân số" so với "Có việc làm"
từ gấu trúc nhập read_csv
từ matplotlib nhập pyplot
# tải tập dữ liệu
url = 'https. // thô. githubusercontent. com/jbrownlee/Bộ dữ liệu/master/longley. csv'
khung dữ liệu = read_csv[url, header=None]
dữ liệu = khung dữ liệu. giá trị
# chọn biến đầu vào và đầu ra
x, y = dữ liệu[:, 4], dữ liệu . [:, -1]
# cốt truyện đầu vào so với đầu ra
pyplot. phân tán[x, y]
pyplot. hiển thị[]
Chạy ví dụ tải tập dữ liệu, chọn các biến và tạo một biểu đồ phân tán
Chúng ta có thể thấy rằng có một mối quan hệ giữa hai biến. Cụ thể, khi dân số tăng, tổng số lao động tăng
Không phải là vô lý khi nghĩ rằng chúng ta có thể phù hợp với dữ liệu này
Âm mưu phân tán dân số vs. Tổng số việc làm
Đầu tiên, chúng tôi sẽ thử khớp một đường thẳng với dữ liệu này, như sau
1
2
3
# xác định hàm mục tiêu thực sự
def mục tiêu[x, a, b]:
return a * x + b
Chúng ta có thể sử dụng khớp đường cong để tìm các giá trị tối ưu của “a” và “b” và tóm tắt các giá trị được tìm thấy
1
2
3
4
5
6
.. .
# đường cong phù hợp
popt, _ = curve_fit[objective, x, y]
# tóm tắt các giá trị tham số
a, b = bật
in['y = %. 5f * x + %. 5f' % [a, b]]
Sau đó, chúng ta có thể tạo một biểu đồ phân tán như trước
1
2
3
.. .
# cốt truyện đầu vào so với đầu ra
pyplot. phân tán[x, y]
Trên biểu đồ phân tán, chúng ta có thể vẽ một đường cho hàm với các giá trị tham số được tối ưu hóa
Điều này trước tiên liên quan đến việc xác định một chuỗi các giá trị đầu vào giữa các giá trị tối thiểu và tối đa được quan sát trong tập dữ liệu [e. g. từ khoảng 120 đến khoảng 130]
1
2
3
.. .
# xác định chuỗi đầu vào giữa đầu vào nhỏ nhất và lớn nhất đã biết
x_line = dải[phút[x], max[x], 1]
Sau đó, chúng ta có thể tính toán giá trị đầu ra cho từng giá trị đầu vào
1
2
3
.. .
# tính toán đầu ra cho phạm vi
y_line = mục tiêu[x_line, a, b]
Sau đó, tạo một biểu đồ dòng của đầu vào so với. các kết quả đầu ra để xem một dòng
1
2
3
.. .
# tạo biểu đồ đường cho chức năng ánh xạ
pyplot. cốt truyện[x_line, y_line, '--', color='red']
Liên kết điều này lại với nhau, ví dụ dưới đây sử dụng khớp đường cong để tìm các tham số của đường thẳng cho dữ liệu kinh tế của chúng tôi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# khớp một đường thẳng với dữ liệu kinh tế
từ numpy nhập arange
từ gấu trúc nhập read_csv
từ scipy. tối ưu hóa nhập curve_fit
từ matplotlib nhập pyplot
# xác định hàm mục tiêu thực sự
def mục tiêu[x, a, b]:
return a * x + b
# tải tập dữ liệu
url = 'https. // thô. githubusercontent. com/jbrownlee/Bộ dữ liệu/master/longley. csv'
khung dữ liệu = read_csv[url, header=None]
dữ liệu = khung dữ liệu. giá trị
# chọn biến đầu vào và đầu ra
x, y = dữ liệu[:, 4], dữ liệu . [:, -1]
# đường cong phù hợp
popt, _ = curve_fit[objective, x, y]
# tóm tắt các giá trị tham số
a, b = bật
in['y = %. 5f * x + %. 5f' % [a, b]]
# cốt truyện đầu vào so với đầu ra
pyplot. phân tán[x, y]
# xác định chuỗi đầu vào giữa đầu vào nhỏ nhất và lớn nhất đã biết
x_line = dải[phút[x], max[x], 1]
# tính toán đầu ra cho phạm vi
y_line = mục tiêu[x_line, a, b]
# tạo biểu đồ đường cho chức năng ánh xạ
pyplot. cốt truyện[x_line, y_line, '--', color='red']
pyplot. hiển thị[]
Chạy ví dụ thực hiện điều chỉnh đường cong và tìm các tham số tối ưu cho hàm mục tiêu của chúng tôi
Đầu tiên, các giá trị của các tham số được báo cáo
1
y = 0. 48488 * x + 8. 38067
Tiếp theo, một biểu đồ được tạo hiển thị dữ liệu gốc và dòng phù hợp với dữ liệu
Chúng ta có thể thấy rằng nó phù hợp khá tốt
Biểu đồ đường thẳng phù hợp với tập dữ liệu kinh tế
Cho đến nay, điều này không thú vị lắm vì chúng ta có thể đạt được hiệu quả tương tự bằng cách điều chỉnh mô hình hồi quy tuyến tính trên tập dữ liệu
Hãy thử mô hình hồi quy đa thức bằng cách thêm các số hạng bình phương vào hàm mục tiêu
1
2
3
# xác định hàm mục tiêu thực sự
def mục tiêu[x, a, b, c]:
return a * x + b *