Hướng dẫn exponential line of best fit python - dòng mũ của con trăn phù hợp nhất

Để phù hợp y = a + b log x, chỉ cần phù hợp với y so với (log x).

>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> numpy.polyfit(numpy.log(x), y, 1)
array([ 8.46295607,  6.61867463])
# y ≈ 8.46 log(x) + 6.62

Để lắp y = aebx, hãy lấy logarit của cả hai bên cho log y = log a + bx. Vì vậy, phù hợp (log y) so với x.

Lưu ý rằng việc phù hợp (log y) như thể nó là tuyến tính sẽ nhấn mạnh các giá trị nhỏ của y, gây ra độ lệch lớn cho y lớn. Điều này là do

>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)
1 (hồi quy tuyến tính) hoạt động bằng cách giảm thiểu ∑i (ΔY) 2 = ∑i (yi - ŷi) 2. Khi yi = log yi, dư lượng ΔYI = (log yi) ≈ ΔYi / | yi |. Vì vậy, ngay cả khi
>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)
1 đưa ra một quyết định rất tồi tệ đối với y lớn, "chia rẽ-by- | y |" Yếu tố sẽ bù đắp cho nó, gây ra
>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)
1 ủng hộ các giá trị nhỏ.

Điều này có thể được giảm bớt bằng cách cho mỗi mục nhập "trọng lượng" tỷ lệ với y.

>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)
1 hỗ trợ các bình phương có trọng số thông qua đối số từ khóa
>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)
5.

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)

Lưu ý rằng Excel, LibreOffice và hầu hết các máy tính khoa học thường sử dụng công thức không trọng số (thiên vị) cho các dòng hồi quy / xu hướng theo cấp số nhân. Nếu bạn muốn kết quả của mình tương thích với các nền tảng này, không bao gồm các trọng số ngay cả khi nó cung cấp kết quả tốt hơn. If you want your results to be compatible with these platforms, do not include the weights even if it provides better results.


Bây giờ, nếu bạn có thể sử dụng SCIPY, bạn có thể sử dụng

>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)
6 để phù hợp với bất kỳ mô hình nào mà không cần biến đổi.

Với y = a + b log x, kết quả giống như phương thức chuyển đổi:

>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)

Tuy nhiên, đối với y = aebx, chúng ta có thể phù hợp hơn vì nó tính toán trực tiếp Δ (log y). Nhưng chúng ta cần cung cấp một dự đoán khởi tạo để

>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)
7 có thể đạt đến mức tối thiểu cục bộ mong muốn.

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.

Hướng dẫn exponential line of best fit python - dòng mũ của con trăn phù hợp nhất

  • Ví dụ dữ liệu
  • Phương pháp 1: Polyfit
  • Phương pháp 2: Curve_fit
  • So sánh các phương pháp
  • Nội suy và ngoại suy (dự báo/dự đoán/ước tính)
  • Sử dụng một lô thanh

⇦ Quay lại

Làm thế nào để bạn tính toán sự phù hợp theo cấp số nhân trong Python?

y = e (ax)*e (b) trong đó a, b là các hệ số của phương trình theo cấp số nhân đó. Chúng tôi cũng sẽ sử dụng phương thức numpy.polyfit () để lắp đường cong. Hàm này có ba tham số x, y và mức độ đa thức (n) trả về các hệ số của đa thức độ n.

Làm thế nào để bạn phù hợp với một đường cong theo cấp số nhân cho dữ liệu?

Trên tab Curve Fitter, trong phần dữ liệu, bấm chọn Dữ liệu. Trong hộp thoại Chọn dữ liệu phù hợp, chọn dữ liệu x và dữ liệu y hoặc chỉ là dữ liệu y so với chỉ mục. Nhấp vào mũi tên trong phần FIT TYPE để mở bộ sưu tập và nhấp vào hàm mũ trong nhóm mô hình hồi quy.

Làm thế nào để Curve_fit hoạt động Python?

Hàm đường cong_fit () trả về các giá trị tối ưu cho hàm ánh xạ, ví dụ, 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 chúng ta có thể bỏ qua điều đó bây giờ.\(AB^x = Ae^{x\ln(B)}\)). The important thing to realise is that an exponential function can be fully defined with three constants. We will use the second of these formulations, which can be written in Python as

>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)
8 where
>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)
9 is the exponential function \(e^x\) from the Numpy package (renamed
>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
0 in our examples).

Ví dụ dữ liệu

Phương pháp 1: Polyfit

import numpy as np

# Set a seed for the random number generator so we get the same random numbers each time
np.random.seed(20210706)

# Create fake x-data
x = np.arange(10)
# Create fake y-data
a = 4.5
b = 0.5
c = 50
y = a * np.exp(b * x) + c  # Use the second formulation from above
y = y + np.random.normal(scale=np.sqrt(np.max(y)), size=len(x))  # Add noise

Phương pháp 2: Curve_fit

import matplotlib.pyplot as plt

# Formatting options for plots
A = 6  # Want figure to be A6
plt.rc('figure', figsize=[46.82 * .5**(.5 * A), 33.11 * .5**(.5 * A)])
plt.rc('text', usetex=True)
plt.rc('font', family='serif')
plt.rc('text.latex', preamble=r'\usepackage{textgreek}')

# Create a plot
ax = plt.axes()
ax.scatter(x, y)
ax.set_title('Example Data')
ax.set_ylabel('y-Values')
ax.set_ylim(0, 500)
ax.set_xlabel('x-Values')

Phương pháp 1: Polyfit

Phương pháp 2: Curve_fit\(c = 0\), ie when you want to fit a curve with equation \(y = ae^{bx}\) to your data. If you want to fit a curve with equation \(y = ae^{bx} + c\) with \(c \neq 0\) you will need to use method 2.

Nếu bạn có một tập hợp các điểm dữ liệu trông giống như chúng tăng lên nhanh chóng, có thể rất hữu ích khi phù hợp với chúng với một dòng tăng theo cấp số nhân, theo cấp số nhân để mô tả hình dạng chung của dữ liệu:

Dòng mà bạn cần phù hợp để đạt được hình dạng này sẽ là hình ảnh được mô tả bởi hàm hàm mũ, đó là bất kỳ chức năng nào của hình thức:

\ (y = ab^x + c \)\(f(x) = mx + c\) where:

  • hoặc
  • \ (y = ae^{bx} + c \)
  • . Điều quan trọng cần nhận ra là một hàm số mũ có thể được xác định đầy đủ với ba hằng số. Chúng tôi sẽ sử dụng phần thứ hai của các công thức này, có thể được viết bằng Python là
    >>> x = numpy.array([1, 7, 20, 50, 79])
    >>> y = numpy.array([10, 19, 30, 35, 51])
    >>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
    (array([ 6.61867467,  8.46295606]), 
     array([[ 28.15948002,  -7.89609542],
            [ -7.89609542,   2.9857172 ]]))
    # y ≈ 6.62 + 8.46 log(x)
    
    8 trong đó
    >>> x = numpy.array([1, 7, 20, 50, 79])
    >>> y = numpy.array([10, 19, 30, 35, 51])
    >>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
    (array([ 6.61867467,  8.46295606]), 
     array([[ 28.15948002,  -7.89609542],
            [ -7.89609542,   2.9857172 ]]))
    # y ≈ 6.62 + 8.46 log(x)
    
    9 là hàm theo cấp số nhân \ (e^x \) từ gói numpy (đổi tên thành
    >>> x = numpy.array([10, 19, 30, 35, 51])
    >>> y = numpy.array([1, 7, 20, 50, 79])
    >>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
    (array([  5.60728326e-21,   9.99993501e-01]),
     array([[  4.14809412e-27,  -1.45078961e-08],
            [ -1.45078961e-08,   5.07411462e+10]]))
    # oops, definitely wrong.
    >>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
    (array([ 4.88003249,  0.05531256]),
     array([[  1.01261314e+01,  -4.31940132e-02],
            [ -4.31940132e-02,   1.91188656e-04]]))
    # y ≈ 4.88 exp(0.0553 x). much better.
    
    0 trong các ví dụ của chúng tôi).

Đối với hướng dẫn này, hãy để tạo ra một số dữ liệu giả để sử dụng làm ví dụ. Đây phải là một tập hợp các điểm tăng theo cấp số nhân (nếu không thì những nỗ lực của chúng tôi để phù hợp với một đường cong theo cấp số nhân cho họ đã giành được hoạt động tốt!) Với một số tiếng ồn ngẫu nhiên được đưa vào để bắt chước dữ liệu trong thế giới thực:\(\ln(y)\) against \(x\):

import numpy as np

# Set a seed for the random number generator so we get the same random numbers each time
np.random.seed(20210706)

# Create fake x-data
x = np.arange(10)
# Create fake y-data
a = 4.5
b = 0.5
c = 0
y = a * np.exp(b * x) + c  # Use the second formulation from above
y = y + np.random.normal(scale=np.sqrt(np.max(y)), size=len(x))  # Add noise

# Fit a polynomial of degree 1 (a linear function) to the data
p = np.polyfit(x, np.log(y), 1)

Tiếng ồn ngẫu nhiên đang được thêm vào với hàm

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
1 từ Numpy rút các mẫu ngẫu nhiên từ phân phối bình thường (Gaussian). Chúng ta hãy xem xét dữ liệu ví dụ này trông như thế nào trên một biểu đồ phân tán:

# Convert the polynomial back into an exponential
a = np.exp(p[1])
b = p[0]
x_fitted = np.linspace(np.min(x), np.max(x), 100)
y_fitted = a * np.exp(b * x_fitted)

Phương thức này chỉ hoạt động khi \ (c = 0 \), tức là khi bạn muốn lắp một đường cong với phương trình \ (y = ae^{bx} \) với dữ liệu của bạn. Nếu bạn muốn lắp một đường cong với phương trình \ (y = ae^{bx} + c \) với \ (c \ neq 0 \), bạn sẽ cần sử dụng phương pháp 2.

import matplotlib.pyplot as plt

ax = plt.axes()
ax.scatter(x, y, label='Raw data')
ax.plot(x_fitted, y_fitted, 'k', label='Fitted curve')
ax.set_title('Using polyfit() to fit an exponential function')
ax.set_ylabel('y-Values')
ax.set_ylim(0, 500)
ax.set_xlabel('x-Values')
ax.legend()

Phương pháp này có nhược điểm của các giá trị nhỏ nhấn mạnh quá số mũ. Hành động biến đổi hàm đa thức thành theo cấp số nhân có tác dụng tăng các giá trị lớn nhiều hơn so với các giá trị nhỏ, và do đó nó có tác dụng tăng khoảng cách đến đường cong được trang bị cho các giá trị lớn hơn so với các giá trị nhỏ . Điều này có thể được giảm thiểu bằng cách thêm một ‘trọng lượng theo tỷ lệ của \ (y \): Nói với

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
2 để cho vay nhiều hơn đối với các điểm dữ liệu với giá trị y lớn:\(y\): tell
>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
2 to lend more importance to data points with a large y-value:

# Fit a weighted polynomial of degree 1 (a linear function) to the data
p = np.polyfit(x, np.log(y), 1, w=np.sqrt(y))

# Convert the polynomial back into an exponential
a = np.exp(p[1])
b = p[0]
x_fitted_weighted = np.linspace(np.min(x), np.max(x), 100)
y_fitted_weighted = a * np.exp(b * x_fitted_weighted)

# Plot
ax = plt.axes()
ax.scatter(x, y, label='Raw data')
ax.plot(x_fitted, y_fitted, 'k', label='Fitted curve, unweighted')
ax.plot(x_fitted_weighted, y_fitted_weighted, 'k--', label='Fitted curve, weighted')
ax.set_title('Using polyfit() to fit an exponential function')
ax.set_ylabel('y-Values')
ax.set_ylim(0, 500)
ax.set_xlabel('x-Values')
ax.legend()

Sử dụng một trọng lượng đã cải thiện sự phù hợp.

Phương pháp 2: Curve_fit

Từ Scipy Pacakge, chúng ta có thể nhận được chức năng

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
6. Điều này là tổng quát hơn
>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
2 (chúng ta có thể phù hợp với bất kỳ loại chức năng nào chúng ta thích, theo cấp số nhân hay không) nhưng nó phức tạp hơn ở chỗ đôi khi chúng ta cần đưa ra dự đoán ban đầu về những gì hằng số có thể để nó hoạt động.

Hãy để sử dụng dữ liệu ví dụ ban đầu của chúng tôi (với \ (c \ neq 0 \)):\(c \neq 0\)):

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)
0

Bây giờ, hãy để phù hợp với hàm \ (y = ae^{bx} + c \). Điều này được thực hiện bằng cách xác định nó là hàm lambda (tức là là một đối tượng chứ không phải là lệnh) của biến giả \ (t \) và sử dụng hàm

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
6 để phù hợp với đối tượng này với dữ liệu X- và Y. Lưu ý rằng chức năng
>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
6 cần được nhập từ gói phụ
import numpy as np

# Set a seed for the random number generator so we get the same random numbers each time
np.random.seed(20210706)

# Create fake x-data
x = np.arange(10)
# Create fake y-data
a = 4.5
b = 0.5
c = 50
y = a * np.exp(b * x) + c  # Use the second formulation from above
y = y + np.random.normal(scale=np.sqrt(np.max(y)), size=len(x))  # Add noise
0:\(y = ae^{bx} + c\). This is done by defining it as a lambda function (ie as an object rather than as a command) of a dummy variable \(t\) and using the
>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
6 function to fit this object to the x- and y-data. Note that the
>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
6 function needs to be imported from the
import numpy as np

# Set a seed for the random number generator so we get the same random numbers each time
np.random.seed(20210706)

# Create fake x-data
x = np.arange(10)
# Create fake y-data
a = 4.5
b = 0.5
c = 50
y = a * np.exp(b * x) + c  # Use the second formulation from above
y = y + np.random.normal(scale=np.sqrt(np.max(y)), size=len(x))  # Add noise
0 sub-package:

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)
1

Lưu ý rằng chúng ta cần loại bỏ bất kỳ giá trị nào bằng 0 khỏi dữ liệu y của chúng ta (và giá trị x tương ứng của chúng khỏi dữ liệu x) để hoạt động này, mặc dù không có bất kỳ giá trị nào trong số này trong ví dụ này không liên quan ở đây

Đầu ra đầu tiên,

import numpy as np

# Set a seed for the random number generator so we get the same random numbers each time
np.random.seed(20210706)

# Create fake x-data
x = np.arange(10)
# Create fake y-data
a = 4.5
b = 0.5
c = 50
y = a * np.exp(b * x) + c  # Use the second formulation from above
y = y + np.random.normal(scale=np.sqrt(np.max(y)), size=len(x))  # Add noise
1, là danh sách các giá trị được tối ưu hóa cho các tham số, trong trường hợp của chúng tôi là các hằng số \ (a \), \ (b \) và \ (c \):\(a\), \(b\) and \(c\):

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)
2

Hãy để xem những gì nó trông như thế nào:

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)
3

Điều này có vẻ thực sự tốt, và chúng tôi đã không cần phải cung cấp một phỏng đoán ban đầu! Điều này là do dữ liệu ví dụ chúng tôi đang sử dụng đủ gần với số mũ mà thuật toán tối ưu hóa phía sau

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
6 có thể phù hợp với đường cong mà không vô tình chọn mức tối thiểu cục bộ sai. Điều này won luôn luôn là trường hợp, vì vậy, đây là cách để thực hiện nó với một dự đoán ban đầu được cung cấp:

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)
4
>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)
5

So sánh các phương pháp

Hãy để âm mưu cho cả ba phương thức với nhau bằng cách sử dụng cùng một dữ liệu ví dụ (\ (c = 0 \)) cho mỗi phương pháp:\(c = 0\)) for each:

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)
6

Như bạn có thể thấy, phương pháp

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y)
(array([  5.60728326e-21,   9.99993501e-01]),
 array([[  4.14809412e-27,  -1.45078961e-08],
        [ -1.45078961e-08,   5.07411462e+10]]))
# oops, definitely wrong.
>>> scipy.optimize.curve_fit(lambda t,a,b: a*numpy.exp(b*t),  x,  y,  p0=(4, 0.1))
(array([ 4.88003249,  0.05531256]),
 array([[  1.01261314e+01,  -4.31940132e-02],
        [ -4.31940132e-02,   1.91188656e-04]]))
# y ≈ 4.88 exp(0.0553 x). much better.
6 đã cho chúng ta xấp xỉ tốt nhất về hành vi theo cấp số nhân thực sự.

Nội suy và ngoại suy (dự báo/dự đoán/ước tính)

Chúng tôi có thể sử dụng đường cong được trang bị để ước tính dữ liệu của chúng tôi sẽ là gì cho các giá trị khác của \ (x \) không có trong bộ dữ liệu thô của chúng tôi: giá trị sẽ ở mức \ (x = 11 \) (nằm ngoài miền của chúng tôi và Do đó, yêu cầu chúng tôi dự báo trong tương lai) hoặc \ (x = 8,5 \) (nằm trong miền của chúng tôi và do đó yêu cầu chúng tôi 'điền vào khoảng cách' trong dữ liệu của chúng tôi)? Để trả lời những câu hỏi này, chúng tôi chỉ cần cắm các giá trị X này làm số vào phương trình của đường cong được trang bị:\(x\) that are not in our raw dataset: what would the value be at \(x=11\) (which is outside our domain and thus requires us to forecast into the future) or \(x = 8.5\) (which is inside our domain and thus requires us to ‘fill in a gap’ in our data)? To answer these questions, we simply plug these x-values as numbers into the equation of the fitted curve:

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)
7

Rõ ràng hơn:

>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)
8
>>> x = numpy.array([10, 19, 30, 35, 51])
>>> y = numpy.array([1, 7, 20, 50, 79])
>>> numpy.polyfit(x, numpy.log(y), 1)
array([ 0.10502711, -0.40116352])
#    y ≈ exp(-0.401) * exp(0.105 * x) = 0.670 * exp(0.105 * x)
# (^ biased towards small values)
>>> numpy.polyfit(x, numpy.log(y), 1, w=numpy.sqrt(y))
array([ 0.06009446,  1.41648096])
#    y ≈ exp(1.42) * exp(0.0601 * x) = 4.12 * exp(0.0601 * x)
# (^ not so biased)
9

Sử dụng một lô thanh

Nếu bạn muốn sử dụng một âm mưu thanh thay vì biểu đồ phân tán:

>>> x = numpy.array([1, 7, 20, 50, 79])
>>> y = numpy.array([10, 19, 30, 35, 51])
>>> scipy.optimize.curve_fit(lambda t,a,b: a+b*numpy.log(t),  x,  y)
(array([ 6.61867467,  8.46295606]), 
 array([[ 28.15948002,  -7.89609542],
        [ -7.89609542,   2.9857172 ]]))
# y ≈ 6.62 + 8.46 log(x)
0

⇦ Quay lại

Làm thế nào để bạn tính toán sự phù hợp theo cấp số nhân trong Python?

y = e (ax)*e (b) trong đó a, b là các hệ số của phương trình theo cấp số nhân đó.Chúng tôi cũng sẽ sử dụng phương thức numpy.polyfit () để lắp đường cong.Hàm này có ba tham số x, y và mức độ đa thức (n) trả về các hệ số của đa thức độ n.(ax)*e(b) where a ,b are coefficients of that exponential equation. We would also use numpy. polyfit() method for fitting the curve. This function takes on three parameters x, y and the polynomial degree(n) returns coefficients of nth degree polynomial.

Làm thế nào để bạn phù hợp với một đường cong theo cấp số nhân cho dữ liệu?

Trên tab Curve Fitter, trong phần dữ liệu, bấm chọn Dữ liệu.Trong hộp thoại Chọn dữ liệu phù hợp, chọn dữ liệu x và dữ liệu y hoặc chỉ là dữ liệu y so với chỉ mục.Nhấp vào mũi tên trong phần FIT TYPE để mở bộ sưu tập và nhấp vào hàm mũ trong nhóm mô hình hồi quy.

Làm thế nào để Curve_fit hoạt động Python?

Hàm đường cong_fit () trả về các giá trị tối ưu cho hàm ánh xạ, ví dụ, 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 chúng ta có thể bỏ qua điều đó bây giờ.returns the optimal values for the mapping function, e.g, the coefficient values. It also returns a covariance matrix for the estimated parameters, but we can ignore that for now.