scipy 如何在python中使函数适合数据

watbbzwu  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(130)

我想用一个函数来拟合自变量(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更精确,但我希望保持简单。我非常感谢任何人给予我一些关于如何找到另一个函数或使我的预测更好的帮助。下图还显示了预测的结果:

hgqdbh6s

hgqdbh6s1#

你要做的第一件事是指定你如何衡量“准确性”,这在你的情况下根本不是一个合适的术语。
你实际上做的是线性回归。在这种情况下合适的度量是均方误差(MSE),均方根误差(RMSE),平均绝对误差(MAE)。由你决定使用哪种度量,以及设置什么阈值才是“可接受的”。
上面显示的图像(拟合线的位置)看起来很好,但请将X轴从-100扩展到300,并再次显示图像this is a problem with high degree polynomials
This is a 101 example如何在scikit-learn中使用回归。在你的例子中,如果你想使用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

相关问题