LINUX.ORG.RU

Рассортировать точки по областям

 


0

3

Приветствую. Возникла тут задачка, к которой не выходит ни нагуглить готового алгоритма, ни придумать велосипед. В двух столбцах, X и Y, соответствующие координаты точек, которые принадлежат к нескольким областям, как видно из графика. Требуется как-то пересортировать точки, чтобы можно было делить массивы: до определённого номера точки принадлежат одной области, после него — другой. Пишу в Matlab, из встроенных функций (sortrows, вычислительная геометрия) пока ничего не выжалось. Буду благодарен тому, кто покажет алгоритм «на пальцах» или предложит, что искать.

Кластеризовать например kmeans, потом отсортировать по номеру кластера.

neird
()
Ответ на: комментарий от ebantrop

Спасибо, я как раз не мог вспомнить, как это называется. Clustering, вот.

neird, так я числа кластеров (областей) не знаю заранее. Надо подумать ещё.

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от al_exquemelin

Вообще нужно сначала сформулировать четкий критерий по которому вы визуально их отделяете. Обычно это какая нибудь 'близость'. Часто хватает сделать kmeans с заведомо большим числом кластеров, а потом склеить 'близкие'.

А так да смотреть кластерный анализ. Если у вас области четко отделены например по плотности, то можно попробовать dbscan или optics (ни того ни другого в mathlab из коробки вроде нет, но отдельные реализации для mathlab есть).

neird
()
Ответ на: комментарий от neird

критерий по которому вы визуально их отделяете

По «соседству» же. Все координаты целые. Если у точки есть среди уже включенных в область такая, что хотя бы одна координата у них отличается на единицу, значит, и эта точка тоже входит в область.

Я тут подумал, что не стоит городить огород с кластерами ради этой задачки, возможно, сработает обычная заливка (flood fill). Надо попробовать.

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от al_exquemelin

По «соседству» же. Все координаты целые. Если у точки есть среди уже включенных в область такая, что хотя бы одна координата у них отличается на единицу, значит, и эта точка тоже входит в область.

Эта поправка резко меняет подразумеваемый смысл задачи.

Я тут подумал, что не стоит городить огород с кластерами ради этой задачки, возможно, сработает обычная заливка (flood fill). Надо попробовать.

Я с вышеуказанной поправкой к условию тоже так подумал.

neird
()

K-means с избыточным k, потом HCA (hierarchical cluster analysis), срез по порогу расстояния, потом отсортировать по номеру кластера.

dn2010 ★★★★★
()
Ответ на: комментарий от dn2010

Расстояние для такого датасета любое пойдёт, включая эвклидово.

dn2010 ★★★★★
()

Все любители матлаба и аналогичного софта, которых я знал всегда страдали тупизной (включая преподов в ВУЗ-ах). Ты критерии по которым точки делить собрался сформулируй, формализуй и станет гораздо понятнее.

peregrine ★★★★★
()

Ого, сколько умных названий вы мне притащили. Спасибо. Надо было сразу написать, что координаты целые, глядишь, всё оказалось бы намного проще.

peregrine, ты так говоришь, будто выбор языка (среды) — это панацея от всех проблем сразу. Тут весь вопрос был в том, чтобы а)отталкиваться именно от исходного массива, б)правильно выбрать индексы, условия для find() и прочее, чтобы не упустить точки и не вылезти за границы массивов. Вот и все дела.

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от al_exquemelin

Просто от матлабов и прочего где мышкой для большинства задач надо таскать всякие значки мозг портится - перестаёт думать. Сначала задачу (или ход решения задачи) надо продумывать в голове, а для этого иногда полезно делать то что делает матлаб руками или реализовывать те же численные методы (просто читать про них многим недостаточно).

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Да ладно. Я больше удивлён, что решение такой заурядной, в сущности, задачки нигде уже не реализовали «из коробки» и что ничего не нагуглилось сразу же.

где мышкой для большинства задач надо таскать всякие значки

Это определённо не про матлаб. Это чудо Java-кодинга, между прочим, меня сегодня поразило текущей непонятно куда памятью. Хотя казалось бы, разве придётся с таким высокоуровневым инструментом думать о памяти. Ладно, это всё уже оффтоп здесь.

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от al_exquemelin

peregrine, ты так говоришь, будто выбор языка (среды) — это панацея от всех проблем сразу. Тут весь вопрос был в том, чтобы а)отталкиваться именно от исходного массива, б)правильно выбрать индексы, условия для find() и прочее, чтобы не упустить точки и не вылезти за границы массивов. Вот и все дела.

Присоединяюсь к изначальному мнению peregrine. Имхо писать в настоящее время что то на mathlab представляется разумным только если: у вас уже есть большая существующая кодовая база или вам нужно написать по быстрому что то небольшое 'на выброс'.

Если вы собираетесь писать что то большое, то про mathlab лучше сразу забыть. После тысячи строк проект превращается в фарш, как его не массируй (среда не способствует культуре разработки). Поскольку к тому же типичный пользователь mathlab это ученый или инженер, то фарш наступает обычно заметно раньше тысячи строк.

Я положим сейчас использую mathlab только для того чтобы совсем быстренько обработать какие данные в варианте 'на выброс'. Если данные нужно обрабатывать систематически и долговременно, то обычно все переписывается на связке python и c++(до c++ в 99% случаев дело не доходит).

neird
()
Ответ на: комментарий от neird

Не вижу большой разницы между матлабом и питоном, честно говоря. Синтаксис, скорость выполнения и прочее. А до плюсов вообще, пожалуй, добрался бы только при необходимости командовать железом.

После тысячи строк проект превращается в фарш

Что мешает разносить функции и прочее по отдельным файлам? Насколько я видел примеры, матлаб позволяет писать гораздо более крупные вещи с гуём и прочими финтифлюшками.

среда не способствует культуре разработки

Дожили. Раньше так про дельфи говорили да про пхп, теперь в этот чёрный список угодил матлаб :)

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от al_exquemelin

Не вижу большой разницы между матлабом и питоном, честно говоря. Синтаксис, скорость выполнения и прочее. А до плюсов вообще, пожалуй, добрался бы только при необходимости командовать железом.

Не нужно смотреть на абстактный matlab vs python, нужно смотреть на конкретный существующий в природе код matlab vs python. И как то так получается что хорошо написанный код на python встречается часто, а на matlab редко.

Что мешает разносить функции и прочее по отдельным файлам? Насколько я видел примеры, матлаб позволяет писать гораздо более крупные вещи с гуём и прочими финтифлюшками.

А кто говорит про файлы? Я говорю что уже тысяча строк на matlab в совокупности уже проблема.

У mathlab конкретная целевая аудитория - инженеры и ученые и конкретная типовая задача - что то посчитать. Как только эта задача перерастает из 'посчитать' в 'разработать' обычно наступают проблемы.

Можно провести опрос среди программистов (инженеров и ученых из опроса исключаем как людей 'by design' некомпетентных в разработке программного обеспечения): 'готовы ли они разрабатывать крупный проект по обработке данных на matlab?'. Ответ имхо очевиден.

Дожили. Раньше так про дельфи говорили да про пхп, теперь в этот чёрный список угодил матлаб :)

Черность пунктов списка понятие относительное. У каждого инструмента своя целевая аудитория и типовые задачи. Я нисколько не против того что кто то пишет на matlab. Но у меня обычно наступает желание 'всех расстрелять' когда мне нужно портировать чей то код с matlab.

neird
()
Ответ на: комментарий от neird

В догонку. О том что постановка вопроса 'использовать ли matlab и когда' имеет смысл можно убетится сделав google matlab vs python.

neird
()
Ответ на: комментарий от neird

нужно смотреть на конкретный существующий в природе код

Вооот, о чём и речь.

уже тысяча строк на matlab в совокупности уже проблема

Так не надо их валить в одну кучу, вот и не будет проблемы. Или раздуть проект до тысячи строк представляет проблему? С этим могу согласиться, учитывая, сколько всего уже написано до нас и распихано по библиотекам, модулям, тулбоксам.

Можно провести опрос среди программистов (инженеров и ученых из опроса исключаем как людей 'by design' некомпетентных в разработке программного обеспечения): 'готовы ли они разрабатывать крупный проект по обработке данных на matlab?'.

Э не, извините. Программистам вообще ни к чему обрабатывать какие-то данные, раз мы начали выделять подобные «касты». Моделировать, собирать данные измерений и обсчитывать их — это как раз к учёным и инженерам. Другой вопрос, что среди создателей того же матлаба должны быть прикладные и вычислительные математики, а при написании тулбоксов не обошлось без участия спецов в своих областях.

Но у меня обычно наступает желание 'всех расстрелять' когда мне нужно портировать чей то код с matlab.

А это вообще вопрос кривизны рук аффтаров кода. У меня тут есть несколько расчётных задачек, проделавших такой путь: Паскаль (середина 90-х) --> Matlab 2006 --> Scilab. Так я должен сказать, что матлабовский код, написанный по образу и подобию Паскаля, ничего не выигрывает в понятности.

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от al_exquemelin

Вооот, о чём и речь.

Не так сказал. Нужно смотреть не вот какой то конкретный код, а на типичные образцы кода встречающиеся в природе. Типичные образцы кода на matlab это пакость какая то.

Так не надо их валить в одну кучу, вот и не будет проблемы. Или раздуть проект до тысячи строк представляет проблему? С этим могу согласиться, учитывая, сколько всего уже написано до нас и распихано по библиотекам, модулям, тулбоксам.

Ну мне как то не особо интересно насколько я могу хорошо писать код используя конкретный инструмент. Мне интересно насколько хорошо его в среднем пишет все остальное человечество.

Э не, извините. Программистам вообще ни к чему обрабатывать какие-то данные, раз мы начали выделять подобные «касты». Моделировать, собирать данные измерений и обсчитывать их — это как раз к учёным и инженерам. Другой вопрос, что среди создателей того же матлаба должны быть прикладные и вычислительные математики, а при написании тулбоксов не обошлось без участия спецов в своих областях.

Так кто же спорит? Я говорю что как только у вас задача перешла из категории 'посчитать' в категорию 'разработать' следует задуматся о смене инструмента. Что поделать, не пригоден matlab для разработки программного обеспечения.

neird
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.