Чи існує алгоритм для оцінки медіани, режиму, перекосу та / або ексцентричності набору значень, але який НЕ вимагає зберігання всіх значень відразу в пам'яті?
Я хотів би розрахувати основні статистичні дані:
- середнє: середнє арифметичне
- дисперсія: середнє значення квадратичних відхилень від середнього
- стандартне відхилення: квадратний корінь з дисперсії
- медіана: значення, яке відокремлює більшу половину чисел від меншої половини
- режим: найчастіше знайдене значення в наборі
- перекос: tl; лікар
- куртоз: tl; лікар
Основними формулами для обчислення будь-якої з них є арифметика середньої школи, і я їх знаю. Є також багато бібліотек статистики, які їх реалізують.
Моя проблема полягає у великій кількості (мільярди) значень у наборах, якими я обробляю: Працюючи в Python, я не можу просто скласти список або хеш з мільярдами елементів. Навіть якщо я писав це на мові C, масиви з мільярдами елементів не надто практичні.
Дані не сортуються. Це виробляється випадковим чином, на льоту, за допомогою інших процесів. Розмір кожного набору дуже мінливий, і розміри не будуть відомі заздалегідь.
Я вже зрозумів, як досить добре обробляти середнє значення та відхилення, перебираючи кожне значення в наборі в будь-якому порядку. (Насправді, у моєму випадку я беру їх у тому порядку, в якому вони генеруються.) Ось алгоритм, який я використовую, люб'язно http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm :
- Ініціалізуйте три змінні: count, sum і sum_of_squares
- Для кожного значення:
- Кількість приростів.
- Додайте значення до суми.
- Додайте квадрат значення до sum_of_squares.
- Поділіть суму на рахунок, зберігаючи як середнє значення змінної.
- Поділіть суму_квадратів на кількість, зберігаючи як змінну середнє_квадратиків.
- Середнє значення квадрата, зберігання як квадрат_значення.
- Відніміть квадрат_значень із середніх квадратів, зберігаючи як дисперсію.
- Вихідне середнє та дисперсія.
Цей "он-лайн" алгоритм має слабкі сторони (наприклад, проблеми з точністю, оскільки sum_of_squares швидко збільшується, ніж цілий діапазон або точність плаваючої функції), але в основному він дає мені те, що мені потрібно, без необхідності зберігати кожне значення в кожному наборі.
Але я не знаю, чи існують подібні методи для оцінки додаткової статистики (медіана, режим, перекос, ексцентричність). Я міг би жити з упередженим оцінювачем або навіть з методом, який певною мірою порушує точність, якщо пам’ять, необхідна для обробки значень N, значно менша за O (N).
Вказівка на існуючу бібліотеку статистики також допоможе, якщо бібліотека має функції для обчислення однієї або декількох з цих операцій "в режимі он-лайн".