Интересная проблема. Вот предложение, которое может быть довольно сложно реализовать в зависимости от того, насколько вы математически склонны.
Обратите внимание, что я обмениваю пространство на скорость, поскольку то, что я предлагаю, вероятно, будет довольно тяжелым в вычислительном отношении (но это должно быть проверено на реальных данных).
Во-первых, используйте функциональный подход. Распределение вероятностей - это мера вероятности:
struct Distribution
{
virtual ~Distribution() {};
virtual double integrate(std::function<double(double)>) = 0;
};
Таким образом, вы абстрагируетесь от образцов, которые вы производите, так как вы не хотите их хранить. Убедите себя в том, что вы можете делать практически все что угодно с помощью метода «интегрирования».
Конечно, с явными примерами вы делаете что-то вроде
struct SampledDistribution
{
double integrate(std::function<double(double)> f)
{
double acc = 0;
for (double x: samples) acc += f(samples);
return acc / samples.size();
}
std::deque<double> samples;
};
Теперь часть хранения:
Обычное представление - массив гистограмм - в основном нежелательно
из-за компромисса между квантованием / разрешением и пространством. я
Представьте, что должен быть метод представления, который адаптивно
варьирует размер корзины в зависимости от локальной "сложности".
Традиционный метод - вейвлеты . Вы производите коэффициенты с вызовами на integrate
, которые вы можете сериализовать. Вы выбрасываете коэффициенты, если дисперсия интегральной оценки, которую они производят, высока.
Затем для десериализации вы создаете объект Distribution
, метод которого integrate
выполняет интеграцию с вейвлетами. Интеграция может быть выполнена с вашим любимым квадратурным методом. Я остаюсь здесь намеренно расплывчатым, потому что фактическая реализация зависит от выбранного вами семейства вейвлетов (гладкое, компактное, ортогональное или нет и т. Д.). Вам все равно придется погрузиться в литературу.
Суть в том, что вам обычно требуется очень мало вейвлетов для представления гладкой функции с небольшим количеством функций (скажем, с несколькими пиками и правильной формы в противном случае), в отличие от более «правильных» конечных элементов (гистограммы представляют собой особый вид конечных элементов). представление элементов). Вейвлет-представление приспосабливается к особенностям преобразователя, независимо от его местоположения или размера. Кроме того, вы можете решить, сколько коэффициентов сохранить, и, следовательно, контролировать степень сжатия.
Кроме того, значение 0,001 является довольно большим числом: я подозреваю, что вам понадобится только несколько коэффициентов
Компромисс заключается в том, какой класс вейвлетов вы используете: очень гладкие распределения, вероятно, будут хорошо представлены с гладкими вейвлетами, но вейвлеты с компактной поддержкой могут легче интегрироваться и т. Д. Эксперимент. Обратите внимание, что здесь вам не нужны пакеты «вейвлет-преобразования»: только явное представление вейвлет-функций и квадратурные процедуры (попробуйте процедуры Gauss-XXX для реконструкции или что-то более высокого порядка).
Я бы предпочел вейвлеты, которые определены в области Фурье (например, вейвлеты Лемари), поскольку их значение и производные в нуле в пространстве Фурье известны, это позволяет вам применять ограничения на распределения: вероятностные меры должны интегрироваться в один, и вы можете заранее знать ожидаемое значение или отклонение.
Кроме того, вы можете изменить переменные, чтобы иметь дело только с функциями, например. на [0,1]. На вейвлетах в интервале много литературы.