簡體   English   中英

如何將函數擬合到python中的數據

[英]how to fit a function to data in python

我想將函數擬合到獨立( X )和依賴( y )變量:

import numpy as np
y = np.array([1.45952016, 1.36947283, 1.31433227, 1.24076599, 1.20577963,
       1.14454815, 1.13068077, 1.09638278, 1.08121406, 1.04417094,
       1.02251471, 1.01268524, 0.98535659, 0.97400591])
X = np.array([4.571428571362048, 8.771428571548313, 12.404761904850602, 17.904761904850602,
            22.904761904850602, 31.238095237873495, 37.95833333302289, 
            44.67857142863795, 51.39880952378735, 64.83928571408615, 
            71.5595238097012, 85., 98.55357142863795, 112.1071428572759])

我已經以這種方式嘗試過 scipy 包:

from scipy.optimize import curve_fit
def func (x, a, b, c):
    return 1/(a*(x**2) + b*(x**1) + c)
g = [1, 1, 1]
c, cov = curve_fit (func, X.flatten(), y.flatten(), g)
test_ar = np.arange(min(X), max(X), 0.25)
pred = np.empty(len(test_ar))
for i in range (len(test_ar)):
    pred[i] = func(test_ar[i], c[0], c[1], c[2])

我可以添加更高階的多項式以使我的func更准確,但我想保持簡單。 如果有人給我一些關於如何找到另一個功能或使我的預測更好的幫助,我非常感謝。 該圖還顯示了預測的結果:

在此處輸入圖像描述

您要做的第一件事是指定如何衡量“准確性”,在您的情況下,這根本不是一個合適的術語。

你本質上在做什么被稱為線性回歸。 在這種情況下,合適的度量是均方誤差 (MSE)、均方根誤差 (RMSE)、平均絕對誤差 (MAE)。 由您決定使用哪個指標以及為“可接受”設置什么閾值。

您在上面顯示的圖像(您已擬合線的位置)看起來不錯,但請將您的 X 軸從 -100 擴展到 300 並再次向我們展示圖像, 這是高次多項式的問題

這是一個如何在 scikit-learn 中使用回歸的 101 示例 在您的情況下,如果您想使用 x^2 或 x^3 來預測 y,您只需將它們添加到數據中......目前您的 X 變量是一個數組(一個向量),您需要將其擴展為一個矩陣,其中每一列都是一個特征 (x, x^2, x^3 ...)

這是一些代碼:

import pandas as pd
from sklearn import linear_model
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error, r2_score

y = [1.45952016, 1.36947283, 1.31433227, 1.24076599, 
 1.20577963, 1.14454815, 1.13068077, 1.09638278, 
 1.08121406, 1.04417094, 1.02251471, 1.01268524, 0.98535659, 
 0.97400591]

x = [4.571428571362048, 8.771428571548313, 12.404761904850602, 
 17.904761904850602, 22.904761904850602, 31.238095237873495,
 37.95833333302289, 44.67857142863795, 51.39880952378735, 
 64.83928571408615, 71.5595238097012, 85., 98.55357142863795, 112.1071428572759]

df = pd.DataFrame({
    'x' : x,
    'x^2': [i**2 for i in x],
    'x^3': [i**3 for i in x],
    'y': y
})

X = df[['x','x^2','x^3']]
y = df['y']

model = linear_model.LinearRegression()
model.fit(X, y)
y1 = model.predict(X)

coef = model.coef_
intercept = model.intercept_

線性回歸

您可以從coef變量中看到系數:

array([-1.67456732e-02,  2.03899728e-04, -8.70976426e-07])

您可以從intercept變量中看到攔截:

1.5042389677980577

在您的情況下,這意味着 -> y1 = -1.67e-2x +2.03e-4x^2 -8.70e-7x^3 + 1.5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM