在python中,多项式近似并不表示通过数据点的线的精确近似,

tvz2xvvm  于 2022-12-01  发布在  Python
关注(0)|答案(2)|浏览(105)

我正在处理一项必须扩充数据的任务。对于数据扩充,我必须对数据(非线性数据)进行多项式近似。但如果我进行多项式近似,我将无法获得数据的精确近似。
下面是我作为原始数据使用的35个点。

x = [0.7375, 0.7405, 0.7445, 0.7488, 0.7515, 0.7545, 0.7593, 0.7625, 0.7657, 0.7687, 0.7715, 0.776, 0.7794, 0.7826, 0.7889, 0.7916, 0.7945, 0.8011, 0.8038, 0.8079, 0.8125, 0.8168, 0.8233, 0.826, 0.8287, 0.8318, 0.8361, 0.8391, 0.845, 0.8506, 0.8534, 0.8563, 0.8595, 0.8625, 0.8734]

y = [7797.61, 7829.59, 7833.6, 7837.02, 7854.76, 7862.18, 7893.06, 7927.04, 7946.49, 7975.83, 8038.12, 8110.94, 8115.37, 8125.11, 8172.58, 8182.54, 8215.06, 8232.01, 8274.98, 8272.71, 8243.45, 8242.93, 8225.08, 8199.25, 8180.92, 8143.29, 8152.09, 8136.59, 8164.3, 8202.04, 8203.57, 8174.67, 8192.0, 8201.25, 8131.32]

下面的图片描述你更多。

我用过from sklearn.preprocessing import PolynomialFeatures

x_plot = np.linspace(min(x), max(x), 1000)

model = make_pipeline(PolynomialFeatures(42), Ridge(alpha=1e-3))
model.fit(x, y)
y_plot = model.predict(x_plot)
r2 = model.score(x,y)

其中xy是我的原始数据,得35分。
我想得到最接近完美(更精确)的近似值,因为所得到的曲线并不代表足够精确。

cld4siwp

cld4siwp1#

您正在做一些冒险的事情,我不确定您是否意识到这一点。对于N个数据点,N次多项式总是可以精确地拟合数据。您的图是35个数据点的42次多项式。您肯定是过度拟合了。
完美的性能不应该是拟合模型的目标--泛化到看不见的数据的能力才是最终目标。

0x6upsns

0x6upsns2#

您的方法对Ridgealpha的值很敏感。scikit-learn的文档中说您可以使用RidgeCV代替Ridge来基于留一交叉验证选择alpha,例如:

model = make_pipeline(
    PolynomialFeatures(...),
    RidgeCV(alphas=np.logspace(-10, 10)))

如果你只是试图逼近一条通过所有这些点的曲线,你可以得到一条SplineTransformer的闭合曲线,而不需要使用高多项式次数。例如:

model = make_pipeline(
    SplineTransformer(n_knots=5, degree=3),
    RidgeCV(alphas=np.logspace(-10, 10)))

你图表上的最后两点与我有关:你可以找到一个多项式或样条曲线来接近这两个点,但现在你是基于非常少的信息来假设它们之间的数据形状。过度拟合,就像@MikeL说的。最后一点的测量误差会比第五点的误差对模型的改变大得多。

相关问题