Ở những nơi khác trong chủ đề này, user1149913 cung cấp lời khuyên tuyệt vời (xác định mô hình xác suất) và mã cho cách tiếp cận mạnh mẽ (ước tính EM). Hai vấn đề vẫn được giải quyết:
Làm thế nào để đối phó với sự khởi hành từ mô hình xác suất (rất rõ ràng trong dữ liệu 2011-2012 và phần nào rõ ràng trong các nhấp nhô của các điểm ít dốc hơn).
Cách xác định các giá trị khởi đầu tốt cho thuật toán EM (hoặc bất kỳ thuật toán nào khác).
Để giải quyết # 2, hãy xem xét sử dụng biến đổi Hough . Đây là một thuật toán phát hiện tính năng, để tìm các tính năng trải dài tuyến tính, có thể được tính toán một cách hiệu quả như một biến đổi Radon .
xyx , ytrong biến đổi Hough. Khi các tính năng trong cốt truyện gốc nằm dọc theo một đường chung hoặc gần đủ với một, thì các tập hợp đường cong mà chúng tạo ra trong biến đổi Hough có xu hướng có một giao điểm chung tương ứng với đường chung đó. Bằng cách tìm ra những điểm có cường độ lớn nhất trong biến đổi Hough, chúng ta có thể đọc được các giải pháp tốt cho vấn đề ban đầu.
Để bắt đầu với những dữ liệu này, trước tiên tôi cắt bỏ các công cụ phụ trợ (trục, dấu tick và nhãn) và để đo tốt các điểm bên ngoài rõ ràng ở phía dưới bên phải và rắc dọc theo trục dưới cùng. (Khi công cụ đó không bị cắt, quy trình vẫn hoạt động tốt, nhưng nó cũng phát hiện các trục, khung, chuỗi tuyến tính của bọ ve, chuỗi tuyến tính của nhãn và thậm chí các điểm nằm lẻ tẻ trên trục dưới cùng!)
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}]
(Cái này và phần còn lại của mã nằm trong Mathicala .)
Để mỗi dấu chấm trong hình ảnh này tương ứng với một phạm vi đường cong hẹp trong biến đổi Hough, có thể nhìn thấy ở đây. Chúng là sóng hình sin:
hough2 = Radon[crop2, Method -> "Hough"] // ImageAdjust
Điều này làm cho biểu hiện trực quan ý nghĩa trong đó câu hỏi là một vấn đề phân cụm dòng : biến đổi Hough giảm nó thành một vấn đề phân cụm điểm , mà chúng ta có thể áp dụng bất kỳ phương pháp phân cụm nào chúng ta muốn.
Trong trường hợp này, việc phân cụm rõ ràng đến mức xử lý hậu kỳ đơn giản của biến đổi Hough được hiệu chỉnh. Để xác định các vị trí có cường độ lớn nhất trong biến đổi, tôi đã tăng độ tương phản và làm mờ biến đổi trên bán kính khoảng 1%: tương đương với đường kính của các điểm cốt truyện trong ảnh gốc.
blur = ImageAdjust[Blur[ImageAdjust[hough2, {1, 0}], 8]]
Ngưỡng kết quả đã thu hẹp nó thành hai đốm nhỏ có trọng tâm xác định hợp lý các điểm có cường độ lớn nhất: chúng ước tính các đường được trang bị.
comp = MorphologicalComponents[blur, 0.777]) // Colorize
0,777
Phía bên trái của hình ảnh tương ứng với hướng 0 độ (ngang) và, khi chúng ta nhìn từ trái sang phải, góc đó tăng tuyến tính lên 180 độ. Nội suy, tôi tính toán rằng hai đốm màu được tập trung ở 19 và 57,1 độ, tương ứng. Chúng ta cũng có thể đọc ra các phần chặn từ các vị trí thẳng đứng của các đốm màu. Thông tin này mang lại sự phù hợp ban đầu:
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}
Theo cách tương tự, người ta có thể tính toán các phần chặn tương ứng với các độ dốc này, đưa ra các mức khớp này:
(Đường màu đỏ tương ứng với chấm màu hồng nhỏ trong hình trước và đường màu xanh tương ứng với đốm màu nước lớn hơn.)
Ở một mức độ lớn, cách tiếp cận này đã tự động xử lý vấn đề đầu tiên: những sai lệch so với tuyến tính làm mờ đi những điểm có cường độ lớn nhất, nhưng thường không làm thay đổi chúng nhiều. Các điểm ngoại vi thẳng thắn sẽ đóng góp tiếng ồn ở mức độ thấp trong suốt quá trình biến đổi Hough, sẽ biến mất trong quá trình xử lý hậu kỳ.
Tại thời điểm này, người ta có thể cung cấp các ước tính này dưới dạng giá trị bắt đầu cho thuật toán EM hoặc cho bộ giảm thiểu khả năng (được đưa ra ước tính tốt, sẽ hội tụ nhanh chóng). Mặc dù vậy, tốt hơn là sử dụng một công cụ ước lượng hồi quy mạnh mẽ như bình phương tối thiểu lặp lại . Nó có thể cung cấp một trọng số hồi quy cho mọi điểm. Trọng lượng thấp cho thấy một điểm không "thuộc" một dòng. Khai thác các trọng số này, nếu muốn, để gán từng điểm cho dòng thích hợp của nó. Sau đó, khi đã phân loại các điểm, bạn có thể sử dụng các bình phương tối thiểu thông thường (hoặc bất kỳ quy trình hồi quy nào khác) riêng biệt trên hai nhóm điểm.