Як зменшити кількість точок даних у серії?


11

Я не вивчав статистику більше 10 років (а потім просто основний курс), тому, можливо, моє питання трохи важко зрозуміти.

У будь-якому випадку, я хочу зробити це зменшити кількість точок даних у серії. Вісь x - це кількість мілісекунд від початку вимірювання, а вісь y - це показник для цієї точки.

Часто є тисячі точок даних, але мені може знадобитися лише кілька сотень. Тому моє запитання таке: як я можу точно зменшити кількість точок даних?

Як називається процес? (Тож я можу погуглювати його) Чи є переважні алгоритми (я буду реалізовувати його в C #)

Сподіваюся, у вас з’явилися підказки. Вибачте за мою відсутність належної термінології.


Редагувати: Більше інформації тут:

Неотримані дані, які я отримав, - це дані про серцебиття, у вигляді кількості мілісекунд з моменту останнього удару. Перш ніж будувати дані, я обчислюю кількість мілісекунд від першого зразка і bpm (удари в хвилину) в кожній точці даних (60000 / timeincelastbeat).

Я хочу візуалізувати дані, тобто побудувати їх у лінійному графіку. Я хочу зменшити кількість точок на графіку з тисяч до декількох сотень.

Одним із варіантів було б обчислити середній bpm за кожну секунду в серії, а може, кожні 5 секунд або близько того. Це було б досить просто, якби я знав, що маю принаймні один зразок для кожного з цих періодів (секунди з інтервалом 5 секунд).


Я забув це: точки вздовж осі x приходять з різним проміжком.

Я не впевнений, що розумію. У вас немає осі у?

Ах, вибачте. Я помилково вводив. Зараз я змінив це вище.

Я також думаю, що вам потрібно надати трохи більше інформації. Наприклад, я досі не можу візуалізувати графік. Яка ваша мета?

Добре вибач. Я додав ще кілька деталей вище.

Відповіді:


10

У вас є дві проблеми: занадто багато очок і як згладити точки, що залишилися.

Витончення вашого зразка

Якщо у вас є надто багато спостережень, які надходять у режимі реального часу, ви завжди можете використати просту випадкову вибірку для розрідження зразка. Зауважте, щоб це теж було правдою, кількість балів мала б бути дуже великою.

Припустимо, у вас N балів, і ви хочете лише n з них. Потім генеруйте n випадкових чисел з дискретного рівномірного розподілу U (0, N-1) . Це були б точки, якими ви користуєтесь.

Якщо ви хочете робити це послідовно, тобто у кожному пункті ви вирішили використовувати його чи ні, просто прийміть точку з ймовірністю p . Тож якщо ви встановите p = 0,01, ви приймете (в середньому) 1 бал із сотні.

Якщо ваші дані нерівномірно розповсюджені і ви хочете лише розрізати щільні ділянки точок, тоді просто зробіть функцію проріджування дещо складнішою. Наприклад, замість p , що робити:

1pexp(λt)

де λ додатне число і t- час з моменту останнього спостереження. Якщо час між двома точками великий, тобто великийt, ймовірність прийняття бала буде одна. І навпаки, якщо дві точки будуть близько один від одного, ймовірність прийняття точки буде1p.

Вам потрібно буде експериментувати зі значеннями λ і p.

Згладжування

Можливо, щось на зразок простої схеми ковзаючого середнього типу. Або ви можете зайнятись чимось більш досконалим, як ядро більш гладке (як запропонували інші). Вам потрібно бути обережним, щоб ви не розгладжували занадто сильно, оскільки я припускаю, що у вашому сценарії раптове падіння повинно підібратись дуже швидко.

Для такого роду матеріалів повинні бути наявні бібліотеки C # .

Висновок

Якщо потрібно, тонкі, потім гладкі.


Ах, цікаво, але мені потрібно, щоб він був передбачуваним, тобто мав однаковий результат кожного разу при перегляді даних.

У цьому випадку генеруйте n індексів обраних вами точок та зберігайте ці індекси.
csgillespie

Або зберігайте насіння в РНГ перед відбором проб.
Дірк Еддельбюттель

Рішення Дірка щодо насіння, мабуть, кращий варіант.
csgillespie

Обчислювати середні показники в секунду - це нормально, але що я роблю, коли немає даних за конкретну секунду. Я думаю, я міг би зробити якусь інтерполяцію за секунди до і після неї, але це було б чудово з певним (названим) методом для цього, тому я не намагаюся вигадувати щось вже придумане.

9

Ну, я думаю, що слово, яке ви шукаєте, - це "вибірки", але я не впевнений, чому ви хочете це зробити. Тисячі точок даних не дуже багато. Або ви хочете просто побудувати меншу кількість однаково розташованих точок? Зазвичай це називається "бінінг".

Ваша мета створити візуалізацію? У такому випадку ви можете зберегти необроблені дані, розмістити їх як розсип, а потім накладати якусь центральну тенденцію (лінія регресії, сплайн, будь-яка інша) для спілкування незалежно від того, яке повідомлення повинне бути.

Або ваша мета чисельним чином підсумовувати результати? У такому випадку ви можете пояснити свою проблему детальніше!


Так, візуалізація - це те, що я хочу. Я додав ще трохи інформації у запитання.

накреслення графіків необроблених даних за допомогою лінії згладжування.
JoFrhwld

третє розміщення графіків необроблених даних за допомогою лінії згладжування --- Можливо, ви хочете також змінити показник BPM з часом як окрему візуалізацію.
Джон

5

Обчислення середніх показників призводить до іншого набору даних, ніж просто зменшення кількості точок даних. Якщо одне серцебиття в хвилину відбувається набагато швидше, ніж друге серце, ви втратите сигнал у процесі згладжування.

Якщо ви підсумуєте 125-125-0-125-125 як 100, ніж історія, яку розповідають дані, відрізняється через ваше згладжування.

Іноді серце навіть пропускає ритми, і я вважаю, що це цікава подія, однак хоче переглянути деталізовані дані про серцебиття.

Тому я б запропонував обчислити відстань між двома точками за такою формулою d=sqrt((time1-time2)^2 + (bpm1-bpm2)).

Ви встановлюєте мінімальну відстань у своїй програмі. Потім ви повторюєте свої дані і після кожної точки ви видаляєте всі наступні точки, для яких d менша від вашої мінімальної відстані.

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


Цікава публікація. Я також розберуся на це. Ви, мабуть, праві.

2

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

Наприклад, в R ці дані:

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

має цей вихід

rle(data)
Run Length Encoding
  lengths: int [1:3] 10 15 15
  values : num [1:3] 0 1 2

1

Ви не надаєте достатньо інформації. Чому ви хочете зменшити точки даних. Кілька тисяч - це нічого.

З огляду на те, що ви хочете отримувати однаковий результат кожного разу при перегляді одних і тих же даних, можливо, ви хочете просто поповнити середні показники. На вашій осі x є змінний інтервал. Можливо, ви намагаєтесь зробити це послідовним? У такому випадку ви встановите ширину відро для, можливо, 50 мсек або 100, а потім середнє значення всіх точок. Зробіть ширину контейнера такою великою, як вам потрібно, щоб зменшити точки даних до потрібного набору.

На це справді важко відповісти без причини, чому ви позбавляєтесь даних.


Добре вибач. Я додав ще кілька деталей вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.