Zaman serisi verilerini yumuşatma


14

Uyku trendlerini analiz etmek ve isteğe bağlı olarak kullanıcıyı hafif uyku sırasında istenen bir zamana yakın uyandırmak için uyku sırasında ivmeölçer verilerini kaydeden bir android uygulaması inşa ediyorum.

Alarmın yanı sıra veri toplayan ve depolayan bileşeni zaten oluşturdum. Yine de uyku verilerini görüntüleme ve kaydetme canavarını gerçekten anlamlı ve açık bir şekilde ele almam gerekiyor, ki bu da tercihen analize de borç veriyor.

Birkaç resim iki bin kelime söylüyor: (Düşük rep nedeniyle sadece bir bağlantı gönderebilirim)

İşte filtrelenmemiş veriler, hareket toplamı, 30 saniyelik aralıklarla toplanır

Ve aynı veriler, hareketli ortalama yumuşatmanın kendi tezahürümle düzeltildi

her iki grafik de kalibrasyonu yansıtır - minimum 'gürültü' filtresi ve maksimum kesme filtresi ve alarm tetikleme seviyesi (beyaz çizgi) vardır

Ne yazık ki, bunların hiçbiri en uygun çözüm değildir - birincisi ortalama kullanıcı için anlaşılması biraz zor ve ikincisi, anlaşılması daha kolay olan, gerçekten olup bitenlerin çoğunu gizler. Özellikle ortalamalar hareket halindeki ani artışların ayrıntılarını ortadan kaldırır ve bence bunlar anlamlı olabilir.

Peki bu grafikler neden bu kadar önemli? Bu zaman serileri, gece boyunca kullanıcıya geri bildirim olarak görüntülenir ve daha sonra incelenmek / analiz etmek üzere saklanır. Yumuşatma ideal olarak bellek maliyetini düşürür (hem RAM hem de depolama) ve kaynak açlıktan uzak bu telefonlarda / cihazlarda oluşturmayı daha hızlı hale getirir.

Açıkça verileri düzeltmenin daha iyi bir yolu var- Hareketteki 'keskin' değişiklikleri anlamak ve hareketli ortalama yumuşamı değiştirmek için doğrusal regresyon kullanmak gibi bazı belirsiz fikirlerim var. Daha iyi çözülebilecek bir şeye kafa kafaya dalamadan önce gerçekten daha fazla rehberliğe ve girdiye ihtiyacım var.

Teşekkürler!

Yanıtlar:


16

İlk olarak, sıkıştırma ve analiz / sunum için gereklilikler aynı olmayabilir - gerçekten de analiz için tüm ham verileri tutmak ve çeşitli şekillerde dilimleme ve zar atma yeteneğine sahip olmak isteyebilirsiniz . Ve sizin için en iyi olan şey, ondan ne almak istediğinize çok bağlı olacaktır. Ancak deneyebileceğiniz birkaç standart numara var:

  • Ham veriler yerine farklılıklar kullanın
  • Düşük seviyeli gürültüyü gidermek için eşik değerini kullanın. (Küçük değişiklikleri yok saymak için farklılıkla birleştirin.)
  • Hareket yerine etkinlik düzeyini yakalamak için ortalamadan ziyade bir zaman aralığında varyans kullanın
  • Zaman tabanını sabit aralıklardan değişken uzunluktaki çalışmalara değiştirin ve bazı ölçütlerin sahip olduğu değişikliklerin tek bir veri noktası sırasına (örneğin, aynı yönde farklılıklar, bazı eşiklere kadar) birikin
  • Verileri gerçek değerlerden sıraya dönüştürün (örneğin, düşük, orta, yüksek); bunu tek tek numuneler yerine zaman bölmelerinde de yapabilirsiniz - örneğin, her 5 dakikalık uzatma için aktivite seviyesi
  • Hareketli ortalamanızdan daha incelikli bir şekilde pürüzsüzleştirmek için uygun bir evrişim çekirdeği * kullanın veya keskin değişiklikler gibi ilgi çekici özellikleri seçin.
  • Bir güç spektrumunu hesaplamak için bir FFT kütüphanesi kullanın

Sonuncusu sizin amaçlarınız için biraz pahalı olabilir, ancak muhtemelen "uyku ritimleri" ve bunun gibi bazı çok kullanışlı sunum seçenekleri sunar. (Android hakkında hiçbir şey bilmiyorum, ancak bazı / birçok / tüm ahizelerin yararlanabileceğiniz DSP donanımında yerleşik olabileceği düşünülebilir .)


* Dijital sinyal işlemede merkezi evrişimin ne olduğu göz önüne alındığında, çevrimiçi olarak erişilebilir bir giriş bulmak şaşırtıcı derecede zordur. Veya en az 3 dakika googling'de. Öneriler hoş geldiniz!


10

Spline ve loess dahil olmak üzere birçok parametrik olmayan yumuşatma algoritması vardır. Fakat ani değişiklikleri de düzeltirler. Düşük geçişli filtreler de öyle. Sanırım ani sıçramalara izin veren, ancak yine de gürültüyü yumuşatan dalgacık tabanlı bir pürüzsüz.

Check out Percival ve Walden (2000) ve ilgili Ar paketi . Bir java çözümü istemenize rağmen, R paketindeki algoritmalar açık kaynak kodludur ve bunları çevirebilirsiniz.


3

Bu, sorduğunuza biraz teğetseldir, ancak Kalman filtresine bir göz atmaya değer olabilir.


1

Savitzky-Golay düzgünleştirme iyi bir cevap olabilir. Her zaman penceresindeki verileri sabit sabitlerle çarpmaya çalışan bir kayan zaman penceresi (bu veriler üzerinde bir kıvrım) üzerinde yumuşatmanın en az karelerinin son derece verimli bir uygulamasıdır. Değerleri, türevleri, ikinci türevleri ve daha yükseklerini sığdırabilirsiniz.

Kayan zaman penceresinin boyutuna ve o zaman penceresindeki polinom uyum derecesine bağlı olarak sonuçların ne kadar dik olmasına izin vereceğinizi siz seçersiniz. Bu başlangıçta piklerin sonuçların önemli bir parçası olduğu kromatografi için geliştirilmiştir. SG yumuşatmanın arzu edilen bir özelliği, piklerin konumlarının korunmasıdır. Örneğin, kübik eğri uyumu olan 5 ila 11 noktalı bir pencere gürültüyü keser ancak yine de zirveleri korur.

Savitzky-Golay filtresi (sistem kontrol teorisi ve zaman serisi analizinden normal terminolojiye ve doğru düzgünleştirme olarak adlandırıldığı orijinal kağıdın hafif şiddetini yapıyor) olarak adlandırılmasına rağmen, Wikipedia'da iyi bir makale var. Ayrıca, Wikipedia makalesinde ikinci türev tahminlerine yönelik formüllerde bir hata olduğunu (üzerinde bir argüman) olduğunu unutmayın - bu makalenin Google Talk bölümüne bakın. EDIT: Wikipedia makalesi düzeltildi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.