В другом месте в этой теме user1149913 предоставляет полезные советы (определяют вероятностную модель) и код для мощного подхода (оценка EM). Осталось решить две проблемы:
Как справиться с отклонениями от вероятностной модели (что очень очевидно в данных за 2011-2012 гг. И несколько очевидно в волнистости менее наклонных точек).
Как определить хорошие начальные значения для алгоритма EM (или любого другого алгоритма).
Чтобы обратиться к № 2, подумайте об использовании преобразования Хафа . Это алгоритм обнаружения признаков, который для нахождения линейных участков признаков может быть эффективно вычислен как преобразование Радона .
xyx,yв преобразовании Хафа. Когда объекты в исходном графике располагаются вдоль общей линии или достаточно близко к одной, тогда наборы кривых, которые они создают в преобразовании Хафа, имеют общее пересечение, соответствующее этой общей линии. Найдя эти точки наибольшей интенсивности в преобразовании Хафа, мы можем зачитать хорошие решения исходной задачи.
Чтобы начать работу с этими данными, я сначала обрезал вспомогательные элементы (оси, отметки и метки) и для хорошей цели обрезал явно отдаленные точки внизу справа и посыпал вдоль нижней оси. (Когда этот материал не обрезается, процедура все еще работает хорошо, но она также обнаруживает оси, кадры, линейные последовательности тиков, линейные последовательности меток и даже точки, время от времени лежащие на нижней оси!)
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}]
(Этот и остальной код приведены в Mathematica .)
Каждой точке на этом изображении соответствует узкий диапазон кривых в преобразовании Хафа, видимый здесь. Это синусоиды:
hough2 = Radon[crop2, Method -> "Hough"] // ImageAdjust
Это наглядно демонстрирует смысл, в котором вопрос представляет собой проблему линейной кластеризации : преобразование Хафа сводит его к проблеме точечной кластеризации , к которой мы можем применить любой метод кластеризации, который нам нравится.
В этом случае кластеризация настолько ясна, что достаточно простой постобработки преобразования Хафа. Чтобы определить места наибольшей интенсивности в преобразовании, я увеличил контраст и размыл преобразование по радиусу около 1%: это сопоставимо с диаметрами точек графика на исходном изображении.
blur = ImageAdjust[Blur[ImageAdjust[hough2, {1, 0}], 8]]
Установление порога результата сузило его до двух крошечных сгустков, центроиды которых разумно идентифицируют точки наибольшей интенсивности: они оценивают подобранные линии.
comp = MorphologicalComponents[blur, 0.777]) // Colorize
0.777
Левая сторона изображения соответствует направлению 0 градусов (по горизонтали), и, как мы видим слева направо, этот угол увеличивается линейно до 180 градусов. Интерполируя, я вычисляю, что эти две капли центрированы в 19 и 57,1 градусах соответственно. Мы также можем считывать перехваты с вертикальных позиций капель. Эта информация дает начальные соответствия:
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}
Аналогичным образом можно вычислить точки пересечения, соответствующие этим наклонам, давая следующие соответствия:
(Красная линия соответствует крошечной розовой точке на предыдущем изображении, а синяя линия соответствует большему водному шарику.)
В значительной степени этот подход автоматически решает первую проблему: отклонения от линейности размывают точки наибольшей интенсивности, но обычно не сильно их смещают. Откровенно говоря, отдаленные точки будут вносить низкий уровень шума во всем преобразовании Хафа, который исчезнет во время процедур последующей обработки.
В этот момент можно предоставить эти оценки в качестве начальных значений для алгоритма EM или для минимизатора вероятности (который, при наличии хороших оценок, будет быстро сходиться). Однако лучше было бы использовать надежную регрессионную оценку, такую как метод наименьших квадратов с повторным взвешиванием . Он способен обеспечить регрессионный вес для каждой точки. Низкие веса указывают, что точка не принадлежит линии. Используйте эти веса, если хотите, чтобы назначить каждую точку соответствующей линии. Затем, классифицировав точки, вы можете использовать обычные наименьшие квадраты (или любую другую процедуру регрессии) отдельно для двух групп точек.