2011-06-21 10 views
5

Mam dwa zestawy danych w tym czasie (w formie wektorów) i wypisuję je na tej samej osi, aby zobaczyć, jak się ze sobą wiążą, a ja specjalnie zapisuję i szukam miejsc, w których oba wykresy mają podobny kształt (tj. miejsca, w których oba mają pozornie dodatni/ujemny gradient w przybliżeniu w tych samych odstępach). Przykład:Proces porównywania dwóch zestawów danych

enter image description here

tej pory pracuję przez dane graficznie, ale uświadomić sobie, że ponieważ ilość danych jest tak duża kreślenia za każdym razem Chcę sprawdzić, jak dwa zestawy korelują graficznie potrwa zbyt dużo czasu.

Czy są jakieś pomysły, skrypty lub funkcje, które mogą być przydatne w celu zautomatyzowania tego procesu?

+2

w zależności od charakteru danych, polecam wykonanie analizy częstotliwości za pomocą funkcji FFT. (Pamiętaj, aby zrozumieć, jak poprawnie skalować dane w domenie FFT!). Alternatywnie użycie czegoś tak prostego, jak błąd średniej kwadratu może być przydatne. Jeśli możesz powiedzieć więcej o naturze i pochodzeniu danych, być może będziemy mogli udzielić Ci lepszej porady. –

+0

@thron Zauważ, że aby uzyskać to, czego chce, musi znaleźć podobieństwo w fazie, a nie tylko częstotliwość między dwoma sygnałami. To nie jest trywialne. –

Odpowiedz

5

Pierwszą rzeczą, którą musisz przemyśleć, jest charakter kryteriów, które chcesz zastosować w celu ustalenia podobieństwa. Istnieje wiele różnych sposobów mierzenia podobieństwa, a im precyzyjniej możesz opisać to, co chcesz, aby "podobny" do znaczenia w twoim problemie, najłatwiej będzie wdrożyć bez względu na język programowania.

Mimo, że jest tu kilka rzeczy można spojrzeć na:

  • korelacji dwóch zbiorów danych
  • różnica pochodnej zbiorów danych (ale nie sądzę, że byłoby wystarczająco wytrzymałe)
  • analiza widmowa jak wymieniono przez @thron trzech
  • itp ...

Znając pochodzenie zestawów danych i ich zmienność mogą również pomóc w sformułowaniu wystarczająco mocnych algorytmów.

1

Pewnie. Wywołaj dwa wektory A i B.

1) (Opcjonalnie) Wygładź dane za pomocą prostego filtru uśredniającego (Matlab 'smooth') lub polecenia "filtruj". Spowoduje to pozbywanie się lokalnych zmian prędkości ("gradientu"), które wydają się być zasadniczo szumem (jak we wstępującym składniku czerwonego śladu)

2) Rozróżnić zarówno A, jak i B. Teraz bezpośrednio reprezentujesz prędkość każdego wektora (Matlab 'diff').

3) Dodaj dwa zróżnicowane wektory (elementowo). Zadzwoń do tego C.

4) Poszukaj wszystkich punktów w C, których wartość bezwzględna jest powyżej pewnego progu (będziesz musiał przeglądać dane, aby uzyskać dobry pomysł, co to powinno być). Punkty powyżej tego progu wskazują bardzo podobną prędkość.

5) Teraz poszukaj, gdzie po wysokiej wartości dodatniej w C następuje wysoka wartość ujemna lub odwrotnie. Pomiędzy tymi dwoma punktami będziesz miał podobne krzywe w A i B.

Uwaga: a) Możesz wykonać wygładzanie po kroku 3 zamiast po kroku 1. b) Re 5), możesz mieć sytuację, w której "wzniesienie" w twoich danych znajduje się na skraju wektora, a więc jest "przecięte na pół", a wektory schodzą do linii bazowej przed wejściem na kolejne wzgórze. Następnie 5) błędnie zidentyfikować wzgórze jako między początkowym zejściem a późniejszym wynurzeniem. Aby tego uniknąć, można również wymagać, aby punkty w A i B pomiędzy dwoma punktami podobieństwa prędkości miały wysokie wartości bezwzględne.

+0

Dziękuję, to wydaje się bardzo interesująca trasa! – user718531