Nie studiowałem statystyk przez ponad 10 lat (a potem tylko podstawowy kurs), więc może moje pytanie jest trochę trudne do zrozumienia.
W każdym razie chcę zmniejszyć liczbę punktów danych w serii. Oś X jest liczbą milisekund od początku pomiaru, a oś Y jest odczytem tego punktu.
Często istnieją tysiące punktów danych, ale może potrzebuję tylko kilkuset. Więc moje pytanie brzmi: jak dokładnie zmniejszyć liczbę punktów danych?
Jak nazywa się ten proces? (Więc mogę google go) Czy są jakieś preferowane algorytmy (zaimplementuję to w C #)
Mam nadzieję, że masz jakieś wskazówki. Przepraszam za brak odpowiedniej terminologii.
Edycja: Więcej szczegółów tutaj:
Surowe dane, które otrzymałem, to dane dotyczące tętna, w formie liczby milisekund od ostatniego uderzenia. Przed wykreśleniem danych obliczam liczbę milisekund z pierwszej próbki i bpm (uderzenia na minutę) w każdym punkcie danych (60000 / razyincelastbeat).
Chcę wizualizować dane, tj. Wykreślić je na wykresie liniowym. Chcę zmniejszyć liczbę punktów na wykresie z tysięcy do kilkuset.
Jedną z opcji byłoby obliczenie średniego bpm dla każdej sekundy w serii, a może co około 5 sekund. Byłoby to dość łatwe, gdybym wiedział, że będę mieć co najmniej jedną próbkę dla każdego z tych okresów (sekundy w odstępach 5-sekundowych).
źródło
Odpowiedzi:
Masz dwa problemy: zbyt wiele punktów i jak wygładzić pozostałe punkty.
Rozrzedzenie próbki
Jeśli masz zbyt wiele obserwacji przybywających w czasie rzeczywistym, zawsze możesz użyć prostego losowego próbkowania, aby rozrzedzić próbkę. Zauważ, że to również prawda, liczba punktów musiałaby być bardzo duża.
Załóżmy, że masz N punktów i chcesz tylko n z nich. Następnie wygeneruj n liczb losowych z dyskretnie jednolitego rozkładu U (0, N-1) . To byłyby punkty, których używasz.
Jeśli chcesz to zrobić sekwencyjnie, tj. W każdym punkcie decydujesz się go użyć, czy nie, po prostu zaakceptuj punkt z prawdopodobieństwem p . Więc jeśli ustawisz p = 0,01 , zaakceptowałbyś (średnio) 1 punkt na sto.
Jeśli twoje dane są nierównomiernie rozłożone i chcesz jedynie cienkie gęste obszary punktów, po prostu spraw, aby funkcja przerzedzania była nieco bardziej wyrafinowana. Na przykład zamiast p , co z:
gdzie jest liczbą dodatnią, a jest czasem od ostatniej obserwacji. Jeśli czas między dwoma punktami jest duży, tj. Duży , prawdopodobieństwo przyjęcia punktu będzie wynosić jeden. I odwrotnie, jeśli dwa punkty są blisko siebie, prawdopodobieństwo przyjęcia punktu wyniesie .λ t t 1 - p
Będziesz musiał eksperymentować z wartościami i .λ p
Wygładzanie
Być może coś w rodzaju prostego schematu średniej ruchomej. Lub możesz wybrać coś bardziej zaawansowanego, jak wygładzacz jądra (jak sugerowali inni). Musisz uważać, aby nie wygładzić zbyt wiele, ponieważ zakładam, że nagły spadek powinien zostać bardzo szybko zauważony w twoim scenariuszu.
Powinny być dostępne biblioteki C # dla tego rodzaju rzeczy.
Wniosek
W razie potrzeby cienkie, a następnie gładkie.
źródło
Cóż, myślę, że słowo, którego szukasz, to „próbkowanie”, ale nie jestem pewien, dlaczego chcesz to zrobić. Tysiące punktów danych to niewiele. A może chcesz po prostu wykreślić mniejszą liczbę równo rozmieszczonych punktów? Zwykle nazywa się to „binowaniem”.
Czy Twoim celem jest wygenerowanie wizualizacji? W takim przypadku możesz zachować surowe dane, wykreślić je jako wykres rozproszony, a następnie nałożyć jakąś centralną tendencję (linia regresji, splajn, cokolwiek) do komunikowania się, czym powinna być wiadomość takehome.
A może Twoim celem jest liczbowe podsumowanie wyników w jakiś sposób? W takim przypadku możesz bardziej szczegółowo wyjaśnić swój problem!
źródło
Obliczanie średnich prowadzi do innego zestawu danych niż po prostu zmniejszenie liczby punktów danych. Jeśli jedno uderzenie serca na minutę jest znacznie szybsze niż drugie uderzenie serca, utracisz sygnał podczas wygładzania.
Jeśli podsumujesz 125-125-0-125-125 jako 100, to historia, którą opowiadają dane, różni się poprzez wygładzanie.
Czasami serce nawet pomija uderzenia i uważam, że jest to wydarzenie, które jest interesujące, ale chce się przyjrzeć wykresom danych dotyczących tętna.
Proponuję zatem obliczyć odległość między dwoma punktami za pomocą wzoru podobnego
d=sqrt((time1-time2)^2 + (bpm1-bpm2))
.W swoim programie ustawiasz minimalną odległość. Następnie iterujesz swoje dane i po każdym punkcie usuwasz wszystkie kolejne punkty, dla których d jest mniejsze niż minimalna odległość.
Ponieważ jednostka czasu i bpm nie jest taka sama, możesz pomyśleć o tym, jak znaleźć sposób na znaczące skalowanie jednostek. Aby wykonać to zadanie poprawnie, powinieneś porozmawiać z lekarzami, którzy ostatecznie muszą zinterpretować twoje wykresy i zapytać ich, jakie informacje uważają za niezbędne.
źródło
Jeśli BPM pozostaje taki sam przez wiele próbek (lub zmienia się nieskończenie w sposób, w jaki się nie martwisz), możesz skrócić swoje dane do znaczącej cyfry, na której ci zależy, a następnie wykonać kodowanie długości.
Na przykład w R te dane:
ma to wyjście
źródło
Nie podajesz wystarczających informacji. Dlaczego chcesz zmniejszyć punkty danych? Kilka tysięcy to w dzisiejszych czasach nic.
Biorąc pod uwagę, że chcesz uzyskać ten sam wynik za każdym razem, gdy przeglądasz te same dane, być może chcesz po prostu pomnożyć średnie. Na osi x masz zmienne odstępy. Może próbujesz zachować spójność? W takim przypadku ustawisz szerokość pojemnika na około 50 ms lub 100, a następnie uśrednisz wszystkie znajdujące się tam punkty. Ustaw szerokość pojemnika tak dużą, jak potrzebujesz, aby zmniejszyć liczbę punktów danych do wymaganego rozmiaru zestawu.
Odpowiedź na pytanie, dlaczego pozbywasz się danych, jest naprawdę trudna.
źródło
Aby zmniejszyć liczbę punktów danych, możesz użyć algorytmu Ramera – Douglasa – Peuckera, który jest bardzo łatwy do zrozumienia i wdrożenia. Próbkowany sygnał będzie bardzo podobny do oryginalnego.
źródło