Я намагаюся перетворити код matlab в numpy і зрозумів, що numpy має інший результат за допомогою функції std.
у матлабі
std([1,3,4,6])
ans = 2.0817
в numpy
np.std([1,3,4,6])
1.8027756377319946
Це нормально? І як мені з цим впоратися?
Я намагаюся перетворити код matlab в numpy і зрозумів, що numpy має інший результат за допомогою функції std.
у матлабі
std([1,3,4,6])
ans = 2.0817
в numpy
np.std([1,3,4,6])
1.8027756377319946
Це нормально? І як мені з цим впоратися?
Відповіді:
Функція NumPy np.std
приймає необов’язковий параметр ddof
: "Дельта градусів свободи". За замовчуванням це 0
. Встановіть 1
для отримання результату MATLAB:
>>> np.std([1,3,4,6], ddof=1)
2.0816659994661326
Щоб додати трохи більше контексту, під час обчислення дисперсії (стандартним відхиленням якої є квадратний корінь) ми, як правило, ділимо на кількість значень, які маємо.
Але якщо ми виділимо випадкову вибірку N
елементів із більшого розподілу і обчислимо дисперсію, поділ на N
може призвести до заниження фактичної дисперсії. Щоб це виправити, ми можемо зменшити число, яке ділимо на ( градуси свободи ), до числа менше, ніж N
(зазвичай N-1
). ddof
Параметр дозволяє змінити дільник на величину ми вказуємо.
Якщо не сказано інакше, NumPy обчислить зміщений оцінювач дисперсії ( ddof=0
, ділячи на N
). Це те, що вам потрібно, якщо ви працюєте з усім розподілом (а не з підмножиною значень, вибраних випадковим чином із більшого розподілу). Якщо ddof
вказано параметр, NumPy ділиться на N - ddof
.
Поведінка MATLAB за замовчуванням std
полягає у виправленні зміщення для дисперсії вибірки шляхом ділення на N-1
. Це дозволяє позбутися деяких (але, мабуть, не всіх) упереджень середньоквадратичного відхилення. Це, швидше за все, буде тим, що ви хочете, якщо ви використовуєте функцію на випадковій вибірці більшого розподілу.
Приємна відповідь @hbaderts дає подальші математичні подробиці.
Стандартне відхилення - це квадратний корінь з дисперсії. Дисперсія випадкової величини X
визначається як
Оцінювач дисперсії буде таким чином
де позначає середнє значення вибірки. Для випадково вибраних можна показати, що цей оцінювач сходиться не до реальної дисперсії, а до
Якщо ви вибрали випадковим чином вибірки та оцінили середнє значення та дисперсію вибірки, вам доведеться використовувати виправлений (неупереджений) оцінювач
яка сходиться до . Термін корекції також називають корекцією Бесселя.
Тепер за замовчуванням MATLABs std
обчислює неупереджений оцінювач із терміном корекції n-1
. Однак NumPy (як пояснив @ajcr) обчислює упереджений кошторисник без затримки за замовчуванням. Параметр ddof
дозволяє встановити будь-який термін виправлення n-ddof
. Встановивши значення 1, ви отримуєте той самий результат, що і в MATLAB.
Подібним чином MATLAB дозволяє додавати другий параметр w
, який визначає "схему зважування". Значення за замовчуванням, w=0
призводить до виправлення терміну n-1
(неупереджений оцінювач), тоді як для w=1
, лише n використовується як термін виправлення (зміщений оцінювач).
n
щоб знаходитись у верхній частині нотації підсумовування, вона входила всередину суми.
Для людей, які не чудові зі статистикою, спрощений посібник:
Включіть, ddof=1
якщо ви розраховуєте np.std()
для вибірки, взятої з вашого повного набору даних.
Переконайтеся, ddof=0
що ви розраховуєте np.std()
для повної сукупності
DDOF включений для зразків, щоб урівноважити зміщення, яке може мати місце у числах.
std([1 3 4 6],1)
це еквівалентно за замовчуванням NumPynp.std([1,3,4,6])
. Все це досить чітко пояснено в документації для Matlab та NumPy, тому я настійно рекомендую OP обов'язково прочитати їх у майбутньому.