Bir veri serisinin segmentlerini farklı eğrilere uyacak şekilde programlı olarak nasıl tespit edebilirim?


14

Belirli bir veri kümesinin bölümlerini en uygun farklı eğrilere ayırmak için belgelenmiş algoritmalar var mı?

Örneğin, bu veri grafiğine bakan çoğu insan bunu kolayca 3 parçaya böler: sinüzoidal segment, doğrusal segment ve ters üstel segment. Aslında, bu özel bir sinüs dalgası, bir çizgi ve basit bir üstel formülü ile yaptım.

Üç ayrı kısmı görünür olan veri grafiği

Bu tür parçaları bulmak için, daha sonra verilerin alt kümelerinin en iyi uyumu bir tür bileşik serisini yapmak için çeşitli eğrilere / çizgilere ayrı ayrı takılabilen mevcut algoritmalar var mı?

Her ne kadar örnekte segmentlerin uçları hemen hemen aynı hizaya gelse de, durum böyle olmayacaktır; ayrıca bir segment kesimindeki değerlerde ani bir sarsıntı olabilir. Belki de bu vakaları tespit etmek daha kolay olacaktır.

Güncelleme: İşte gerçek dünyadan küçük bir parça veri: Gerçek dünya haritası

Güncelleme 2: İşte alışılmadık derecede küçük bir gerçek dünya veri seti (sadece 509 veri noktası):

4,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235

Burada, normalde sahip olmayacağımız bir lüks olan noktalı çizgilerle işaretlenmiş bilinen bazı gerçek dünya öğesi kenarlarının yaklaşık konumu ile belirtilmiştir :

resim açıklamasını buraya girin

Bununla birlikte sahip olduğumuz bir lüks, gezidir: Benim durumumdaki veriler bir zaman serisi değil, mekânsal olarak ilişkilidir; bir veri kümesinin tamamını (genellikle 5000 - 15000 veri noktası) aynı anda analiz etmek mantıklıdır, devam eden bir şekilde değil.


1
ps CV'ye ilk gönderi; Ben bir yazılım geliştiricisiyim ve normalde daha fazla takılıyoruz. Yerel tabuları ihlal ettiğim için özür dilerim. Cevaplar için yaptığım aramaların çoğu buraya geldi, bu yüzden burası sormak için en iyi yer olacağını düşündüm.
whybird

Verileri neden göndermiyorsunuz ve sorunuzu örnek olarak cevaplamaya çalışacağım.
IrishStat

Bir olasılık, bir meta-model kullanarak tüm eğri ailesine aynı anda sığdırmak olabilir. İşleri daha kesin hale getirmek için, nihai amacınızın bu histogramı düzeltmek olduğunu varsayalım, örneğin bir KDE kullanın. Eğer çekirdek genişliği, alt ve üst sınırı üzerinde değişmesine izin verilir ki burada bir model kullanmak Sonra, KDE'de adresinin düz tahmininin daha hassas olacaktır kullanılan model olarak (3) -, burada denklem (2)x
user603

1
Örneği fikir mantıklı olacak şekilde inşa ettiniz: şimdiye kadar çok iyi. Gerçek histogramlarda, karmaşık bir şeklin örtüşen dağılımların bir karışımını yansıtması çok daha yaygındır: o zaman ilgi, genellikle ikna edici olmayan veya karışımlar hakkında düşünmenin doğru yolu olmayan gözlenen histogramdaki değişiklik noktalarında değildir. Bununla birlikte, "histogram" ı istatistik bilimlerinde standarttan çok daha geniş bir şekilde kullanmanız mümkündür, burada frekans veya olasılık dağılımı çubuk grafiği anlamına gelir (sadece).
Nick Cox

@IrishStat - olağan veri kümelerinin 5000 ila 15000 girişi vardır. Buraya özetlenmiş gerçek bir tane hazırlamaya çalışıyordum, ama bunun kötü bir örnek olduğu ortaya çıktı ve baştan başlamak zorunda kaldım. Öte yandan, bunu yapmak bana ilk başta desenleri aramak için veri yığınlarını yumuşatma ve ortalamaları açısından kısmi bir cevap vermeyi önerdi, daha sonra incelik için bu kadar teşekkürler :) Sadece 509 genişliğinde gerçek bir tane var. iyi olabilir gibi görünüyor; Bunu yapabildiğim zaman soruya ekleyeceğim.
whybird

Yanıtlar:


2

Soruyu yorumladığım, OP'nin HAC kalıntıları için değil, sağlanan örneklerin şekline / yöntemlerine uyan metodolojiler aramasıdır. Ayrıca, önemli insan veya analist müdahalesi gerektirmeyen otomatik rutinler istenmektedir. Bu konudaki vurgularına rağmen Box-Jenkins uygun olmayabilir, çünkü önemli analist katılımı gerektirmektedirler.

R modülleri, bu tip moment tabanlı olmayan desen eşleştirme için mevcuttur. Permütasyon dağılımı kümelenmesi, bir Max Planck Enstitüsü bilim adamı tarafından geliştirilen ve ana hatlarıyla belirlediğiniz kriterleri karşılayan böyle bir kalıp eşleştirme tekniğidir. Uygulaması zaman serisi verileri, ama bununla sınırlı değil. İşte R modülü için geliştirilmiş bir alıntı:

pdc: Zaman Serisinin Karmaşıklık Tabanlı Kümelenmesi için Bir R Paketi - Andreas Brandmaier

PDC'ye ek olarak, Eamon Keogh tarafından UC Irvine'de geliştirilen makine öğrenimi, iSax rutini de karşılaştırmaya değer.

Son olarak, Data Smashing: Data'da Gizlenen Düzenin Ortaya Çıkarılmasıyla ilgili şu çalışma varChattopadhyay ve Lipson tarafından. Akıllı unvanın ötesinde, işte ciddi bir amaç var. İşte özet: "Otomatik konuşma tanımadan sıra dışı yıldızları keşfetmeye, neredeyse tüm otomatik keşif görevlerinin altında yatan, veri akışlarını birbirleriyle karşılaştırabilme ve kontrast oluşturma, bağlantıları ve nokta aykırı değerlerini belirleme yeteneğidir. Önemli bir darboğaz, günümüzde çoğu veri karşılaştırma algoritmasının, verilerin hangi 'özelliklerinin' karşılaştırma için uygun olduğunu belirtmek için bir insan uzmana dayanmasıdır.İşte, keyfi kaynaklar arasındaki benzerliği tahmin etmek için yeni bir ilke öneriyoruz. ne alan bilgisi ne de öğrenme kullanan veri akışları, bu prensibin gerçek dünyadaki bir dizi zorlu problemden gelen verilerin analizine uygulanmasını gösteriyoruz, epileptik nöbetlere ait elektro-ensefalograf paternlerinin ayrıştırılması, kalp ses kayıtlarından anormal kardiyak aktivitenin saptanması ve ham fotometriden astronomik nesnelerin sınıflandırılması dahil. Tüm bu durumlarda ve herhangi bir alan bilgisine erişim olmadan, alan uzmanları tarafından geliştirilen özel algoritmalar ve sezgisel tarama ile elde edilen doğrulukla başabaş performans gösteriyoruz. Veri parçalama prensiplerinin, özellikle uzmanlar neyi arayacaklarını bilmediklerinde, giderek karmaşıklaşan gözlemlerin anlaşılmasına kapı açabileceğini öneriyoruz. " Tüm bu durumlarda ve herhangi bir alan bilgisine erişim olmadan, alan uzmanları tarafından geliştirilen özel algoritmalar ve sezgisel tarama ile elde edilen doğrulukla başabaş performans gösteriyoruz. Veri parçalama prensiplerinin, özellikle uzmanlar neyi arayacaklarını bilmediklerinde, giderek karmaşıklaşan gözlemlerin anlaşılmasına kapı açabileceğini öneriyoruz. " Tüm bu durumlarda ve herhangi bir alan bilgisine erişim olmadan, alan uzmanları tarafından geliştirilen özel algoritmalar ve sezgisel tarama ile elde edilen doğrulukla başabaş performans gösteriyoruz. Veri parçalama prensiplerinin, özellikle uzmanlar neyi arayacaklarını bilmediklerinde, giderek karmaşıklaşan gözlemlerin anlaşılmasına kapı açabileceğini öneriyoruz. "

Bu yaklaşım eğrisel uyumun çok ötesine geçer. Kontrol etmeye değer.


Teşekkür ederim - İstediğim şeyin analist müdahalesi olmadan otomatik olarak kümeler bulmak olduğu konusunda haklısın. Çalışmak istediğim şey için, 5000-15000 veri noktasının veri kümelerini, her birinin tolere edilebilir bir zaman diliminde yaklaşık 50000 gibi veri kümelerinin grupları üzerinde insan müdahalesi olmadan basit formüllere (tekrarlayanlar da dahil) iyi uyduğu kümelere ayırmam gerekecek. insanlar tarafından yerli bilgisayar donanımı.
whybird

Her kümeye hangi eğriye uyacak şekilde gelince, sınırları ne anlama geldiğini tespit ettikten sonra, sadece farklı modelleri (sinüs dalgası, polinom, üstel) denemek ve hangisinin daha iyi bir r ^ 2 verdiğini görmek yeterince basit.
whybird

2
Tamam, sanırım yanlış iletişim bundan kaynaklanıyor: Sax ve iSax, zaman serilerini saklamak ve işlemek için temsil biçimleridir, kümeleme veya segment / desen algılama algoritmaları değildir (OP'nin gönderisine göre). Cevabınızdaki anlayışım, Keogh'un SAX temsil formatına dayanan ve OP'nin sorununu ele alan bir algoritma bulmuş olmasıydı. Ama bence bu demek istediğin şey değil mi?
Zhubarb

2
Tamam, Keogh ulaşmak için gerek Bilmem ISAX ve Sax , bunlar zaman serisinin verimli madenciliği için temsil biçimleridir. Linkler onları açıklıyor. iSax yeni sürümdür. Cevabınızı yanlış anladığım için heyecanlandım, dolayısıyla sorular (bilgiçlik taslamadan değil) :).
Zhubarb

2
hiçbir şeyi gizlemeye çalışmıyordum, 'isax rutini' isax üzerinde çalışan bir algoritma olarak yorumladım. Açıklamanın ardından cevabınızın yeniden ifade edilmesi / değiştirilmesi gerektiğini öneriyorum.
Zhubarb

2

Bir zaman serisindeki değişim noktalarını tespit etmek için sağlam bir küresel ARIMA modelinin (kesinlikle model değişiklikleri ve sizin durumunuzdaki zaman içinde parametre değişiklikleri nedeniyle kusurlu) oluşturulması ve daha sonra bu modelin parametrelerindeki en önemli değişiklik noktasının belirlenmesi gerekir. 509 değerlerinizi kullanarak en önemli değişiklik noktası 353 periyodu civarındaydı. AUTOBOX'ta (geliştirmeye yardımcı olduğum) mevcut, özelleştirilmiş uygulamanız için lisanslanmış olabilecek bazı özel algoritmalar kullandım. Temel fikir, verileri iki parçaya ayırmaktır ve en önemli değişiklik noktasını bulduktan sonra, iki setin her birinde daha fazla değişiklik noktası belirlemek için iki zaman aralığının her birini ayrı ayrı analiz edin (1-352; 353-509). Bu, k alt kümeniz olana kadar tekrarlanır. Bu yaklaşımı kullanarak ilk adımı attım.resim açıklamasını buraya girin

resim açıklamasını buraya girin


153 ve 173 daha düşük P değerlerine sahip olduğunda neden 353 işaretlenir?
Nick Cox

@NickCox İyi soru! Harika yorum Tahmin amacıyla tüm fikir, en son (önemli) altkümeyi eski altkümeden ayırmaktır, bu yüzden 353 kazandı ... Burada amaçlar için gerçekten 173'ü seçer.
IrishStat

"EN SON ÖNEMLİ KIRILMA NOKTASI" başlığı hikayeyi anlatmaya çalışıyor
IrishStat

Teşekkür ederim! Bu gerçekten ilginç ve çok takdir ediliyor. Daha fazla bilgi için sizinle iletişim kuruyor olabilirim.
whybird

Açıklama için teşekkürler: fikir son notta gerçekten açıktır. (tesadüfen, 1990'ların başından beri program çıktısında çok fazla ÜST DURUM görmedim. "% 95 güven düzeyini", "ne anlama geldiğini varsayarak"% 5 önem seviyesine "değiştirmenizi öneririm.
Nick Cox

2

Ben iş parçacığının başlığının yanıltıcı olduğunu düşünüyorum: Yoğunluk fonksiyonlarını karşılaştırmak için değil, aslında bir zaman serisinde yapısal molalar arıyorsunuz. Bununla birlikte, zaman serilerinin toplam geçmişine bakarak bu yapısal kırılmaların yuvarlanma zamanı penceresinde mi yoksa arkada mı bulunacağını belirtmezsiniz. Bu anlamda sorunuz aslında bunun bir kopyası: Zaman serilerindeki yapısal kırılmaları tespit etmek için hangi yöntem?

Rob Hyndman tarafından bu bağlantıda belirtildiği gibi, R bu amaç için yapı değiştirme paketini sunmaktadır. Verilerinizle oynadım, ancak sonuçların hayal kırıklığı yarattığını söylemeliyim [ilk veri noktası gerçekten 4 veya 54 olması gerekiyordu?]:

raw = c(54,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235)
raw = log(raw+1)
d = as.ts(raw,frequency = 12)
dd = ts.intersect(d = d, d1 = lag(d, -1),d2 = lag(d, -2),d3 = lag(d, -3),d4 = lag(d, -4),d5 = lag(d, -5),d6 = lag(d, -6),d7 = lag(d, -7),d8 = lag(d, -8),d9 = lag(d, -9),d10 = lag(d, -10),d11 = lag(d, -11),d12 = lag(d, -12))

(breakpoints(d ~d1 + d2+ d3+ d4+ d5+ d6+ d7+ d8+ d9+ d10+ d11+ d12, data = dd))
>Breakpoints at observation number:
>151 
>Corresponding to breakdates:
>163 

(breakpoints(d ~d1 + d2, data = dd))
>Breakpoints at observation number:
>95 178 
>Corresponding to breakdates:
>107 190 

Paketin normal kullanıcısı değilim. Gördüğünüz gibi, verilere uyduğunuz modele bağlıdır. İle deney yapabilirsiniz

library(forecast)
auto.arima(raw)

size en uygun ARIMA modelini sunar.


Teşekkür ederim! Başından 'histogram' kelimesini düzenledim; Başlangıçta yanlış anlamıştım ve bir yoruma yanıt olarak daha önceki bir düzenlemede gövdeden kaldırdığımda başlığı düzenlemeyi unuttum.
whybird

Verilerim aslında bir dizi mekânsal olarak ilişkili verilerdir, zamana dayalı değildir ve genellikle düz bir çizgide veya hatta yeterince sık bir düzlemde mevcut olmayacaktır - ancak bazı temel seviyelerde aynı şekilde değerlendirilebileceğine haklısınız. yolu; Sanırım bu, önceki aramaların neden beklediğim cevapları bulamadığını gösteriyor.
whybird

Bu örnekteki ilk veri noktası gerçekten 4'tür, ancak önceki bir yapının sonuna varabilirdik ya da belki de gürültüydü; Bunu bir aykırı değer olarak bırakmaktan mutluluk duyarım, ama hangi sistemle karşılaşırsam yapayım böyle şeyler ile başa çıkmak zorunda kalacak.
whybird

Oh, ve analiz arkada. Açıklığa kavuşturmak için soruyu düzenleyeceğim.
whybird
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.