Можно ли использовать знание, что координаты целые или полуцелые, и как это применять
Что проверяют
Замечаете ли вы структуру в данных и умеете ли превратить её в преимущество: точную арифметику, быстрый поиск, постобработку прогнозов. Следом обычно спрашивают, что делать, если часть значений с шумом и на сетку не попадает.
Как отвечать
Да, и первый ход почти всегда один: умножить координаты на 2. Всё полуцелое становится целым, и дальше работа идёт в целых числах без погрешностей плавающей точки. Что это даёт:
- точное сравнение и хэширование: точки можно класть ключами в
dictилиset, искать соседей по сетке за O(1), дедуплицировать черезnp.uniqueбез допусков; - индексацию массивом: при ограниченном диапазоне координата превращается в индекс, и вместо поиска по дереву получается прямой доступ к ячейке или гистограмма через
np.bincount; - экономию памяти: удвоенные значения помещаются в
int16илиint32вместоfloat64; - геометрию без округлений: удвоенная площадь многоугольника по формуле шнурования в целых координатах всегда целое число, а середина отрезка между целыми точками полуцелая, то есть остаётся на той же сетке;
- постобработку модели: если истинные значения лежат на решётке с шагом 0.5, регрессионный прогноз можно привязать к ближайшему узлу, а задачу иногда удобнее переформулировать как классификацию ячейки;
- контроль качества данных: значение не на сетке сразу указывает на ошибку парсинга или другой источник.
Полезно заметить, что числа вида k/2 в float64 представимы точно, так что проблема не в хранении, а в арифметике: после деления или усреднения трёх точек вы уже вне сетки.
Где спотыкаются
Округляют через round. В Python round(2.5) даёт 2, а np.round тоже округляет половины к чётному, поэтому привязка к сетке съезжает. Надёжнее работать с удвоенными целыми: int(round(2 * x)) безопасен, потому что 2 * x уже целое.
Используют int(x) для отрицательных координат. Он отбрасывает дробную часть к нулю, и -1.5 становится -1, а не -2, как дал бы math.floor.
Привязывают прогноз к сетке, не проверив это на валидации. Когда модель не уверена, округление до ближайшего узла может увеличить ошибку, особенно по RMSE.