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

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ào

Khớ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;

  1. Lắp đường cong
  2. API Python lắp đường cong
  3. 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 *

Chủ Đề