使用 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
我做错了什么?
解决方案 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()
这看起来与您的原始数据非常不同...这就是为什么我认为它可能不是您要查找的内容。
我有一组数据,绘制时大多数点聚集在 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
我做错了什么?
解决方案 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()
这看起来与您的原始数据非常不同...这就是为什么我认为它可能不是您要查找的内容。