Я хотел бы сделать алгебраическую кривую подгонки точек двумерных данных, но по разным причинам - на самом деле не представляется возможным иметь большую часть выборочных данных в памяти одновременно и повторять все это дорогостоящий процесс.
(Причина этого в том, что на самом деле мне нужно подогнать тысячи кривых одновременно, исходя из гигабайта данных, которые я читаю с диска, и, следовательно, это sloooooow).
Обратите внимание, что количество полиномиальных коэффициентов будет ограничено (возможно, 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
}
Класс, реализующий это, не должен хранить большой объем данных в своих полях экземпляра, не более килобайта даже для миллионов точек данных. Это означает, что вы не можете просто хранить данные, поскольку вы заставляете их делать несколько проходов позже.
edit: Некоторые полагают, что найти оптимальную кривую за один проход может быть невозможно, однако оптимальная подгонка не требуется, так же близко, как мы можем получить ее за один проход.
Голыми костями подхода может быть, если у нас есть способ начать с кривой, а затем способ изменить ее, чтобы она немного приблизилась к новым точкам данных по мере их появления - фактически в форме градиентного спуска. Есть надежда, что с достаточным количеством данных (и данных будет много), мы получим довольно хорошую кривую. Возможно, это вдохновляет кого-то на решение.