Di tempat lain di utas ini, user1149913 memberikan saran yang bagus (mendefinisikan model probabilistik) dan kode untuk pendekatan yang kuat (estimasi EM). Masih ada dua masalah yang harus diatasi:
Bagaimana cara mengatasi penyimpangan dari model probabilistik (yang sangat jelas dalam data 2011-2012 dan agak jelas dalam undulasi dari titik yang kurang miring).
Cara mengidentifikasi nilai awal yang baik untuk algoritma EM (atau algoritma lainnya).
Untuk mengatasi # 2, pertimbangkan untuk menggunakan transformasi Hough . Ini adalah algoritma pendeteksian fitur yang, untuk menemukan peregangan linier fitur, dapat secara efisien dihitung sebagai transformasi Radon .
xyx,ydalam transformasi Hough. Ketika fitur dalam plot asli jatuh di sepanjang garis umum, atau cukup dekat dengan satu, maka koleksi kurva yang mereka hasilkan dalam transformasi Hough cenderung memiliki persimpangan umum yang sesuai dengan garis umum itu. Dengan menemukan titik-titik dengan intensitas terbesar dalam transformasi Hough, kita dapat membacakan solusi yang baik untuk masalah aslinya.
Untuk memulai dengan data ini, saya pertama-tama memangkas hal-hal tambahan (sumbu, tanda centang, dan label) dan untuk ukuran yang baik memangkas titik-titik yang jelas-jelas terpencil di kanan bawah dan menaburkan di sepanjang sumbu bawah. (Ketika hal-hal itu tidak dipotong, prosedur masih bekerja dengan baik, tetapi ia juga mendeteksi sumbu, bingkai, urutan linier kutu, urutan linier label, dan bahkan titik-titik yang terletak secara sporadis pada sumbu bawah!)
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}]
(Ini dan sisa kode ada di Mathematica .)
Untuk setiap titik dalam gambar ini sesuai dengan rentang sempit kurva dalam transformasi Hough, terlihat di sini. Mereka adalah gelombang sinus:
hough2 = Radon[crop2, Method -> "Hough"] // ImageAdjust
Ini membuat secara visual memanifestasikan arti di mana pertanyaannya adalah masalah pengelompokan garis : transformasi Hough menguranginya menjadi masalah pengelompokan titik , di mana kita dapat menerapkan metode pengelompokan apa pun yang kita suka.
Dalam hal ini, pengelompokan sangat jelas sehingga pasca-pemrosesan sederhana dari transformasi Hough sudah memadai. Untuk mengidentifikasi lokasi dengan intensitas terbesar dalam transformasi, saya meningkatkan kontras dan mengaburkan transformasi pada radius sekitar 1%: itu sebanding dengan diameter titik plot pada gambar asli.
blur = ImageAdjust[Blur[ImageAdjust[hough2, {1, 0}], 8]]
Thresholding hasilnya mempersempitnya menjadi dua gumpalan kecil yang sentroidnya cukup mengidentifikasi titik-titik intensitas terbesar: ini memperkirakan garis yang pas.
comp = MorphologicalComponents[blur, 0.777]) // Colorize
0,777
Sisi kiri gambar sesuai dengan arah 0 derajat (horizontal) dan, seperti yang kita lihat dari kiri ke kanan, sudut itu meningkat secara linear hingga 180 derajat. Interpolasi, saya menghitung bahwa kedua gumpalan itu berpusat pada 19 dan 57,1 derajat, masing-masing. Kita juga dapat membacakan intersepsi dari posisi vertikal gumpalan. Informasi ini menghasilkan kecocokan awal:
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}
Dengan cara yang sama, seseorang dapat menghitung intersep yang sesuai dengan lereng ini, memberikan kesesuaian ini:
(Garis merah sesuai dengan titik merah muda kecil pada gambar sebelumnya dan garis biru sesuai dengan gumpalan aqua yang lebih besar.)
Sebagian besar, pendekatan ini secara otomatis berurusan dengan masalah pertama: penyimpangan dari linearitas mengotori titik-titik intensitas terbesar, tetapi biasanya tidak banyak menggeser mereka. Titik-titik terpencil yang jujur akan menyumbang kebisingan tingkat rendah di seluruh transformasi Hough, yang akan hilang selama prosedur pasca-pemrosesan.
Pada titik ini orang dapat memberikan estimasi ini sebagai nilai awal untuk algoritma EM atau untuk minimizer kemungkinan (yang, jika diberikan estimasi yang baik, akan bertemu dengan cepat). Namun, yang lebih baik adalah menggunakan estimator regresi yang kuat seperti kuadrat terkecil yang berulang secara berulang . Itu mampu memberikan bobot regresi ke setiap titik. Bobot rendah menunjukkan bahwa suatu titik bukan "milik" suatu garis. Manfaatkan bobot ini, jika diinginkan, untuk menetapkan setiap titik ke garis yang sesuai. Kemudian, setelah mengklasifikasikan poin, Anda dapat menggunakan kuadrat terkecil biasa (atau prosedur regresi lainnya) secara terpisah pada dua kelompok poin.