Розрахунок нового стандартного відхилення з використанням старого стандартного відхилення після зміни набору даних


16

У мене є масив з реальних значень, який має середнє значення та стандартне відхилення . Якщо елемент масиву буде замінений іншим елементом , тоді буде нове значенняnμoldσoldxixj

μnew=μold+xj−xin

Перевага цього підходу полягає в тому, що він вимагає постійних обчислень незалежно від значення . Чи є якийсь підхід для обчислення використовуючи як обчислення використовуючи ?nσnewσoldμnewμold


Це домашнє завдання? Дуже подібне завдання було задано в нашому курсі математичної статистики ...
— krlmlr

2
@ user946850: Ні, це не домашнє завдання. Я веду дисертацію з еволюційного алгоритму . Я хочу використовувати стандартне відхилення як міру різноманітності населення. Просто шукаємо більш ефективне рішення.
— користувач

1
SD - це квадратний корінь дисперсії, який є лише середнім значенням квадрата (скоригованим кратним середнім значенням квадрата, яке ви вже знаєте, як оновити). Тому ті самі методи, які використовуються для обчислення середнього бігу, можуть застосовуватися без будь-яких кардинальних змін для обчислення дисперсії бігу. Насправді набагато складніші статистичні дані можна обчислити в Інтернеті за допомогою одних і тих же ідей: див. , Наприклад, теми на stats.stackexchange.com/questions/6920 та stats.stackexchange.com/questions/23481 .
— whuber

1
@whuber: про це йдеться у статті Вікіпедії для Variance , але також із приміткою про катастрофічне скасування (або втрату значущості), яке може статися. Це завищена чи реальна проблема для бігової дисперсії?
— krlmlr

Це чудове запитання. Якщо ви накопичуєте відхилення наївно, не заздалегідь відцентруючи їх, ви дійсно можете потрапити в проблеми. Проблема виникає, коли цифри величезні, але їх відмінність невелика. Наприклад, розглянемо серію точних вимірювань швидкості світла в м / с, як у 299792458.145, 299792457.883, 299792457.998, ...: їх дисперсія, яка становить приблизно 0,01, настільки мала в порівнянні з їх квадратиками, яка становить приблизно , цей необережний розрахунок (навіть у подвійній точності) призведе до нульової дисперсії: всі значущі цифри зникнуть. 1017
— whuber

Відповіді:


7

Розділ в статті Вікіпедії про «Алгоритми для обчислення дисперсії» показує , як обчислити дисперсію , якщо елементи додаються до вашими спостереженнями. (Нагадаємо, що стандартне відхилення є квадратним коренем дисперсії.) Припустимо, що ви додаєте до масиву, тодіxn+1

σnew2=σold2+(xn+1−μnew)(xn+1−μold).

EDIT : Наведена формула здається помилковою, дивіться коментар.

Тепер заміна елемента означає додавання спостереження та видалення іншого; обидва можна обчислити за формулою вище. Однак майте на увазі, що проблеми чисельної стійкості можуть виникнути; цитується стаття також пропонує чисельно стійкі варіанти.

Щоб вивести формулу самостійно, обчисліть використовуючи визначення варіації вибірки та заміну за формулою, яку ви надали, коли це доречно . Це дає вам врешті-решт, і, таким чином, формулу для задано та . У моєму позначенні я припускаю, що ви замінюєте елемент на :μ n e w σ 2 n e w - σ 2 o l d σ n e w σ o l d μ o l d x n x ′ n(n−1)(σnew2−σold2)μnewσnew2−σold2σnewσoldμoldxnxn′

σ2=(n−1)−1∑k(xk−μ)2(n−1)(σnew2−σold2)=∑k=1n−1((xk−μnew)2−(xk−μold)2)+ ((xn′−μnew)2−(xn−μold)2)=∑k=1n−1((xk−μold−n−1(xn′−xn))2−(xk−μold)2)+ ((xn′−μold−n−1(xn′−xn))2−(xn−μold)2)

в сумі перетворюється на щось залежне від , але ви повинні працювати рівняння трохи більше , щоб отримати акуратний результат. Це має дати вам загальну думку.xkμold


перша формула, яку ви подали, не здається правильною, це означає, що якщо менший / більший, то і від нового, і від старого значення дисперсія завжди збільшується, що не має сенсу. Він може збільшуватися або зменшуватися залежно від розподілу. xn+1
— Еммет Б

@EmmetB: Так, ти маєш рацію - це, мабуть, має бути На жаль, це зводить звідси всю мою дискусію, але я залишаю це для історичних цілей. Хоча ви можете редагувати. σnew2=n−1nσold2+1n(xn+1−μnew)(xn+1−μold).
— krlmlr

4

Виходячи з того, що, на мою думку, я читаю у пов'язаній статті Вікіпедії, ви можете підтримувати стандартне відхилення "працює":

real sum = 0;
int count = 0;
real S = 0;
real variance = 0;

real GetRunningStandardDeviation(ref sum, ref count, ref S, x)
{
   real oldMean;

   if (count >= 1)
   {
       real oldMean = sum / count;
       sum = sum + x;
       count = count + 1;
       real newMean = sum / count;

       S = S + (x-oldMean)*(x-newMean)
   }
   else
   {
       sum = x;
       count = 1;
       S = 0;         
   }

   //estimated Variance = (S / (k-1) )
   //estimated Standard Deviation = sqrt(variance)
   if (count > 1)
      return sqrt(S / (count-1) );
   else
      return 0;
}

Хоча в статті вони не підтримують окремий хід sumі count, але замість того, щоб мати єдиний mean. Оскільки в тому, що я роблю сьогодні, я зберігаю count(для статистичних цілей), корисніше щоразу обчислювати кошти.


0

Враховуючи початкові , і , а також зміну заданого елемента на , я вважаю, що вашим новим стандартним відхиленням буде квадратний корінь де , а позначає нове значення.x¯snxnxn′s′

s2+1n−1(2nΔx¯(xn−x¯)+n(n−1)(Δx¯)2),
Δx¯=x¯′−x¯x¯′

Можливо, є химерніший спосіб його написання?

Я перевірив це на невеликому тестовому випадку, і, здавалося, він працює.


1
@john / свист у темряві: мені сподобалась ваша відповідь, здається, що вона працює належним чином у моєму невеликому наборі даних. Чи є математична основа / посилання на неї? Не могли б ви допомогти?
— Алок Чоуддурі

Питання було все @Whistling in the Dark, я просто прибирав його для сайту. Ви повинні поставити нове запитання з посиланням на питання та відповідь тут. А також вам слід підтримати цю відповідь, якщо ви так почуваєтесь.
— Іван
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.