Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Наивный алгоритм [ править ]

Формула для расчета дисперсии всей генеральной совокупности размером N :

Используя поправку Бесселя для расчета несмещенной оценки дисперсии генеральной совокупности по конечной выборке из n наблюдений, формула имеет следующий вид:

Следовательно, наивный алгоритм вычисления предполагаемой дисперсии имеет следующий вид:

  • Пусть n ← 0, Sum ← 0, SumSq ← 0
  • Для каждой системы координат x :
    • пп + 1
    • Сумма ← Сумма + x
    • SumSq ← SumSq + x × x
  • Var = (SumSq - (Сумма × Сумма) / n) / (n - 1)

Этот алгоритм можно легко адаптировать для вычисления дисперсии конечной совокупности: просто разделите на N вместо n  - 1 в последней строке.

Поскольку SumSq и (Sum × Sum) / n могут быть очень похожими числами, отмена может привести к тому, что точность результата будет намного меньше присущей точности арифметики с плавающей запятой, используемой для выполнения вычислений. Таким образом, этот алгоритм не следует использовать на практике [1] [2], и было предложено несколько альтернативных, численно устойчивых алгоритмов. [3] Это особенно плохо, если стандартное отклонение мало по сравнению со средним значением. Однако алгоритм можно улучшить, приняв метод предполагаемого среднего .

Вычисление сдвинутых данных [ править ]

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

с любой константой, что приводит к новой формуле

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

Если взять только первый образец, алгоритм можно записать на языке программирования Python как

def  shift_data_variance ( data ):  if  len ( data )  <  2 :  return  0.0  K  =  data [ 0 ]  n  =  Ex  =  Ex2  =  0.0  for  x  in  data :  n  =  n  +  1  Ex  + =  x  -  K  Ex2  + =  ( x  -  К )  *  ( х  -  К ) variance  =  ( Ex2  -  ( Ex  *  Ex )  /  n )  /  ( n  -  1 )  # используйте n вместо (n-1), если хотите вычислить точную дисперсию заданных данных  # используйте (n-1), если данные выборки большей  дисперсии доходности  населения

Эта формула также облегчает инкрементные вычисления, которые можно выразить как

К  =  п  =  Ex  =  Ex2  =  0,0def  add_variable ( x ):  глобальный  K ,  n ,  Ex ,  Ex2,  если  n  ==  0 :  K  =  x  n  + =  1  Ex  + =  x  -  K  Ex2  + =  ( x  -  K )  *  ( x  -  K )def  remove_variable ( x ):  глобальный  K ,  n ,  Ex ,  Ex2  n  - =  1  Ex  - =  x  -  K  Ex2  - =  ( x  -  K )  *  ( x  -  K )def  get_mean ():  global  K ,  n ,  Ex  return  K  +  Ex  /  ndef  get_variance ():  global  n ,  Ex ,  Ex2  return  ( Ex2  -  ( Ex  *  Ex )  /  n )  /  ( n  -  1 )

Двухпроходный алгоритм [ править ]

Альтернативный подход, использующий другую формулу для дисперсии, сначала вычисляет выборочное среднее,

а затем вычисляет сумму квадратов отличий от среднего,

где s - стандартное отклонение. Это дается следующим кодом:

def  two_pass_variance ( данные ):  n  =  sum1  =  sum2  =  0 для  x  в  данных :  n  + =  1  sum1  + =  x среднее  =  сумма1  /  п для  x  в  данных :  sum2  + =  ( x  -  среднее )  *  ( x  -  среднее ) дисперсия  =  сумма2  /  ( n  -  1 )  дисперсия возврата 

Этот алгоритм численно устойчив, если n мало. [1] [4] Однако результаты обоих этих простых алгоритмов («наивный» и «двухпроходный») могут чрезмерно зависеть от порядка данных и могут давать плохие результаты для очень больших наборов данных из-за многократного округления. ошибка в накоплении сумм. Такие методы, как скомпенсированное суммирование, могут использоваться для устранения этой ошибки в определенной степени.

Онлайн-алгоритм Велфорда [ править ]

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

Следующие формулы могут использоваться для обновления среднего значения и (оценочной) дисперсии последовательности для дополнительного элемента x n . Здесь x n обозначает выборочное среднее первых n выборок ( x 1 , ..., x n ), s2
п
их выборочная дисперсия, а σ2
п
их популяционная дисперсия.

Эти формулы страдают числовой нестабильностью, поскольку они многократно вычитают небольшое число из большого числа, которое масштабируется с n . Лучшее количество для обновления - это сумма квадратов отклонений от текущего среднего значения , здесь обозначается :

Этот алгоритм был найден Велфордом [5] [6] и был тщательно проанализирован. [2] [7] Также принято обозначать и . [8]

Пример реализации алгоритма Велфорда на Python приведен ниже.

# Для нового значения newValue вычислить новый счетчик, новое среднее значение, новое значение M2. # mean накапливает среднее значение всего набора данных # M2 объединяет квадрат расстояния от среднего # count объединяет количество образцов, замеченных на данный момент def  update ( existingAggregate ,  newValue ):  ( count ,  mean ,  M2 )  =  existingAggregate  count  + =  1  delta  =  newValue  -  среднее  значение  + =  delta  /  count  delta2  =  newValue  -  среднее значение M2  + =  delta  *  delta2  return  ( количество ,  среднее ,  M2 )# Получить среднее значение, дисперсию и дисперсию выборки из агрегата def  finalize ( existingAggregate ):  ( count ,  mean ,  M2 )  =  existingAggregate  if  count  <  2 :  return  float ( "nan" )  else :  ( mean ,  variance ,  sampleVariance )  =  ( среднее ,  M2  /  число ,  M2  /  ( число  -  1 )) return  ( среднее ,  дисперсия ,  sampleVariance )

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

Приведенный ниже параллельный алгоритм показывает, как объединить несколько наборов статистических данных, рассчитываемых в режиме онлайн.

Взвешенный инкрементальный алгоритм [ править ]

Алгоритм может быть расширен для обработки неравных весов выборок, заменив простой счетчик n суммой весов, наблюдаемой до сих пор. Уэст (1979) [9] предлагает следующий алгоритм увеличения :

def  weighted_incremental_variance ( data_weight_pairs ):  w_sum  =  w_sum2  =  среднее значение  =  S  =  0 for  x ,  w  в  data_weight_pairs :  # В качестве альтернативы "for x, w in zip (data, weights):"  w_sum  =  w_sum  +  w  w_sum2  =  w_sum2  +  w  *  w  mean_old  =  mean  mean  =  mean_old  +  ( w  /  w_sum )  *  ( x  -  среднее_старое )  S  =  S  +  w  *  ( x  -  среднее_старое )  *  ( x -  значит ) population_variance  =  S  /  w_sum  # Бесселя коррекции для взвешенных образцов  # Частотные веса  sample_frequency_variance  =  S  /  ( w_sum  -  1 )  # веса Надежность  sample_reliability_variance  =  S  /  ( w_sum  -  w_sum2  /  w_sum )

Параллельный алгоритм [ править ]

Чан и др. [10] обратите внимание, что онлайн-алгоритм Велфорда, описанный выше, является частным случаем алгоритма, который работает для объединения произвольных наборов и :

.

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

Метод Чана для оценки среднего численно нестабилен, когда и оба они велики, потому что числовая ошибка не уменьшается в масштабе, как в случае. В таких случаях предпочитайте .

def  parallel_variance ( n_a ,  avg_a ,  M2_a ,  n_b ,  avg_b ,  M2_b ):  n  =  n_a  +  n_b  delta  =  avg_b  -  avg_a  M2  =  M2_a  +  M2_b  +  delta  **  2  *  n_a  *  n_b  /  n  var_ab  =  M2  /  ( n  -  1 )  return  var_ab

Это можно обобщить, чтобы обеспечить распараллеливание с AVX , с графическими процессорами и компьютерными кластерами , а также на ковариацию. [3]

Пример [ править ]

Предположим, что все операции с плавающей запятой используют стандартную арифметику двойной точности IEEE 754 . Рассмотрим выборку (4, 7, 13, 16) из бесконечной совокупности. На основе этой выборки оценочное среднее значение совокупности составляет 10, а несмещенная оценка дисперсии совокупности - 30. И наивный алгоритм, и двухпроходный алгоритм вычисляют эти значения правильно.

Затем рассмотрим выборку ( 10 8  + 4 , 10 8  + 7 , 10 8  + 13 , 10 8  + 16 ), которая дает ту же оценку дисперсии, что и первая выборка. Двухпроходный алгоритм правильно вычисляет эту оценку дисперсии, но наивный алгоритм возвращает 29,333333333333332 вместо 30.

Хотя эта потеря точности может быть терпимой и рассматриваться как незначительный недостаток наивного алгоритма, дальнейшее увеличение смещения делает ошибку катастрофической. Рассмотрим образец ( 10 9  + 4 , 10 9  + 7 , 10 9  + 13 , 10 9  + 16 ). Опять же, оценочная дисперсия населения, равная 30, правильно вычисляется двухпроходным алгоритмом, но теперь простой алгоритм вычисляет ее как -170,66666666666666. Это серьезная проблема с наивным алгоритмом, которая возникает из-за катастрофической отмены при вычитании двух одинаковых чисел на заключительном этапе алгоритма.

Статистика высшего порядка [ править ]

Террибери [11] расширяет формулы Чана на вычисление третьего и четвертого центральных моментов , необходимых, например, при оценке асимметрии и эксцесса :

Здесь снова суммы степеней отличий от среднего , дающие

Для инкрементального случая (т.е. ) это упрощается до:

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

Пример онлайн-алгоритма эксцесса, реализованного, как описано, выглядит следующим образом:

def  online_kurtosis ( данные ):  n  =  среднее  =  M2  =  M3  =  M4  =  0 для  x  в  данных :  n1  =  n  n  =  n  +  1  delta  =  x  -  среднее значение  delta_n  =  delta  /  n  delta_n2  =  delta_n  *  delta_n  term1  =  delta  *  delta_n  *  n1  mean  =  mean  +  delta_n  M4  =  M4  +  term1  *  delta_n2  *  ( n * п  -  3 *n  +  3 )  +  6  *  delta_n2  *  M2  -  4  *  delta_n  *  M3  M3  =  M3  +  term1  *  delta_n  *  ( n  -  2 )  -  3  *  delta_n  *  M2  M2  =  M2  +  term1 # Обратите внимание, что вы также можете рассчитать дисперсию с помощью M2, а асимметрию - с помощью M3  # Внимание: если все входные данные одинаковы, M2 будет равно 0, что приведет к делению на 0.  Эксцесс  =  ( n  *  M4 )  /  ( M2  *  M2 )  -  3  обратных  эксцесса

Пеба [12] далее распространяет эти результаты на центральные моменты произвольного порядка , для инкрементального и попарного случаев, и впоследствии Пеба и др. [13] для взвешенных и составных моментов. Там же можно найти аналогичные формулы для ковариации .

Чой и Свитман [14] предлагают два альтернативных метода вычисления асимметрии и эксцесса, каждый из которых может существенно сэкономить требования к памяти компьютера и времени процессора в определенных приложениях. Первый подход заключается в вычислении статистических моментов путем разделения данных на интервалы и последующего вычисления моментов из геометрии полученной гистограммы, которая фактически становится однопроходным алгоритмом.для более высоких моментов. Одно из преимуществ состоит в том, что вычисления статистического момента могут выполняться с произвольной точностью, так что вычисления могут быть настроены с точностью, например, формата хранения данных или исходного измерительного оборудования. Относительная гистограмма случайной величины может быть построена обычным способом: диапазон потенциальных значений делится на интервалы, а количество вхождений в каждом интервале подсчитывается и наносится на график таким образом, чтобы площадь каждого прямоугольника равнялась части значений выборки. в этой корзине:

где и представляют частоту и относительную частоту в интервале, а - общая площадь гистограммы. После этой нормализации исходные моменты и центральные моменты могут быть рассчитаны по относительной гистограмме:

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

Второй подход Чоя и Свитмана [14] представляет собой аналитическую методологию для объединения статистических моментов из отдельных сегментов истории времени, так что результирующие общие моменты являются моментами полной истории времени. Эта методология может использоваться для параллельного вычисления статистических моментов с последующей комбинацией этих моментов или для комбинации статистических моментов, вычисляемых в последовательные моменты времени.

Если известны наборы статистических моментов: для , то каждый может быть выражен через эквивалентные необработанные моменты:

где обычно принимается длительность истории времени или количество точек, если оно постоянно.

Преимущество выражения статистических моментов в терминах в том, что наборы можно комбинировать путем сложения, и нет верхнего предела для значения .

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

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

Ковариация [ править ]

Для вычисления ковариации можно использовать очень похожие алгоритмы .

Наивный алгоритм [ править ]

Наивный алгоритм:

Для приведенного выше алгоритма можно использовать следующий код Python:

def  naive_covariance ( данные1 ,  данные2 ):  n  =  len ( данные1 )  sum12  =  0  sum1  =  sum ( data1 )  sum2  =  sum ( data2 ) для  i1 ,  i2  в  zip ( data1 ,  data2 ):  sum12  + =  i1  *  i2 ковариация  =  ( sum12  -  sum1  *  sum2  /  п )  /  п  возвращение  ковариационная

С оценкой среднего [ править ]

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

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

def  shift_data_covariance ( data_x ,  data_y ):  n  =  len ( data_x )  if  n  <  2 :  return  0  kx  =  data_x [ 0 ]  ky  =  data_y [ 0 ]  Ex  =  Ey  =  Exy  =  0  for  ix ,  iy  in  zip ( data_x ,  data_y ):  Ex  + =  ix  -  kx Ey  + =  iy  -  ky  Exy  + =  ( ix  -  kx )  *  ( iy  -  ky )  return  ( Exy  -  Ex  *  Ey  /  n )  /  n

Двухходовой [ править ]

Двухпроходный алгоритм сначала вычисляет выборочные средние, а затем ковариацию:

Двухпроходный алгоритм можно записать как:

def  two_pass_covariance ( данные1 ,  данные2 ):  n  =  len ( данные1 ) среднее1  =  сумма ( данные1 )  /  п  среднее2  =  сумма ( данные2 )  /  п ковариация  =  0 для  i1 ,  i2  в  zip ( data1 ,  data2 ):  a  =  i1  -  mean1  b  =  i2  -  mean2  covariance  + =  a  *  b  /  n  return  covariance

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

Онлайн [ править ]

Существует стабильный однопроходный алгоритм, подобный онлайн-алгоритму для вычисления дисперсии, который вычисляет сопомент :

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

Таким образом, ковариацию можно вычислить как

Защиту  online_covariance ( data1 ,  data2 ):  meanx  =  Meany  =  С  =  п  =  0  для  х ,  у  в  молнии ( DATA1 ,  data2 ):  п  + =  1  дх  =  х  -  meanx  meanx  + =  дх  /  п  Meany  + =  ( у  -  meany )  /  n  C  + =  dx  *  ( y  - meany ) population_covar  =  С  /  п  коррекции # Бесселя для образца дисперсии  sample_covar  =  С  /  ( п  -  1 )

Небольшая модификация также может быть сделана для вычисления взвешенной ковариации:

Защиту  online_weighted_covariance ( data1 ,  data2 ,  данные3 ):  meanx  =  Meany  =  0  wsum  =  wsum2  =  0  С  =  0  для  х ,  у ,  ш  в  молнии ( data1 ,  data2 ,  Data3 ):  wsum  + =  ш  wsum2  + =  ш  *  ш  дх  =  x  -  среднее  x среднее x  + =  ( w /  wsum )  *  dx  meany  + =  ( w  /  wsum )  *  ( y  -  средний )  C  + =  w  *  dx  *  ( y  -  средний ) population_covar  =  С  /  wsum  # Бесселя коррекции для образца дисперсии  # частот весов  sample_frequency_covar  =  С  /  ( wsum  -  1 )  # Надежность веса  sample_reliability_covar  =  С  /  ( wsum  -  wsum2  /  wsum )

Точно так же существует формула для объединения ковариаций двух наборов, которую можно использовать для распараллеливания вычислений: [3]

Пакетная взвешенная версия [ править ]

Также существует версия взвешенного онлайн-алгоритма, которая обновляет пакетно: пусть обозначит веса и напишет

Затем ковариацию можно вычислить как

См. Также [ править ]

  • Алгоритм суммирования Кахана
  • Квадратные отклонения от среднего
  • Ямартино метод

Ссылки [ править ]

  1. ^ а б Эйнарссон, Бо (2005). Точность и надежность научных вычислений . СИАМ. п. 47. ISBN 978-0-89871-584-2.
  2. ^ a b c Чан, Тони Ф .; Голуб, Джин Х .; Левек, Рэндалл Дж. (1983). «Алгоритмы вычисления дисперсии выборки: анализ и рекомендации» (PDF) . Американский статистик . 37 (3): 242–247. DOI : 10.1080 / 00031305.1983.10483115 . JSTOR 2683386 .  
  3. ^ a b c Шуберт, Эрих; Герц, Майкл (9 июля 2018 г.). Численно стабильное параллельное вычисление (ко) дисперсии . ACM. п. 10. DOI : 10,1145 / 3221269,3223036 . ISBN 9781450365055. S2CID  49665540 .
  4. ^ Хайэм, Николас (2002). Точность и устойчивость численных алгоритмов (2-е изд.) (Задача 1.10) . СИАМ.
  5. ^ Welford, BP (1962). «Примечание о методе расчета скорректированных сумм квадратов и произведений». Технометрика . 4 (3): 419–420. DOI : 10.2307 / 1266577 . JSTOR 1266577 . 
  6. ^ Дональд Э. Кнут (1998). Искусство программирования , том 2: Получисленные алгоритмы , 3-е изд., С. 232. Бостон: Аддисон-Уэсли.
  7. ^ Линг, Роберт Ф. (1974). «Сравнение нескольких алгоритмов для вычисления выборочных средних и вариантов». Журнал Американской статистической ассоциации . 69 (348): 859–866. DOI : 10.2307 / 2286154 . JSTOR 2286154 . 
  8. ^ http://www.johndcook.com/standard_deviation.html
  9. ^ Запад, DHD (1979). «Обновление оценок среднего и дисперсии: улучшенный метод». Коммуникации ACM . 22 (9): 532–535. DOI : 10.1145 / 359146.359153 . S2CID 30671293 . 
  10. ^ Чан, Тони Ф .; Голуб, Джин Х .; Левек, Рэндалл Дж. (1979), «Обновление формул и попарный алгоритм для вычисления выборочных вариантов». (PDF) , Технический отчет STAN-CS-79-773 , Департамент компьютерных наук, Стэнфордский университет .
  11. ^ Terriberry, Тимоти Б. (2007), Вычислительный высшего порядка Moments Интернет , архивируются с оригинала на 23 апреля 2014 года , восстановлена 5 мая 2008
  12. ^ Пеба, Филипп (2008), "Формулы для надежного, однопроходного параллельного вычисления ковариаций и статистических моментов произвольного порядка" (PDF) , Технический отчет SAND2008-6212 , Sandia National Laboratories [ постоянная мертвая ссылка ]
  13. ^ Пебах, Филипп; Террибери, Тимоти; Колла, Хемант; Беннетт, Джанин (2016), «Численно стабильные, масштабируемые формулы для параллельного и оперативного вычисления многомерных центральных моментов высокого порядка с произвольными весами» , Computational Statistics , Springer, 31 (4): 1305–1325, doi : 10.1007 / s00180- 015-0637-z , S2CID 124570169 
  14. ^ а б Чой, Мёнкен; Sweetman, Берт (2010), "Эффективное Расчет статистических моментов для мониторинга структурного здоровья", Журнал структурного здоровья Мониторинга , 9 (1): 13-24, DOI : 10,1177 / 1475921709341014 , S2CID 17534100 

Внешние ссылки [ править ]

  • Вайсштейн, Эрик В. "Расчет дисперсии выборки" . MathWorld .