Мне нужно посчитать квантили для большого набора данных.
Давайте предположим, что мы можем получить данные только через несколько частей (то есть одну строку большой матрицы). Для подсчета квантиля Q3 необходимо получить все порции данных и сохранить их где-нибудь, затем отсортировать и посчитать квантиль:
List<double> allData = new List<double>();
// This is only an example; the portions of data are not really rows of some matrix
foreach(var row in matrix)
{
allData.AddRange(row);
}
allData.Sort();
double p = 0.75 * allData.Count;
int idQ3 = (int)Math.Ceiling(p) - 1;
double Q3 = allData[idQ3];
Я хотел бы найти способ получения квантиля без сохранения данных в промежуточной переменной. Лучшим решением было бы подсчитать некоторые параметры промежуточных результатов для первой строки, а затем настроить их шаг за шагом для следующих строк.
Примечание:
- Эти наборы данных очень большие (около 5000 элементов в каждом ряду)
- Q3 можно оценить, оно не должно быть точным значением.
- Я называю части данных «строками», но они могут иметь разные длины! Обычно оно варьируется не так много (+/- несколько сотен образцов), но оно варьируется!
Этот вопрос похож на «Он-лайн» (итератор) алгоритмы для оценки статистической медианы, моды, асимметрии, эксцесса , но мне нужно посчитать квантили.
ТАКЖЕ есть несколько статей в этой теме, т. Е.
Прежде чем пытаться реализовать эти подходы, я подумал, есть ли еще какие-нибудь более быстрые способы подсчета квантилей 0,25 / 0,75?