Dòng phi tuyến tính của Python phù hợp nhất
Đ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 Show 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
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 Hướng dẫn tổng quanHướng dẫn này được chia thành ba phần;
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
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
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 đượ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;
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 congChú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 congChú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”;
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 * x**2 + c Liên kết điều này lại với nhau, ví dụ hoàn chỉnh được liệt kê bên dướ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 đa thức bậc hai 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, c): return a * x + b * x**2 + c
# 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, c = popt in('y = %. 5f * x + %. 5f * x^2 + %. 5f' % (a, b, c)) # 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, c) # 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ị() Đầu tiên các thông số tối ưu được báo cáo 1 y = 3. 25443 * x + -0. 01170 * x^2 + -155. 02783 Tiếp theo, một biểu đồ được tạo hiển thị dòng trong ngữ cảnh của các giá trị được quan sát từ miền Chúng ta có thể thấy rằng phương trình đa thức bậc hai mà chúng ta đã xác định trực quan phù hợp với dữ liệu hơn so với đường thẳng mà chúng ta đã thử nghiệm đầu tiên Biểu đồ của đa thức bậc hai phù hợp với tập dữ liệu kinh tế Chúng ta có thể tiếp tục và thêm nhiều thuật ngữ đa thức hơn vào phương trình để phù hợp hơn với đường cong Ví dụ: bên dưới là một ví dụ về đa thức bậc năm phù hợp với dữ liệu 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 # khớp đa thức bậc 5 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, c, d, e, f): return (a * x) + (b * x**2) + (c * x**3) + (d * x**4) + (e * x**5) + f
# 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, c, d, e, f = popt # 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, c, d, e, f) # 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ụ khớp với đường cong và vẽ sơ đồ kết quả, một lần nữa thu được nhiều sắc thái hơn một chút về cách mối quan hệ trong dữ liệu thay đổi theo thời gian Đồ thị của đa thức bậc 5 phù hợp với bộ dữ liệu kinh tế Điều quan trọng, chúng tôi không giới hạn ở hồi quy tuyến tính hoặc hồi quy đa thức. Chúng ta có thể sử dụng bất kỳ chức năng cơ sở tùy ý Ví dụ: có lẽ chúng tôi muốn một đường có các đường lắc lư để ghi lại chuyển động ngắn hạn khi quan sát. Chúng ta có thể thêm một đường cong hình sin vào phương trình và tìm các tham số tích hợp tốt nhất yếu tố này trong phương trình Ví dụ: một hàm tùy ý sử dụng sóng hình sin và đa thức bậc hai được liệt kê bên dưới 1 2 3 # xác định hàm mục tiêu thực sự def mục tiêu(x, a, b, c, d): return a * sin(b - x) + c * x**2 + d Ví dụ hoàn chỉnh về việc điều chỉnh đường cong bằng hàm cơ bản này được liệt kê bên dướ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 31 32 # khớp một dòng với dữ liệu kinh tế từ numpy nhập sin từ numpy nhập sqrt 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, c, d): return a * sin(b - x) + c * x**2 + d
# 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, c, d = popt in(popt) # 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, c, d) # 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ụ khớp với một đường cong và vẽ kết quả Chúng ta có thể thấy rằng việc thêm một sóng hình sin có tác dụng mong muốn thể hiện sự dao động định kỳ với xu hướng tăng, cung cấp một cách khác để nắm bắt các mối quan hệ trong dữ liệu Âm mưu của sóng hình sin phù hợp với bộ dữ liệu kinh tế Làm thế nào để bạn chọn phù hợp nhất? Nếu bạn muốn giải pháp phù hợp nhất, bạn sẽ mô hình hóa vấn đề dưới dạng bài toán học tập có giám sát hồi quy và thử nghiệm một bộ thuật toán để khám phá ra thuật toán nào tốt nhất để giảm thiểu lỗi Trong trường hợp này, điều chỉnh đường cong phù hợp khi bạn muốn xác định hàm một cách rõ ràng, sau đó khám phá các tham số của hàm phù hợp nhất với một dòng dữ liệu Mô hình nào là tốt nhất cho khôngMô hình hóa mối quan hệ phi tuyến tính bằng cách sử dụng Mô hình hồi quy đa thức . Hồi quy phi tuyến tính là mối quan hệ giữa các biến độc lập x và biến phụ thuộc y dẫn đến dữ liệu được mô hình hóa hàm phi tuyến tính.
Làm cách nào để sử dụng Curve_fit trong Python?Điều chỉnh dữ liệu . Nhập hàm curve_fit từ scipy Tạo một danh sách hoặc mảng gọn gàng của biến độc lập của bạn (giá trị x của bạn). . Tạo một danh sách các mảng numpy của các biến phụ thuộc của bạn (giá trị y của bạn). . Tạo một hàm cho phương trình bạn muốn điều chỉnh. . Sử dụng chức năng curve_fit để điều chỉnh dữ liệu của bạn phù hợp bình phương tối thiểu phi tuyến tính là gì?Bình phương nhỏ nhất phi tuyến tính giải được min(∑. F(x i ) - y i . 2 ), trong đó F(x i ) là một hàm phi tuyến và . Xem Bình phương nhỏ nhất phi tuyến tính (Curve Fitting). Đối với cách tiếp cận dựa trên vấn đề, hãy tạo các biến vấn đề, sau đó biểu diễn hàm mục tiêu và các ràng buộc theo các biến tượng trưng này. i is data. See Nonlinear Least Squares (Curve Fitting). For the problem-based approach, create problem variables, and then represent the objective function and constraints in terms of these symbolic variables.
Đường xu hướng OLS là gì?Trong thống kê, bình phương nhỏ nhất thông thường (OLS) là một loại phương pháp bình phương nhỏ nhất tuyến tính để chọn các tham số chưa biết trong mô hình hồi quy tuyến tính . giảm thiểu tổng bình phương của. |