Мне нужно посчитать квантили для большого набора данных.
Предположим, мы можем получить данные только через несколько порций (то есть через одну строку большой матрицы). Чтобы посчитать квантиль 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?