У меня есть N зеленых точек и M красных точек (ни один из них не colinear). Я хочу сказать, можно ли разделить эти точки с линией таким образом, чтобы все зеленые точки были на одной стороне, а все красные точки - с другой стороны. Если есть такая строка, я бы хотел найти ее уравнение. Линия не может пройти через эти точки. Каков самый быстрый алгоритм для решения этой проблемы? Это не домашнее задание, а проблема, о которой я недавно думал.Разделите точки на плоскости с линией
ответ
Построение convex hulls для обоих комплектов. Если они пересекаются, то нет такой разделительной линии
Две модели множеств Xi и Xj называются линейно разделимы, если их выпуклые оболочки не пересекаются
Когда шелуха не пересекаются , строка might be found с rotating calipers
Это точно, что SVMs сделать. Более конкретно, SVM найдет линию, которая будет дальше от обоих наборов точек, если они будут linearly separable; В противном случае алгоритм может быть настроен на то, чтобы найти какое-то «лучшее усилие».
Есть много источников, где вы можете прочитать о SVM более подробно, но в основном вам нужно будет использовать линейное ядро. Например, вот the SVM implementation in scikit-learn, с некоторыми изображениями.
Используйте (один слой) perceptron
, чтобы узнать separating hyperplane
(прямая линия в двух измерениях), поставив проблему как проблему двоичной классификации.
Если два множества точек являются linearly separable
, то одна такая гиперплоскость существует, то алгоритм Персептрон гарантированно сходятся и решение даст вам hyperplane
(прямую линию в 2-х измерениях) разделения двух классов (зеленый и синий) ,
В случае, если решение не существует, алгоритм не сходится и мы можем остановиться после конечного числа итераций.
В любом из случаев, когда алгоритм останавливается (либо с сходимостью, либо за пределами максимальных итераций), мы можем проверить, являются ли все точки на обеих сторонах выходной линии монохроматическими (т. Е. Одна сторона содержит только красную, другая сторона содержит только зеленые точки), если это так, тогда возвращаем уравнение линии, иначе выход такой строки не существует.
Мы также можем использовать perceptron pocket algorithm
, а не использовать наивную реализацию, но для нашей цели также будет реализована наивная реализация (https://en.wikipedia.org/wiki/Perceptron).
- 1. Точки на 2D-плоскости
- 2. точки на плоскости в 3D
- 3. Получение ближайшей точки на плоскости
- 4. Найти нормаль плоскости заданной линией пересечения и нормалью другой плоскости
- 5. Сортировка координаты точки плоскости
- 6. Перевести 3D-точки на произвольной плоскости
- 7. Точки кластеризации в 3D-плоскости
- 8. Максимальное значение точки в плоскости
- 9. Как выбрать все точки рядом с линией?
- 10. Как подключить точки в D3 с линией?
- 11. Максимальные коллинеарные точки в плоскости
- 12. Разделите точки на множества максимального расстояния
- 13. Соедините две точки с линией в R
- 14. SVG соединяет две точки с линией
- 15. OpenCv Blob отслеживание точки относительно плоскости
- 16. Подключить точки к плоскости/Draw Polygon
- 17. Эффективный метод извлечения точки из 3D-плоскости
- 18. расстояние от точки до конечной плоскости
- 19. Преобразование треугольника на плоскости
- 20. Учитывая 2 точки и линию - точки пересекаются с линией? : Алгоритм/псевдокод
- 21. MATLAB перемещение точки в плоскости XY
- 22. Поиск ориентации точки относительно другой точки в плоскости xy
- 23. Вращающаяся точка на плоскости
- 24. Точки пересечения между линией и полилинией
- 25. Найти значение точки между измеренными точками на 2D-плоскости
- 26. Точки пересечения между линией и прямоугольником
- 27. пересечение диаграммы ворона с линией
- 28. Нельзя пометить точки в пунктирной плоскости
- 29. Поиск ближайшей точки из множества точек на плоскости
- 30. Нахождение точки пересечения между линией и QPainterPath