Altrove in questo thread, user1149913 fornisce ottimi consigli (definire un modello probabilistico) e codice per un approccio potente (stima EM). Rimangono due questioni da affrontare:
Come far fronte alle deviazioni dal modello probabilistico (che sono molto evidenti nei dati 2011-2012 e in qualche modo evidente nelle ondulazioni dei punti meno inclinati).
Come identificare buoni valori iniziali per l'algoritmo EM (o qualsiasi altro algoritmo).
Per indirizzare il numero 2, considera l'utilizzo di una trasformazione di Hough . Questo è un algoritmo di rilevamento delle caratteristiche che, per trovare tratti lineari di caratteristiche, può essere calcolato in modo efficiente come trasformata di Radon .
xyx,ynella trasformazione di Hough. Quando le caratteristiche nella trama originale cadono lungo una linea comune, o abbastanza vicine a una, le raccolte di curve che producono nella trasformazione di Hough tendono ad avere un'intersezione comune corrispondente a quella linea comune. Trovando questi punti di massima intensità nella trasformazione di Hough, possiamo leggere buone soluzioni al problema originale.
Per iniziare con questi dati, ho prima ritagliato le cose ausiliarie (assi, segni di spunta ed etichette) e per buona misura ho ritagliato i punti ovviamente periferici in basso a destra e cosparso lungo l'asse inferiore. (Quando quella roba non viene ritagliata, la procedura funziona ancora bene, ma rileva anche gli assi, i frame, le sequenze lineari di tick, le sequenze lineari di etichette e persino i punti che si trovano sporadicamente sull'asse inferiore!)
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}]
(Questo e il resto del codice sono in Mathematica .)
Ad ogni punto in questa immagine corrisponde una ristretta gamma di curve nella trasformata di Hough, visibile qui. Sono onde sinusoidali:
hough2 = Radon[crop2, Method -> "Hough"] // ImageAdjust
Ciò rende visivamente evidente il senso in cui la domanda è un problema di raggruppamento di linee : la trasformazione di Hough la riduce a un problema di raggruppamento puntuale , al quale possiamo applicare qualsiasi metodo di raggruppamento che ci piace.
In questo caso, il clustering è così chiaro che è sufficiente la semplice post-elaborazione della trasformazione di Hough. Per identificare le posizioni di maggiore intensità nella trasformazione, ho aumentato il contrasto e sfocato la trasformazione su un raggio di circa l'1%: è paragonabile ai diametri dei punti della trama nell'immagine originale.
blur = ImageAdjust[Blur[ImageAdjust[hough2, {1, 0}], 8]]
Limitando il risultato lo si restringeva a due piccole chiazze i cui centroidi identificano ragionevolmente i punti di maggiore intensità: stimano le linee adattate.
comp = MorphologicalComponents[blur, 0.777]) // Colorize
0,777
Il lato sinistro dell'immagine corrisponde a una direzione di 0 gradi (orizzontale) e, osservando da sinistra a destra, tale angolo aumenta linearmente a 180 gradi. Interpolando, computo che i due blob sono centrati rispettivamente a 19 e 57,1 gradi. Possiamo anche leggere le intercettazioni dalle posizioni verticali delle chiazze. Questa informazione fornisce gli adattamenti iniziali:
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}
In modo simile si possono calcolare le intercettazioni corrispondenti a queste pendenze, dando questi accoppiamenti:
(La linea rossa corrisponde al puntino rosa nella figura precedente e la linea blu corrisponde alla goccia d'acqua più grande.)
In larga misura, questo approccio ha affrontato automaticamente il primo problema: le deviazioni dalla linearità macchiano i punti di maggiore intensità, ma in genere non li spostano molto. I punti francamente periferici contribuiranno al rumore di basso livello durante la trasformazione di Hough, che scomparirà durante le procedure di post-elaborazione.
A questo punto si possono fornire queste stime come valori iniziali per l'algoritmo EM o per un minimizzatore di probabilità (che, date buone stime, convergeranno rapidamente). Meglio, però, sarebbe usare un robusto stimatore della regressione come i minimi quadrati ripetutamente pesati . È in grado di fornire un peso di regressione in ogni punto. Pesi bassi indicano che un punto non "appartiene" a una linea. Sfruttare questi pesi, se lo si desidera, per assegnare ciascun punto alla propria linea. Quindi, dopo aver classificato i punti, è possibile utilizzare i minimi quadrati ordinari (o qualsiasi altra procedura di regressione) separatamente sui due gruppi di punti.