我想对 2D 数据点进行代数曲线拟合,但由于各种原因 - 一次在内存中存储大量样本数据是不可能的,并且迭代所有这些数据是一个昂贵的过程。
(这样做的原因是实际上我需要根据我从磁盘读取的千兆字节数据同时拟合数千条曲线,因此这很慢)。
请注意,多项式系数的数量将受到限制(可能是 5-10),因此完全拟合的可能性极小,但这没关系,因为我试图在具有大量随机噪声的数据中找到潜在模式。我了解如何使用遗传算法将曲线拟合到数据集,但这需要多次通过样本数据,因此对我的应用程序不实用。
有没有办法用单次数据拟合曲线,其中必须从样本到样本保持的状态是最小的?
我应该补充一点,数据的性质是这些点可能位于 X 轴上介于 0.0 和 1.0 之间的任何位置,但 Y 值将始终为 1.0 或 0.0。
因此,在 Java 中,我正在寻找具有以下接口的类:
public interface CurveFit {
public void addData(double x, double y);
public List<Double> getBestFit(); // Returns the polynomial coefficients
}
实现这一点的类必须不需要在其实例字段中保留太多数据,即使对于数百万个数据点也不超过一千字节。这意味着您不能只存储数据,因为您稍后会对其进行多次传递。
编辑:有人建议在一次通过中找到最佳曲线可能是不可能的,但是不需要最佳拟合,就像我们可以在一次通过中获得它一样接近。
一种方法的基本原理可能是,如果我们有一种从曲线开始的方法,然后有一种方法对其进行修改,使其在新数据点进入时稍微接近新数据点——实际上是一种梯度下降的形式。希望有足够的数据(并且数据会很丰富),我们得到一个很好的曲线。也许这会激发某人找到解决方案。