Bir serideki veri noktalarının sayısını nasıl azaltabilirim?


11

10 yılı aşkın bir süredir istatistik okumadım (ve sonra sadece temel bir kurs), bu yüzden belki de sorumu anlamak biraz zor.

Her neyse, yapmak istediğim bir serideki veri noktalarının sayısını azaltmak. X ekseni, ölçümün başlamasından bu yana geçen milisaniye sayısıdır ve y ekseni bu noktanın okumasıdır.

Genellikle binlerce veri noktası vardır, ancak sadece birkaç yüze ihtiyacım olabilir. Benim sorum şu: Veri noktası sayısını nasıl doğru bir şekilde azaltabilirim?

Sürece ne denir? (Bu yüzden google yapabilirim) Tercih edilen herhangi bir algoritma var mı (C # 'da uygulayacağım)

Umarım bazı ipuçları vardır. Doğru terminoloji eksikliğim için özür dilerim.


Edit: Daha fazla detay buraya gelir:

Elimde olan ham veri kalp atış hızı verileridir ve son vuruştan bu yana geçen milisaniye biçimindedir. Verileri çizmeden önce, ilk örnekten milisaniye sayısını ve her bir veri noktasındaki bpm'yi (dakikadaki vuruş sayısı) hesaplıyorum (60000 / timesincelastbeat).

Verileri görselleştirmek istiyorum, yani bir çizgi grafikte çizmek istiyorum. Grafikteki nokta sayısını binlerden yüzlere düşürmek istiyorum.

Bir seçenek, serideki her saniye için ortalama bpm'yi veya belki her 5 saniyede bir hesaplamak olabilir. Bu dönemlerin her biri için (5 saniyelik aralıklarla saniyeler) en az bir örneğimin olacağını bilseydim bu oldukça kolay olurdu.


Bunu unuttum: X ekseni boyunca noktalar değişen aralıklarla geliyor.

Anladığımdan emin değilim. Y ekseniniz yok mu?

Ah Üzgünüm. Yanlış yönlendirdim. Şimdi yukarıda değiştirdim.

Ayrıca biraz daha fazla bilgi vermeniz gerektiğini düşünüyorum. Örneğin, grafiği hala görselleştiremiyorum. Amacın ne?

Tamam üzgünüm. Yukarıda biraz daha ayrıntı ekledim.

Yanıtlar:


10

İki probleminiz var: çok fazla nokta ve kalan noktaları nasıl düzeltebileceğiniz.

Numunenizi inceltme

Gerçek zamanlı olarak gelen çok fazla gözleminiz varsa , örneğinizi inceltmek için her zaman basit rastgele örnekleme kullanabilirsiniz. Bunun da doğru olması için nokta sayısının çok büyük olması gerektiğini unutmayın.

N puanınız olduğunu ve yalnızca n tane istediğinizi varsayalım . Daha sonra ayrı bir üniform U (0, N-1) dağılımından n rasgele sayı üretin . Bunlar kullandığınız noktalar olacaktır.

Bunu sırayla yapmak istiyorsanız, yani her noktada kullanmaya veya kullanmayacağınıza karar verirseniz, p olasılığı olan bir noktayı kabul edin . Yani p = 0.01 ayarlarsanız, (ortalama olarak) yüzde 1 puan alırsınız.

Verileriniz eşit şekilde yayılmamışsa ve yalnızca yoğun nokta bölgelerini inceltmek istiyorsanız, inceltme işlevinizi biraz daha karmaşık hale getirin. Örneğin, p yerine , ne olacak:

1-ptecrübe(-λt)

Burada pozitif bir sayıdır ve son gözlemden bu yana geçen zamandır. İki nokta arasındaki süre büyükse, yani büyük , bir noktayı kabul etme olasılığı bir olacaktır. Tersine, iki nokta birbirine yakınsa, bir noktayı kabul etme olasılığı .λtt1-p

ve değerlerini denemeniz gerekir .λp

Yumuşatma

Muhtemelen basit bir hareketli ortalama tipi şeması gibi bir şey. Ya da (diğerleri önerdiği gibi) bir çekirdek pürüzsüz gibi daha gelişmiş bir şey için gidebilirsiniz . Sen çok fazla pürüzsüz değil dikkatli olmalısın, çünkü sen senaryo ani bir düşüş çok hızlı bir şekilde alınması gerektiğini varsayalım.

Bu tür şeyler için kullanılabilir C # kitaplıkları olmalıdır .

Sonuç

Gerekirse inceltin, sonra düzeltin.


Ah, ilginç, ama tahmin edilebilir olması gerekiyor, yani verileri her görüntülediğimde aynı sonuca sahip olmak.

Bu durumda, seçtiğiniz noktaların n dizinlerini oluşturun ve bu dizinleri saklayın.
csgillespie

Ya da örneklemeden önce tohumu RNG'ye saklayın.
Dirk Eddelbuettel

Dirk'in tohumla ilgili çözümü muhtemelen daha iyi bir seçenektir.
csgillespie

Her saniye için ortalamaları hesaplamak tamamdır, ancak belirli bir saniye için veri olmadığında ne yapmalıyım. Sanırım önceki ve sonraki saniyelerden bazı enterpolasyon yapabilirdim, ama bunun için bazı belirli (adlandırılmış) yöntemle harika olurdu, bu yüzden zaten icat edilmiş bir şey icat etmeye çalışmıyorum.

9

Bence aradığınız kelime "örnekleme" ama neden bunu yapmak istediğinizden emin değilim. Binlerce veri noktası çok fazla değil. Yoksa daha az sayıda eşit aralıklı nokta çizmek mi istiyorsunuz? Buna genellikle "binning" denir.

Hedefiniz bir görselleştirme oluşturmak mı? Bu durumda, ham verileri tutmak, bir dağılım grafiği olarak çizmek, ardından takehome mesajı ne olursa olsun iletişim kurmak için bir tür merkezi eğilimin (regresyon çizgisi, spline, ne olursa olsun) üst üste binmek isteyebilirsiniz.

Veya hedefiniz sonuçları bir şekilde sayısal olarak özetlemek mi? Bu durumda, sorununuzu daha ayrıntılı olarak açıklamak isteyebilirsiniz!


Evet, görselleştirme istediğim şey. Soruya biraz daha bilgi ekledim.

ham verilerin bir düzeltme çizgisi ile çizilmesi.
JoFrhwld

otuzlu ham veriyi düzleştirme çizgisiyle çizme --- BPM'deki değişikliği zaman içinde ayrı bir görselleştirme olarak da çizmek isteyebilirsiniz.
John

5

Ortalamaları hesaplamak, veri noktalarının sayısını azaltmaktan farklı bir veri kümesine yol açar. Dakikada bir kalp atışı, diğer kalp atımlarından çok daha hızlıysa, yumuşatma işleminiz sırasında sinyali kaybedersiniz.

Verilerin anlattığı hikayeden 125-125-0-125-125 değerini 100 olarak özetlerseniz, düzgünleştirmenizden farklı olur.

Bazen kalp atımları bile atlar ve bunun ilginç bir olayın çizilen kalp atış hızı verilerine bakmak istediğine inanıyorum.

Bu nedenle iki nokta arasındaki mesafeyi benzer bir formülle hesaplamanızı öneririm d=sqrt((time1-time2)^2 + (bpm1-bpm2)).

Programınızda minimum bir mesafe belirleyebilirsiniz. Sonra verilerinizi tekrarlarsınız ve her noktadan sonra d'nin minimum mesafenizden daha küçük olduğu tüm aşağıdaki noktaları silmiş olursunuz.

Zaman ve bpm birimi aynı olmadığından, birimleri anlamlı bir şekilde ölçeklendirmenin bir yolunu nasıl bulabileceğinizi düşünmek isteyebilirsiniz. Bu görevi doğru yapmak için, sonunda grafiklerinizi yorumlamak ve onlara hangi bilgilerin gerekli olduğunu düşündüklerini sormak zorunda olan doktorlarla konuşmalısınız.


İlginç paylaşım. Ben de buna bakacağım. Muhtemelen haklısın.

2

BPM birçok örnek üzerinde aynı kalıyorsa (veya endişelenmediğiniz bir şekilde sonsuz olarak değiştiriliyorsa) verilerinizi gerçekten önemsediğiniz önemli bir basamağa kısaltabilir ve daha sonra Çalışma Uzunluğu Kodlaması yapabilirsiniz.

Örneğin, R'de bu veriler:

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

bu çıktısı var

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

1

Yeterli bilgi sağlamıyorsunuz. Veri noktalarını neden azaltmak istiyorsunuz? Birkaç bin bu gün hiçbir şey değil.

Aynı verileri her görüntülediğinizde aynı sonucu istediğiniz göz önüne alındığında, belki de sadece ortalamaları bölmek istersiniz. X ekseninizde değişken boşluklar var. Belki de bunu tutarlı kılmaya çalışıyorsun? Bu durumda, belki de 50 msn veya 100'lük bir kutu genişliği ayarlayıp, oradaki tüm noktaların ortalamasını alırsınız. Veri noktalarını istediğiniz kümenin boyutuna küçültmek için bölme genişliğini gerektiği kadar büyük yapın.

Verilerden kurtulma nedeniniz olmadan cevaplamak gerçekten zor bir soru.


Tamam üzgünüm. Yukarıda biraz daha ayrıntı ekledim.

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.