Verilerin iki eğilimi vardır; bağımsız trend çizgileri nasıl çıkarılır?


34

Belirli bir şekilde sıralanmamış bir veri kümesine sahibim, ancak açıkça çizildiğinde iki farklı eğilime sahiptir. İki seri arasındaki net ayrım nedeniyle basit bir doğrusal regresyon burada yeterli olmaz. İki bağımsız doğrusal trend çizgisini elde etmenin basit bir yolu var mı?

Kayıt için Python kullanıyorum ve makine öğrenimi de dahil olmak üzere programlama ve veri analizi konusunda oldukça rahatım ama kesinlikle gerekliyse R'ye atlamaya hazırım.

görüntü tanımını buraya girin


6
Şimdiye kadarki en iyi cevap bunu grafik kağıdına yazdırmak ve bir kalem ve cetvel ve hesap makinesi kullanmak ...
jbbiomed

Belki çift yönlü eğimleri hesaplayabilir ve onları iki "eğim kümesi" olarak gruplandırabilirsiniz. Ancak, iki paralel eğiliminiz varsa bu başarısız olacaktır.
Thomas Jungblut

1
Kişisel bir deneyimim yok, ancak istatistik modellerinin incelemeye değer olacağını düşünüyorum . İstatistiksel olarak, grup etkileşimi olan doğrusal bir regresyon yeterli olacaktır (gruplandırılmış verileriniz olmadığını söylemediğiniz sürece, bu durumda biraz daha saçma ...)
Matt Parker

1
Ne yazık ki bu, etki verilerini değil kullanım verilerini ve aynı veri setine dahil edilmiş iki ayrı sistemden açıkça kullanılmasını gerektirir. İki kullanım modelini tanımlayabilmek istiyorum, ancak bir müşteri tarafından toplanan yaklaşık 6 yıllık bilgiyi temsil ettiği için geri dönüp veriyi toplayamıyorum.
12'de

2
Sadece emin olmak için: Müşterinizin hangi ölçümlerden hangi popülasyondan geldiğini gösteren herhangi bir ek veri yok mu? Bu, sizin veya müşterinizin sahip olduğu veya bulabileceği verilerin% 100'üdür. Ayrıca, 2012 veri toplama işleminiz parçalandı ya da sistemlerinizden biri ya da her ikisi de zeminden düştü. Trendin o noktaya kadar gelip gelmediğini merak ediyorum.
Wayne

Yanıtlar:


30

Sorununuzu çözmek için iyi bir yaklaşım, veri kümenizle ilgili varsayımlara uygun olasılıksal bir model tanımlamaktır. Senin durumunda, muhtemelen doğrusal regresyon modellerinin bir karışımını istiyorsun. Farklı veri bileşenlerini farklı karışım bileşenleriyle birleştirerek, bir gauss karışım modeline benzer bir "regresör karışımı" modeli oluşturabilirsiniz.

Başlamanız için bazı kodlar ekledim. Kod, iki regresörün bir karışımı için bir EM algoritması uygular (daha büyük karışımlara yayılması nispeten kolay olmalıdır). Kod rastgele veri kümeleri için oldukça sağlam görünüyor. Bununla birlikte, doğrusal regresyonun aksine, karışım modellerinin dışbükey olmayan hedefleri vardır, bu nedenle gerçek bir veri kümesi için farklı rasgele başlangıç ​​noktalarına sahip birkaç deneme çalıştırmanız gerekebilir.

import numpy as np
import matplotlib.pyplot as plt 
import scipy.linalg as lin

#generate some random data
N=100
x=np.random.rand(N,2)
x[:,1]=1

w=np.random.rand(2,2)
y=np.zeros(N)

n=int(np.random.rand()*N)
y[:n]=np.dot(x[:n,:],w[0,:])+np.random.normal(size=n)*.01
y[n:]=np.dot(x[n:,:],w[1,:])+np.random.normal(size=N-n)*.01


rx=np.ones( (100,2) )
r=np.arange(0,1,.01)
rx[:,0]=r

#plot the random dataset
plt.plot(x[:,0],y,'.b')
plt.plot(r,np.dot(rx,w[0,:]),':k',linewidth=2)
plt.plot(r,np.dot(rx,w[1,:]),':k',linewidth=2)

# regularization parameter for the regression weights
lam=.01

def em():
    # mixture weights
    rpi=np.zeros( (2) )+.5

    # expected mixture weights for each data point
    pi=np.zeros( (len(x),2) )+.5

    #the regression weights
    w1=np.random.rand(2)
    w2=np.random.rand(2)

    #precision term for the probability of the data under the regression function 
    eta=100

    for _ in xrange(100):
        if 0:
            plt.plot(r,np.dot(rx,w1),'-r',alpha=.5)
            plt.plot(r,np.dot(rx,w2),'-g',alpha=.5)

        #compute lhood for each data point
        err1=y-np.dot(x,w1)
        err2=y-np.dot(x,w2)
        prbs=np.zeros( (len(y),2) )
        prbs[:,0]=-.5*eta*err1**2
        prbs[:,1]=-.5*eta*err2**2

        #compute expected mixture weights
        pi=np.tile(rpi,(len(x),1))*np.exp(prbs)
        pi/=np.tile(np.sum(pi,1),(2,1)).T

        #max with respect to the mixture probabilities
        rpi=np.sum(pi,0)
        rpi/=np.sum(rpi)

        #max with respect to the regression weights
        pi1x=np.tile(pi[:,0],(2,1)).T*x
        xp1=np.dot(pi1x.T,x)+np.eye(2)*lam/eta
        yp1=np.dot(pi1x.T,y)
        w1=lin.solve(xp1,yp1)

        pi2x=np.tile(pi[:,1],(2,1)).T*x
        xp2=np.dot(pi2x.T,x)+np.eye(2)*lam/eta
        yp2=np.dot(pi[:,1]*y,x)
        w2=lin.solve(xp2,yp2)

        #max wrt the precision term
        eta=np.sum(pi)/np.sum(-prbs/eta*pi)

        #objective function - unstable as the pi's become concentrated on a single component
        obj=np.sum(prbs*pi)-np.sum(pi[pi>1e-50]*np.log(pi[pi>1e-50]))+np.sum(pi*np.log(np.tile(rpi,(len(x),1))))+np.log(eta)*np.sum(pi)
        print obj,eta,rpi,w1,w2

        try:
            if np.isnan(obj): break
            if np.abs(obj-oldobj)<1e-2: break
        except:
            pass

        oldobj=obj

    return w1,w2


#run the em algorithm and plot the solution
rw1,rw2=em()
plt.plot(r,np.dot(rx,rw1),'-r')
plt.plot(r,np.dot(rx,rw2),'-g')

plt.show()

25

Bu iş parçacığının başka bir yerinde, kullanıcı1149913, büyük bir tavsiye (olasılıksal bir model tanımlayın) ve güçlü bir yaklaşım (EM tahmini) için kod sunar. Ele alınması gereken iki konu var:

  1. Olasılıklı modelden ayrılmalarla nasıl başa çıkılacağı (2011-2012 verilerinde çok belirgin ve daha az eğimli noktaların dalgalanmalarında biraz belirgin).

  2. EM algoritması (veya başka bir algoritma) için iyi başlangıç ​​değerleri nasıl belirlenir?

# 2'ye hitap etmek için bir Hough dönüşümü kullanmayı düşünün . Bu, lineer özellikler genişletmek için bir Radon dönüşümü olarak verimli bir şekilde hesaplanabilen bir özellik algılama algoritmasıdır .

Kavramsal olarak, Hough dönüşümü satır kümelerini gösterir. Düzlemde bir çizgi, , eğimiyle parametrelendirilebilirxyx,yHough dönüşümünde. Orijinal çizimdeki özellikler ortak bir çizgi boyunca veya bir taneye yakın bir değere düştüğünde, Hough dönüşümünde ürettikleri eğri koleksiyonları, bu ortak çizgiye karşılık gelen ortak bir kesişme eğilimindedir. Hough dönüşümünde bu en yüksek yoğunluktaki noktaları bularak, orijinal soruna iyi çözümler okuyabiliriz.

Bu verilere başlamak için önce yardımcı malzemeleri (eksenler, onay işaretleri ve etiketler) kestim ve iyi bir ölçü için sağ altta açıkça görünen noktaları kırpıp alt eksen boyunca serpildi. (Bu malzeme kırpılmadığında, prosedür hala iyi çalışır, ancak aynı zamanda eksenleri, çerçeveleri, kenelerin doğrusal dizilerini, etiketlerin doğrusal dizilerini ve hatta alt eksende sporadik olarak yatan noktaları da algılar!)

img = Import["http://i.stack.imgur.com/SkEm3.png"]
i = ColorNegate[Binarize[img]]
crop2 = ImageCrop[ImageCrop[i, {694, 531}, {Left, Bottom}], {565, 467}, {Right, Top}]

(Bu ve kodun geri kalanı Mathematica'da .)

Kırpılmış görüntü

Bu görüntüdeki her noktaya, Hough dönüşümünde, burada görülebilen dar bir eğri aralığına karşılık gelir. Onlar sinüs dalgalarıdır:

hough2 = Radon[crop2, Method -> "Hough"]  // ImageAdjust

Hough dönüşümü

Bu, sorunun bir satır kümesi sorunu olduğu duygusunu görsel olarak ortaya koymaktadır : Hough dönüşümü, onu istediğimiz herhangi bir kümeleme yöntemini uygulayabileceğimiz bir nokta kümeleme sorununa indirgemektedir .

Bu durumda, kümeleme o kadar açıktır ki Hough dönüşümünün basit bir şekilde işlenmesi yeterli olmuştur. Dönüşümdeki en yoğun yoğunluktaki yerleri belirlemek için, kontrastı artırdım ve dönüşümü yaklaşık% 1 yarıçapı üzerinde bulanıklaştırdım: bu, orijinal görüntüdeki çizim noktalarının çaplarıyla karşılaştırılabilir.

blur = ImageAdjust[Blur[ImageAdjust[hough2, {1, 0}], 8]]

Bulanık dönüşüm

Sonucun eşik değeri, ortaları en yüksek yoğunluktaki noktaları makul şekilde belirleyen iki küçük bloğa daralttı: bunlar, yerleştirilmiş çizgileri tahmin ediyor.

comp = MorphologicalComponents[blur, 0.777]) // Colorize

( eşiği0.777 ampirik olarak bulundu: sadece iki bölge üretir ve ikisinin küçüğü neredeyse mümkün olduğunca küçüktür.)

Eşikli binarlanmış dönüşüm

Görüntünün sol tarafı 0 derecelik (yatay) bir yöne karşılık gelir ve soldan sağa baktığımızda, bu açı doğrusal olarak 180 dereceye çıkar. İnterpolasyon, iki bloğun sırasıyla 19 ve 57.1 derecede ortalandığını hesaplıyorum. Ayrıca blokları dikey pozisyonlardan engelleri okuyabiliriz. Bu bilgi başlangıçtaki uyumu verir:

width = ImageDimensions[blur][[1]];
slopes =  Module[{x, y, z}, ComponentMeasurements[comp, "Centroid"] /. 
          Rule[x_, {y_, z_}] :>  Round[((y - 1/2)/(width - 1))  180., 0.1]
  ]

{19., 57.1)

Benzer bir şekilde, bu eğimlere karşılık gelen kesişimleri hesaplayabilir ve bu uyarları elde edebilirsiniz:

Uygun çizgiler

(Kırmızı çizgi önceki resimdeki küçük pembe noktaya karşılık gelir ve mavi çizgi daha büyük su bloğuna karşılık gelir.)

Büyük ölçüde, bu yaklaşım ilk meseleyi otomatik olarak ele aldı: Doğrusallıktan sapmalar, en yüksek yoğunluktaki noktaları ortadan kaldırır, ancak genellikle onları çok fazla kaydırmaz. Açıkça ortaya çıkan noktalar, Hough dönüşümü sırasında işleme sonrası prosedürler sırasında kaybolan düşük seviyeli gürültüye katkıda bulunacaktır.

Bu noktada, bu tahminler, EM algoritması için veya bir olasılık en aza indirgeyici için başlangıç ​​değerleri olarak sağlayabilir (iyi tahminler verildiğinde hızlı bir şekilde birleşir). Yine de daha iyisi , yinelemeli yeniden değerlendirilen en küçük kareler gibi sağlam bir regresyon tahmincisi kullanmak olacaktır . Her noktaya bir regresyon ağırlığı sağlayabilir . Düşük ağırlıklar, bir noktanın bir çizgiye "ait olmadığını" gösterir. İstenirse, her noktayı doğru çizgisine atamak için bu ağırlıkları kullanın. Ardından, noktaları sınıflandırdıktan sonra, en küçük kareleri (veya diğer herhangi bir regresyon prosedürünü) iki nokta grubunda ayrı ayrı kullanabilirsiniz.


1
Resimler bin kelimeyi anlatıyor ve sizde 5 tane var. Bu, bu sorunun amacı için yaptığım hızlı bir grafikten inanılmaz bir eser. Kudos!
jbbiomed

2
Hough dönüşümü, bir görüntüdeki düz çizgileri tanımlamak için Computer Vision alanında yaygın olarak kullanılır. Neden istatistiklerde de kullanılmamalıdır? ;)
Lucas Reis

xy

Evet. Örneğin, aynı konudan gelip gelmediklerini tespit etmek için iki görüntüyü karşılaştırırken yer alan aykırı değerlerin miktarını düşünün. Ve hepsinden önemlisi, bunu gerçek zamanlı olarak yapmak zorunda olduğunuzu hayal edin. "Hız", Bilgisayar Vizyonunda çok önemli bir faktördür ve İstatistiklerde çok önemli değildir.
Lucas Reis,

@RoyalTS Kod snippet'lerinden birine düzeltme yapılması gerektiğine işaret ettiğiniz için teşekkür ederiz. Önerilen değişikliğinizi bulduğumda, reddedildi (doğru, çünkü tam olarak doğru değildi, ama boşver: Bir hata olduğunu fark ettiğiniz için minnettarım). rotationBaşlangıçta sıfıra ayarlanan referansı kaldırarak düzelttim ve bu nedenle hiçbir fark yaratmadım.
whuber

15

Bu soruyu başka bir soru ile bağlantılı olarak buldum . Aslında bu tür bir sorun hakkında akademik araştırma yaptım. Lütfen cevabımı kontrol edin "En küçük karekök" uyumu? Daha fazla ayrıntı için çoklu minimuma sahip bir montaj yöntemi .

whuber'in Hough dönüşümüne dayalı yaklaşımı, verdiğiniz gibi basit senaryolar için çok iyi bir çözümdür. Bu gibi daha karmaşık veriler içeren senaryolarda çalıştım:

veri ilişkilendirme sorunu - şeker veri seti

Ortak yazarlarım ve ben bunu bir "veri ilişkisi" sorunu olarak nitelendirdik. Çözmeye çalıştığınızda, asıl sorun tipik olarak muhtemel veri kombinasyonlarının üstel miktarından dolayı birleştiricidir.

Veri ilişkilendirme sorunu için " Gauss Sürecinin Örtüşen Karışımları " yayınımız var.N eğrilerinin genel sorununa yinelemeli bir teknikle yaklaştığımız, çok iyi sonuçlar veren " . Makalede bağlantılı olan Matlab kodunu bulabilirsiniz.

[Güncelleme] OMGP tekniğinin Python uygulaması GPClust kütüphanesinde bulunabilir. .

Dışbükey bir optimizasyon problemi elde etme problemini çözdüğümüz başka bir makalem var, ancak henüz yayınlanmadı 2 eğri için özeldir, bu nedenle verileriniz üzerinde mükemmel şekilde çalışacaktır. İlgileniyorsanız bana bildirin.


1
İki yıldan fazla bir zamandır bu orijinal ve değerli cevabı hiç kimsenin beğenmediğini görmek için üzgünüm. Bu arada, bahsettiğiniz son makale kabul edildi mi?
whuber

1
Belge, birkaç ay önce gerçekten kabul edildi. Buradan indirebilirsiniz gtas.unican.es/pub/378 . Bu aslında oldukça nadir bir sorundur (popülaritesinin eksikliğini açıklayabilir), ancak yine de ilginç uygulamalar bulmayı başardık. İsterseniz kağıdın sonundaki deneylere bir göz atın.
Steven,

2

user1149913 mükemmel bir cevabı (+1) var, ancak bana göre veri toplamanız 2011 yılının sonunda parçalandı, bu yüzden verilerinizin bu bölümünü kesmek zorunda kalacaksınız ve daha sonra bazı şeyleri farklı rasgele bir şekilde çalıştırmak zorunda kalacaksınız. ne elde ettiğinizi görmek için başlangıç ​​katsayıları.

İşleri yapmanın basit bir yolu, verilerinizi iki kümeye ayırmak ve ardından alıştığınız doğrusal model tekniğini kullanmak olacaktır. R, bu olurdulm işlev olacaktır.

Veya göze iki sıra yerleştirin. R'de kullanırdınabline yapmak için .

Verilerin karıştığı, aykırı değerlere sahip ve sonunda dağılmakta, ancak yan yana iki belirgin çizgileri var, o yüzden süslü bir yöntemin buna değeceğinden emin değilim.

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.