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:
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).
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 .)
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
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]]
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.)
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:
(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.