Hướng dẫn what is fitting data in python? - dữ liệu phù hợp trong python là gì?

Mô hình hóa dữ liệu với Numpy và Scipy

Ảnh của Siora Photography trên unplash

Phù hợp với dữ liệu số vào các mô hình là một nhiệm vụ thường xuyên trong tất cả các kỹ thuật và khoa học. Vì vậy, bạn nên biết các công cụ của bạn và cách sử dụng chúng. Trong bài viết hôm nay, tôi giới thiệu cho bạn về cách bạn có thể sử dụng những con ngựa làm việc khoa học Python, Numpy và Scipy để làm điều đó. Và tôi cũng sẽ đưa ra một số gợi ý về quy trình làm việc của bạn khi lắp dữ liệu.

Một sự phù hợp đơn giản

Giả sử chúng ta có một mảng với dữ liệu từ một nơi nào đó và chúng ta phải có ý nghĩa về nó. Khi chúng ta vẽ nó, nó có thể trông như vậy:

Trực quan, mắt người nhận ra rằng đây là dữ liệu nằm rải rác xung quanh một đường có độ dốc nhất định. Vì vậy, hãy để phù hợp với một dòng, là một đa thức của độ 1. Nếu phù hợp tuyến tính hoặc đa thức là tất cả những gì bạn cần, thì Numpy là một cách tốt để đi. Nó có thể dễ dàng thực hiện phù hợp bình phương nhỏ nhất tương ứng:

import numpy as npx_data = np.arange(1, len(y_data)+1, dtype=float)
coefs = np.polyfit(x_data, y_data, deg=1)
poly = np.poly1d(coefs)

Trong Numpy, đây là một quá trình 2 bước. Đầu tiên, bạn phù hợp với mức độ đa thức (

import matplotlib.pyplot as pltx_model = np.linspace(x_data[0], x_data[-1], 200)plt.plot(x_model, poly(x_model))
plt.plot(x_data, y_data, 'ro',)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
1) với
import matplotlib.pyplot as pltx_model = np.linspace(x_data[0], x_data[-1], 200)plt.plot(x_model, poly(x_model))
plt.plot(x_data, y_data, 'ro',)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
2. Hàm này trả về các hệ số của đa thức được trang bị. Tôi không thể nhớ việc sắp xếp các hệ số được trả lại. Nó ở mức độ cao nhất hoặc mức thấp nhất đầu tiên? Thay vì tìm kiếm tài liệu mỗi lần, tôi thích sử dụng
import matplotlib.pyplot as pltx_model = np.linspace(x_data[0], x_data[-1], 200)plt.plot(x_model, poly(x_model))
plt.plot(x_data, y_data, 'ro',)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
3. Nó tự động tạo ra một đa thức từ các hệ số và nó chắc chắn không nhớ phân loại. ;-) Sau đó, bạn có thể sử dụng đa thức giống như bất kỳ hàm Python bình thường nào. Chúng ta hãy vẽ đường dây được trang bị cùng với dữ liệu:

import matplotlib.pyplot as pltx_model = np.linspace(x_data[0], x_data[-1], 200)plt.plot(x_model, poly(x_model))
plt.plot(x_data, y_data, 'ro',)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()

Tất nhiên, với

import matplotlib.pyplot as pltx_model = np.linspace(x_data[0], x_data[-1], 200)plt.plot(x_model, poly(x_model))
plt.plot(x_data, y_data, 'ro',)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
2, chúng tôi không bị giới hạn trong các dòng phù hợp, nhưng chúng tôi có thể phù hợp với đa thức của bất kỳ thứ tự nào nếu có đủ điểm dữ liệu. Câu hỏi chỉ là nếu nó có ý nghĩa. Chẳng hạn, nếu chúng ta phù hợp với đa thức độ 10 với dữ liệu, chúng ta sẽ nhận được kết quả sau.

coefs = np.polyfit(x_data, y_data, 10)
poly = np.poly1d(coefs)

Bây giờ đa thức được trang bị phù hợp với các điểm dữ liệu đã cho một cách hoàn hảo nhưng nó có một số dao động rất khó hiểu. Đây là một ví dụ điển hình của quá mức. Chúng ta luôn có thể làm cho chức năng mô hình của chúng ta đủ phức tạp để tái tạo các điểm dữ liệu rất tốt. Tuy nhiên, giá là mất khả năng dự đoán. Nếu tôi muốn biết giá trị có thể xảy ra cho x = 10,5, trong đó không có điểm dữ liệu thô nào được đưa ra, tôi sẽ tin tưởng vào mô hình đơn giản hơn mô hình phức tạp!

Biết dữ liệu của bạn!

Để tránh ảnh hưởng của quá mức, luôn luôn tốt để có thêm kiến ​​thức về dữ liệu của bạn. Nếu bạn biết quy trình nào đã tạo ra dữ liệu của bạn và nếu có một mô hình tốt cho quá trình này (như một luật vật lý), thì đó là điều tuyệt vời! Nhưng điều này chỉ xảy ra hiếm khi. Nhưng thông thường, bạn có thể tìm hiểu thêm về dữ liệu của mình mà không cần phỏng đoán. Cấu trúc dữ liệu của bạn phải luôn là một phần của thói quen của bạn. Xem xét các ví dụ sau. Nếu bạn vẽ dữ liệu theo cách bình thường, thì bạn chỉ thấy một đỉnh ở 𝑥 = 1 và tất cả các giá trị khác thực tế bằng không. Vậy chúng ta nên làm gì? Vẽ dữ liệu trên thang đo logarit-logarit! Điều này tiết lộ nếu dữ liệu được tạo bởi một số luật quyền lực.

plt.loglog(x_data, y_data, 'o')
plt.grid()
plt.xlabel('x')
plt.ylabel('y')
a cốt truyện logaritchmic cho thấy dữ liệu dựa trên luật quyền lực

Biểu đồ log kép cho thấy một hành vi tuyến tính, có nghĩa là dữ liệu là từ một luật quyền lực. Và độ dốc của đường cho chính sức mạnh. Tăng 𝑥 bằng hệ số 10 giảm 𝑦 bằng hệ số 10⁶. Vì vậy, chúng tôi có một luật quyền lực

cho một số không đổi. Nếu bạn không muốn đọc các cường độ, thì chỉ cần vẽ nó theo thang đo log-log để xem liệu hành vi này có phải là luật nguồn hay không, sau đó phù hợp với dữ liệu log-log với một dòng:if the behavior is a power law, and then fit the log-log data to a line:

coefs = np.polyfit(np.log(x_data), np.log(y_data), deg=1)
coefs
Out: array([-6. , -2.30258509])

Vì vậy, ở đây, chúng ta thấy ngay lập tức rằng sức mạnh là -6. Những gì chúng tôi có là:

hoặc lấy theo cấp số nhân:

Hãy cùng xem một số ví dụ khác. Giả sử chúng ta có dữ liệu sau:

Trông gần giống như trước đây, phải không? Nhưng không phải như vậy, nếu bạn vẽ nó trên thang log-log:

plt.loglog(x_data, y_data, 'o')
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
Cốt truyện hai logaritch cho thấy đây không phải là luật quyền lực

Bây giờ cốt truyện log-log không phải là một đường thẳng nữa. Điều này chỉ ra rằng chúng tôi không có luật quyền lực. Thay vào đó, với việc tăng 𝑥, các giá trị cho 𝑦 giảm nhanh hơn bất kỳ công suất nào. Có lẽ nó có một cái gì đó chứa một cấp số nhân. Nếu nó theo cấp số nhân, điều này sẽ được nhìn thấy trong một âm mưu bán logarit:

plt.semilogy(x_data, y_data, 'o')
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
Cốt truyện Semilog tiết lộ rằng luật pháp là theo cấp số nhân

Có, rõ ràng là một dòng, vì vậy dữ liệu của chúng tôi phải được tạo bởi pháp luật:

với hằng số 𝑎 và. Chúng ta có thể nhận được các hằng số với Numpy một lần nữa:

coefs = np.polyfit(x_data, np.log(y_data), deg=1)
coefs
Out: array([-5. , 2.69741491])

Độ dốc trong biểu đồ Semilog tương ứng với hằng số và phần bù của FIT mã hóa hằng số 𝑎:

Vì vậy, 𝑏 = −5 và 𝑎 = exp (2.69741491) = 14.8413.

Phù hợp với các mô hình phi tuyến với scipy

Hàm Numpy từ

import matplotlib.pyplot as pltx_model = np.linspace(x_data[0], x_data[-1], 200)plt.plot(x_model, poly(x_model))
plt.plot(x_data, y_data, 'ro',)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
5 chỉ có thể phù hợp với đa thức của một mức độ nhất định. Vì vậy, nếu dữ liệu của bạn được tạo bởi một quy trình với một số luật:

nó sẽ không làm việc. Trong tình huống đó, bạn có thể sử dụng Scipy thay thế. Ở đây bạn, có thể xác định một luật nhất định và nói với SCIPY để tối ưu hóa các tham số. Xem xét ví dụ sau:

Chỉ từ cốt truyện, nó rất khó để đánh giá luật nào đằng sau dữ liệu đó. Nhưng nếu bạn biết luật (ví dụ bạn biết quy trình vật lý liên quan), thì bạn có thể dễ dàng mô hình hóa nó bằng

import matplotlib.pyplot as pltx_model = np.linspace(x_data[0], x_data[-1], 200)plt.plot(x_model, poly(x_model))
plt.plot(x_data, y_data, 'ro',)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
6. Ở đây, chúng tôi cho rằng luật pháp là luật được đưa ra ở trên.

from scipy.optimize import curve_fitdef law(x, a, b):
return a * x * np.sin(x)**2 + b
fit = curve_fit(law, x_data, y_data)
fit
Out: (array([ 3., -2.]),
array([[ 5.49796736e-32, -1.80526189e-31],
[-1.80526189e-31, 1.16149599e-30]]))

Đầu ra là một tuple của hai mảng. Mảng đầu tiên chứa các tham số được trang bị, mảng thứ hai cung cấp thông tin về mức độ phù hợp của phù hợp. Trong trường hợp của chúng tôi, vì chúng tôi biết luật chính xác và dữ liệu không ồn ào, chúng tôi có được sự phù hợp hoàn hảo.

y_model = law(x_model, *fit[0])plt.plot(x_model, y_model)
plt.plot(x_data, y_data, 'ro')
plt.grid()
plt.xlabel('x')
plt.ylabel('y')

Các dao động ở đây không quá mức vì chúng tôi cho rằng chúng tôi biết luật đằng sau dữ liệu, do đó, OK OK.

Cuối cùng, hãy để một cái nhìn về một tình huống vẫn phức tạp hơn. Cho đến nay, tất cả các phù hợp đã được thực hiện là phù hợp tuyến tính. Điều đó không có nghĩa là các đường cong là tuyến tính, nhưng các tham số của sự phù hợp chỉ xuất hiện với sức mạnh của 1. Đây không phải là trường hợp nữa nếu bạn muốn phù hợp với dữ liệu với một luật như

Lưu ý rằng bây giờ tham số nằm trong hàm sin. Và nếu bạn viết hàm sin như một chuỗi sức mạnh, bạn sẽ thấy rằng 𝑏 không chỉ xuất hiện với sức mạnh của 1 mà còn vô số sức mạnh khác. Điều này hiện được gọi là phù hợp phi tuyến, và nó có thể là một nghệ thuật để có được một giải pháp tốt. Không có hướng dẫn phù hợp với tất cả các mục đích và những gì bạn nên làm, phụ thuộc rất nhiều vào vấn đề. Trong trường hợp của chúng tôi, chúng tôi nhận được:

import matplotlib.pyplot as pltx_model = np.linspace(x_data[0], x_data[-1], 200)plt.plot(x_model, poly(x_model))
plt.plot(x_data, y_data, 'ro',)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
0

Mặc dù sự phù hợp có vẻ tốt trở lại, nhưng nó chứa một số lỗi không thể nhìn thấy trong cốt truyện và cũng không ở đầu ra tự tin. Vì tôi đã tạo dữ liệu theo cách thủ công, tôi biết rằng giá trị được trang bị cho 𝑎 là tốt, nhưng đối với 𝑏 nó bị tắt (1.14159 thay vì 2). Vậy bạn có thể làm gì để đánh giá nếu sự phù hợp của bạn là tốt? Don Tiết sử dụng tất cả dữ liệu cho sự phù hợp! Đặt trước một số dữ liệu và chỉ làm phù hợp với phần còn lại của dữ liệu. Sau đó sử dụng dữ liệu dành riêng để kiểm tra xem FIT có dự đoán dữ liệu không thấy không. Rằng được gọi là Ture-Test-split.

Thông thường, phù hợp phi tuyến tính cần một số trợ giúp từ người dùng. Chẳng hạn, bạn có thể muốn đưa ra các dự đoán ban đầu cho các tham số theo cách thủ công hoặc bạn muốn ràng buộc hoặc ràng buộc các tham số với các phạm vi hoặc điều kiện nhất định. Tất cả có thể được thực hiện với các đối số bổ sung của

import matplotlib.pyplot as pltx_model = np.linspace(x_data[0], x_data[-1], 200)plt.plot(x_model, poly(x_model))
plt.plot(x_data, y_data, 'ro',)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
7. Nhưng đó là một chủ đề lớn phù hợp cho một bài viết hoàn chỉnh, vì vậy tôi lưu nó trong một thời gian sau đó. Giữ nguyên. :-)

Nếu bạn thích bài viết này, bạn có thể muốn xem xét trở thành một thành viên trung bình để có quyền truy cập không giới hạn vào tất cả các bài viết trung bình. Nếu bạn đăng ký bằng liên kết này, bạn thậm chí có thể hỗ trợ tôi với tư cách là một nhà văn, vì tôi sẽ nhận được một phần 2,27 đô la (tại thời điểm viết bài này) từ phí trung bình.

Thêm nội dung tại Plainenglish.io. Đăng ký nhận bản tin hàng tuần miễn phí của chúng tôi. Nhận quyền truy cập độc quyền vào các cơ hội viết và lời khuyên trong sự bất hòa của cộng đồng của chúng tôi.

Phù hợp với bộ dữ liệu là gì?

Trong quá trình phù hợp, bạn chạy một thuật toán trên dữ liệu mà bạn biết biến mục tiêu, được gọi là dữ liệu được dán nhãn của Google và tạo ra một mô hình học máy.Sau đó, bạn so sánh các kết quả với các giá trị thực, được quan sát của biến mục tiêu để xác định độ chính xác của chúng.you run an algorithm on data for which you know the target variable, known as “labeled” data, and produce a machine learning model. Then, you compare the outcomes to real, observed values of the target variable to determine their accuracy.

Nó có nghĩa là gì để phù hợp với một chức năng với dữ liệu?

Đối với phân tích dữ liệu tuyến tính, "phù hợp" thường có nghĩa là cố gắng tìm đường cong để giảm thiểu sự dịch chuyển thẳng đứng (trục y) của một điểm từ đường cong (ví dụ: bình phương tối thiểu theo quy định).trying to find the curve that minimizes the vertical (y-axis) displacement of a point from the curve (e.g., ordinary least squares).

Chức năng phù hợp là gì?

Mục tiêu của chức năng phù hợp là chọn các giá trị cho các tham số trong một hàm để mô tả tốt nhất một tập hợp dữ liệu.Có nhiều lý do có thể để làm điều này.choose values for the parameters in a function to best describe a set of data. There are many possible reasons to do this.

Popt là gì trong Python?

POPT: Mảng.Các giá trị tối ưu cho các tham số sao cho tổng của sai số bình phương của f (xdata, *popt) - ydata được giảm thiểu.PCOV: Mảng 2D.Hiệp phương sai ước tính của popt.Các đường chéo cung cấp phương sai của ước tính tham số.array. Optimal values for the parameters so that the sum of the squared error of f(xdata, *popt) - ydata is minimized. pcov : 2d array. The estimated covariance of popt. The diagonals provide the variance of the parameter estimate.