Как вычислить или приблизить медиану списка, не храня список

Вы забыли инициализировать ItemsList, поэтому вы получаете исключение нулевого указателя

public class Orders
{
    public List<Items> ItemList { get; set; } = new List<Items>();
}
43
задан Noha Kareem 7 December 2012 в 22:06
поделиться

8 ответов

Если значения дискретны, и количество отличных значений не слишком высоко, Вы могли просто накопить количество раз, каждое значение происходит в гистограмме, то найдите медиану от количеств гистограммы (просто складывают количества от вершины и нижней части гистограммы, пока Вы не достигаете середины). Или если бы они - непрерывные значения, Вы могли бы распределить их в мусорные ведра - который не сказал бы Вам точную медиану, но она даст Вам диапазон, и если необходимо знать более точно, что Вы могли бы выполнить итерации по списку снова, исследовав только элементы в центральном мусорном ведре.

42
ответ дан David Z 26 November 2019 в 22:31
поделиться

Вот сумасшедший подход, который Вы могли бы попробовать. Это - классическая проблема в потоковой передаче алгоритмов. Правила

  1. , Вы имеете ограниченную память, говорите O(log n), где n количество объектов, Вы хотите
  2. , можно посмотреть на каждый объект однажды и принять решение прямо здесь, что сделать с ним при хранении его это стоит памяти при броске его далеко, этого не стало навсегда.

идея для нахождения медианы проста. Образец O(1 / a^2 * log(1 / p)) * log(n) элементы из списка наугад, можно сделать это через выборку водохранилища (см. предыдущий вопрос ). Теперь просто возвратите медиану из своих выбранных элементов, с помощью классического метода.

гарантия - то, что индекс возвращенного объекта будет (1 +/- a) / 2 с вероятностью по крайней мере 1-p. Таким образом, существует вероятность p сбоя, можно выбрать его путем выборки большего количества элементов. И это возврат привычки медиана или гарантия, что значение возвращенного объекта где угодно близко к медиане, просто что при сортировке списка, возвращенный объект будет близко к половине списка.

Этот алгоритм использование O(log n) дополнительное пространство и выполнения в Линейное время.

14
ответ дан Regexident 26 November 2019 в 22:31
поделиться

Я не думаю, что возможно обойтись без наличия списка в памяти. Можно, очевидно, приблизиться с

  • среднее число, если Вы знаете, что данные симметрично распределяются
  • , или вычислите надлежащую медиану маленького подмножества данных (который умещается в памяти) - если Вы знаете, что Ваши данные имеют то же распределение через образец (например, что первый объект имеет то же распределение как последнее)
3
ответ дан Grzenio 26 November 2019 в 22:31
поделиться

Это хитро, чтобы разобраться в целом, особенно обработать вырожденные ряды, которые уже отсортированы или имеют набор значений в "запуске" списка, но конец списка имеет значения в другом диапазоне.

основная идея сделать гистограмму является самой многообещающей. Это позволяет Вам накопить информацию о распределении и запросы ответа (как медиана) от него. Медиана будет приблизительна, так как Вы, очевидно, не храните все значения. Пространство памяти фиксируется так, оно будет работать с любой последовательностью длины, которую Вы имеете.

, Но Вы не можете только создать гистограмму из, говорят, что первые 100 значений и используют ту гистограмму постоянно.. изменяющиеся данные могут сделать ту гистограмму недопустимой. Таким образом, Вам нужна динамическая гистограмма, которая может изменить ее диапазон и мусорные ведра на лету.

Делают структуру, которая имеет мусорные ведра N. Вы сохраните X значений каждого перехода слота (общее количество значений N+1), а также население мусорного ведра.

Поток в Ваших данных. Запишите первые значения N+1. Если концы потока перед этим, большим, у Вас есть все загруженные значения, и можно найти точную медиану и возвратить ее. Еще используйте значения для определения первой гистограммы. Просто отсортируйте значения и используйте значения как определения мусорного ведра, каждое мусорное ведро, имеющее население 1. Нормально иметь простофиль (0 мусорных ведер ширины).

Теперь поток в новых значениях. Для каждого двоичный поиск для нахождения мусорного ведра это принадлежит. В общем падеже Вы просто увеличиваете население того мусорного ведра и продолжаете. Если Ваш образец вне краев гистограммы (самый высокий или самый низкий), просто расширьте диапазон мусорного ведра конца для включения его. Когда Ваш поток сделан, Вы находите среднее демонстрационное значение путем нахождения мусорного ведра, которое имеет равное население с обеих сторон его и линейно интерполяцию остающейся ширины мусорного ведра.

, Но это недостаточно.. все еще необходимо АДАПТИРОВАТЬ гистограмму к данным, поскольку это передается потоком в. Когда мусорное ведро становится переполненным, Вы теряете информацию о sub распределении того мусорного ведра. Можно зафиксировать это путем адаптации на основе некоторой эвристики... Самое легкое и большая часть устойчивого - то, если мусорное ведро достигает некоторого населения определенного порога (что-то как 10*v/N, где v =# значений, замеченных до сих пор в потоке и N, является количеством мусорных ведер), Вы РАЗДЕЛЯЕТЕ то переполненное мусорное ведро. Добавьте новое значение в средней точке мусорного ведра, дайте каждой стороне половину населения исходного мусорного ведра. Но теперь у Вас есть слишком много мусорных ведер, таким образом, необходимо УДАЛИТЬ мусорное ведро. Хорошая эвристика для этого должна найти мусорное ведро с самым маленьким продуктом населения и ширины. Удалите его и объедините его с его левым или правым соседом (какой бы ни у одного из соседей самого есть самый маленький продукт ширины и населения.).Договорились! Обратите внимание, что слияние или разделение мусорных ведер теряют информацию, но это неизбежно.. Вы только починили устройство хранения данных.

Этот алгоритм хорош в этом, он будет иметь дело с [1 111] весь типы входных потоков и давать хорошие результаты. Если у Вас есть роскошь выбора пробного заказа, случайная выборка является лучшей, так как это минимизирует разделения и слияния.

алгоритм также позволяет Вам запрашивать любую процентиль, не только медиану, так как у Вас есть полная оценка распределения.

я использую этот метод в своем собственном коде во многих местах, главным образом для файлов регистрации событий отладки.. где некоторая статистика, которую Вы записываете, имеет неизвестное распределение. С этим алгоритмом Вы не должны предполагать заранее.

оборотная сторона является неравными средствами ширин мусорного ведра необходимо сделать двоичный поиск каждого образца, таким образом, сетевой алгоритм является O (NlogN).

7
ответ дан SPWorley 26 November 2019 в 22:31
поделиться

Найдите Min и Max списка, содержащего N объекты посредством линейного поиска, и назовите их как HighValue, и LowValue Позволяют MedianIndex = (N+1)/2

1-й Двоичный поиск Порядка:

Повторение выполняющий 4 шагов до LowValue < HighValue.

  1. Получают MedianValue приблизительно = (HighValue + LowValue) / 2

  2. Получают NumberOfItemsWhichAreLessThanorEqualToMedianValue =, K

  3. является K = MedianIndex, затем возвратитесь, MedianValue

  4. является K> MedianIndex? тогда HighValue = MedianValue Еще LowValue = MedianValue

Это будет быстрее, не используя память

2-й Двоичный поиск Порядка:

LowIndex=1 HighIndex=N

Повторение, Выполняющее 5 Шагов до (LowIndex < HighIndex)

  1. Добираются, Приблизительные DistrbutionPerUnit = (HighValue-низкой-стоимости) / (HighIndex-LowIndex)

  2. Получают Приблизительный MedianValue = LowValue + (MedianIndex-LowIndex) *, DistributionPerUnit

  3. Получает NumberOfItemsWhichAreLessThanorEqualToMedianValue =, K

  4. (K=MedianIndex)? возвратитесь MedianValue

  5. (K> MedianIndex)? тогда HighIndex=K и HighValue=MedianValue Еще LowIndex=K и LowValue=MedianValue

, Это будет быстрее, чем 1-й порядок, не используя память

, Мы можем также думать об установке HighValue, LowValue и MedianValue с HighIndex, LowIndex и MedianIndex к Параболе, и можем получить Двоичный поиск ThirdOrder, который будет быстрее, чем 2-й порядок, не используя память и так далее...

2
ответ дан lakshmanaraj 26 November 2019 в 22:31
поделиться

Есть статистика «лекарств». Это работает, сначала устанавливая k массивов, каждый из которых имеет длину b. Значения данных подаются в первый массив, и, когда он заполнен, медиана вычисляется и сохраняется в первом положении следующего массива, после чего первый массив используется повторно. Когда второй массив заполнен, медиана его значений сохраняется в первой позиции третьего массива и т. Д. И т. Д. Вы понимаете:)

Это просто и довольно надежно. Ссылка здесь ...

http://web.ipac.caltech.edu/staff/fmasci/home/astro_refs/Remedian.

39
ответ дан cberzan 26 November 2019 в 22:31
поделиться

Предложение Дэвида кажется наиболее разумным подходом для аппроксимации медианы.

Бегущее среднее ] для той же задачи гораздо проще вычислить:

M n = M n-1 + ((V n - M n-1 ) / n)

где M n - среднее значение n значений, M n-1 - предыдущее среднее значение, а V n - это новое значение.

Другими словами, новое среднее значение - это существующее среднее значение плюс разница между новым значением и средним, разделенная на число значений.

В коде это будет выглядеть примерно так: :

new_mean = prev_mean + ((value - prev_mean) / count)

хотя, очевидно, вы можете рассмотреть такие специфические для языка вещи, как ошибки округления с плавающей точкой и т. Д.

3
ответ дан GrahamS 26 November 2019 в 22:31
поделиться

Я использую эти инкрементные / рекурсивные средние и средние оценки, которые используют постоянное хранение:

mean += eta * (sample - mean)
median += eta * sgn(sample - median)

, где ETA является небольшим параметром скорости обучения (например, 0,001), а SGN () - это сигнал Функция, которая возвращает один из {-1, 0, 1}.

Этот тип инкрементального среднего оценки, похоже, используется повсюду, например, При неподтвержденных правилах изучения нейронных сетей, но медианная версия кажется гораздо менее распространенной, несмотря на ее выгоды (надежность выбросов). Похоже, что средняя версия может быть использована в качестве замены средней оценки во многих приложениях.

Я хотел бы увидеть инкрементный режим оценки аналогичной формы ...

(Примечание: я также опубликовал это подобную тему здесь: Алгоритмы «Онлайн» (итератор) для оценки статистической Медиана, режим, амортин, куртс? )

18
ответ дан 26 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: