使用 SciPy 将数据插值到二次拟合中

Using SciPy to interpolate data into a quadratic fit

我有一组数据,绘制时大多数点聚集在 x 轴的左侧:

plt.plot(x, y, marker='o')
plt.title('Original')
plt.show()

ORIGINAL GRAPH

我想使用 scipy 对数据进行插值,稍后尝试用 二次线 拟合数据。我正在 避免 简单地拟合二次曲线 而无需插值 因为这将使获得的曲线 偏向于数据量x 轴的一端。我使用

进行了尝试
f = interp1d(x, y, kind='quadratic')

# Array with points in between min(x) and max(x) for interpolation
x_interp = np.linspace(min(x), max(x), num=np.size(x))

# Plot graph with interpolation
plt.plot(x_interp, f(x_interp), marker='o')
plt.title('Interpolated')
plt.show()

得到了INTERPOLATED GRAPH.

然而,我想要得到的是这样的: EXPECTED GRAPH

我做错了什么?

可以找到我的 x 值 here and values for y here。 谢谢!

解决方案 1

非常确定这就是您想要的。它适合您的数据的二阶(二次)多项式,然后将该函数绘制在 x 值的均匀间隔数组上,范围从原始 x 数据的最小值到最大值。

new_x = np.linspace(min(x), max(x), num=np.size(x))
coefs = np.polyfit(x,y,2)
new_line = np.polyval(coefs, new_x)

正在绘制returns:

plt.scatter(x,y)
plt.scatter(new_x,new_line,c='g', marker='^', s=5)
plt.xlim(min(x)-0.00001,max(x)+0.00001)
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()

如果那不是你的意思...

但是,从你的问题来看,你似乎试图将所有原始 y-values 强制到均匀间隔的 x-values 上(如果这不是你的意图,请告诉我,我我会删除这部分)。

这也是可以的,有很多方法可以做到这一点,但我在pandas这里做到了:

import pandas as pd
xy_df=pd.DataFrame({'x_orig': x, 'y_orig': y})
sorted_x_y=xy_df.sort_values('x_orig')
sorted_x_y['new_x'] = np.linspace(min(x), max(x), np.size(x))

plt.figure(figsize=[5,5])
plt.scatter(sorted_x_y['new_x'], sorted_x_y['y_orig'])
plt.xlim(min(x)-0.00001,max(x)+0.00001)
plt.xticks(rotation=90)
plt.tight_layout()

这看起来与您的原始数据非常不同...这就是为什么我认为它可能不是您要查找的内容。