这是我每0.1秒就有一辆车的位置数据的(x,y)曲线图.总分在500分左右.
我读到了其他关于使用SciPy(here和here)进行内插的解决方案,但似乎在默认情况下,SciPy以均匀的间隔进行内插.以下是我当前的代码:
def reduce_dataset(x_list, y_list, num_interpolation_points):
points = np.array([x_list, y_list]).T
distance = np.cumsum( np.sqrt(np.sum( np.diff(points, axis=0)**2, axis=1 )) )
distance = np.insert(distance, 0, 0)/distance[-1]
interpolator = interp1d(distance, points, kind='quadratic', axis=0)
results = interpolator(np.linspace(0, 1, num_interpolation_points)).T.tolist()
new_xs = results[0]
new_ys = results[1]
return new_xs, new_ys
xs, ys = reduce_dataset(xs,ys, 50)
colors = cm.rainbow(np.linspace(0, 1, len(ys)))
i = 0
for y, c in zip(ys, colors):
plt.scatter(xs[i], y, color=c)
i += 1
它产生以下输出:
这是不错的,但我想设置插值器,try 在最难进行线性插补的地方放置更多的点,而在可以使用插值线轻松重建的区域放置较少的点.
请注意,在第二张图片中,最后一个点似乎突然从前一个点"跳"了出来.中间的部分似乎有点多余,因为其中许多点都落在一条完全直线上.对于要使用线性内插法尽可能准确地重建的东西,这不是使用50个点的最有效使用.
我是手工制作的,但我正在寻找类似这样的东西,其中的算法足够智能,可以在数据非线性变化的地方非常密集地放置点:
通过这种方式,可以以更高的准确度对数据进行插值.该图中点之间的大间隙可以用简单的线非常精确地插值,而密集的聚类需要更频繁的采样. 我已经阅读到interpolator docs on SciPy,但似乎找不到任何发电机或设置可以做到这一点.
我也try 过使用"线性"和"三次"插值法,但它似乎仍然以均匀的间隔进行采样,而不是对最需要它们的点进行分组.
这是SciPy可以做到的吗,或者我应该为这样的工作使用类似SKLearn ML算法的东西吗?