Статья Автор: Лебедев Дмитрий

Разбор варианта Статграда_2024_октябрь. Часть 5 (задание 27)

Задание типа 27 дано в новом формате.
При решении задания можно выделить два основных этапа

  1. Разбиение данных на кластеры (предполагается, что будет выполнено визуально с использование EXCEL или других средств)
  2. Программная обработка кластеров (хотя возможно использование табличного редактора)
В данной тетради для выполнения первой части будет использоваться модуль MATPLOTLIB (хотя на экзамене это будет вряд ли возможно)
Решение второй части будет произведено стандартными средствами Python. Хотя объём данных позволяет получить ответ без какой-либо оптимизации, подходы к оптимизации решения будут продемонстрированы

К тетради приложены файлы с данными из варианта Статграда и демоверсии 2025 года (задания этих вариантов очень похожи)


Задание типа 27 из Демоверсии 2025 (ссылка на задание)
Фрагмент задания

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри прямоугольника высотой H и шириной W.
Каждая звезда обязательно принадлежит только одному из кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд на графике, 
сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1) и B(x2,y2) на плоскости,
которое вычисляется по формуле:\( d(A,B)=\sqrt{(x2 - x1)^2+(y2 - y1)^2}\) 
В файле A хранятся данные о звёздах двух кластеров, где H=3, W=3 для каждого кластера.
В каждой строке записана информация о расположении на карте одной звезды: сначала координата x, затем координата y.
Значения даны в условных единицах. Известно, что количество звёзд не превышает 1000.


К тетради прикреплены 4 текстовых файла (из демоварианта 2025 и варианта Статграда за октябрь 2024 года)
  • 27_A_17882.txt - демовариант 2025, файл А
  • 27_B_17882.txt - демовариант 2025, файл B
  • 27A_24-10.txt  - вариант Статграда, октябрь  2024, файл А
  • 27B_24-10.txt  - вариант Статграда, октябрь  2024, файл B

Действие 1 - Считываем точки и рисуем "точечную диаграмму" с помощью MATPLOTLIB
Для удобства, нужный файл  выбирается по номеру (по умолчанию выбирается файл А из демоварианта)
Введите номер файла и посмотрите на результат
 


Для файла с номером 3 будет получена следующая картинка.
Теперь желательно "разбить" все точки на кластеры. 
Как это сделать (в конкретном случае)? 
Обычно предлагают несколько путей:
  1. Для каждого кластера "описать прямоугольник" и проверять попадание в него
  2. "Построить круги" и проверять попадание
  3. Выбрать "центры" и для каждой точки:
    - вычислить расстояния до каждого из центров,
    - выбрать ближайший
Последнее решение наиболее предпочтительнее, поскольку 
  • точек немного и их можно "выбрать на глаз"
  • вычисление расстояний от точки до списка точек организовывать несложно
Для удобства выбора координат точек можно (в конкретном случае) увеличить масштаб и построить сетку. 
Приведем пример такого построения для файла с номером 3  



Теперь, несложно, определить "опорные точки". 
Например :  (-1, 0); (1,  4.5); (4.5, -1); (5, 3); (5.5, 6.5)
 Теперь все точки можно разнести по кластерам. Для этого:
  • создадим из "опорных точек" список
  • создадим словарь кластеров (ключ - номер)
  • пройдем по всем точкам и "определим" номер класстера
    • потребуется подпрограмма выбора "ближайшей"  к точке из набора 
Программу перепишем в более "строгом" виде. После разбиения выведем кластеры в разных цветах



Теперь надо определить способ обработки отдельного кластера
Вначале выведем точки кластера и вычислим "среднюю точку" набора

Можно ввести номер кластера (по умолчанию равен 0)


Как искать "истинный центроид" набора точек?
  • для каждой точки вычислять "сумму растояний" до всех остальных 
  • выбрать "лучшую"
Возможно, такой перебор будет затратным!? Какие способы оптимизаций можно применить?
  • после того, как получено хотя бы один результат, появляется "порог" для "суммы расстояний" -
    - нет смысла продолжать, если "текущая сумма" больше порога
  • как-то "упорядочить" точки, чтобы лучший ответ был получен "раньше" !?
    А что, если упорядочить точки по расстоянию до "средней точки"?
Для отработки этого элемента:
  • создадим кластер из 100 точек с помощью датчика случайных чисел
  • опредем "центр тяжести"
  • отсортируем точки кластера по растоянию до "средней точки" 
  • определим "истинный центроид" переборным способом и его номер в отсортированном списте

Вначале
  • создадим случайный кластер (KL)
  • выведем точки кластера красным цветом
  • определим "среднюю точку" (gxy)
  • отсортируем KL по расстоянию от gxy
  • перескрасим первые 20% в зелёный цвет



Дополним программу вычислением "сумм расстояний" от точки до всех точек набора
И попробуем организовать полный перебор, сохраняя  индекс "текущего лидера" 


Эксперимент на случайных кластерах подтвердил "работоспособность" предложенного метода. 
(можно было даже не добавлять "отсева" по порогу"
Попробуем реализовать его на варианте Статграда (ссылка на задание):

В лаборатории проводится эксперимент, состоящий из множества испытаний. Результат каждого испытания представляется в виде пары чисел.
Для визуализации результатов эта пара рассматривается как координаты точки на плоскости, и на чертеже отмечаются точки, соответствующие всем испытаниям.
По результатам эксперимента проводится кластеризация полученных результатов:
          на плоскости выделяется несколько кластеров – прямоугольников размером 3×3 так,
          что каждая точка попадает ровно в один кластер.

Центроидом кластера называется та из входящих в него точек, для которой
           минимальна сумма расстояний до всех остальных точек кластера.

Обработка результатов эксперимента включает следующие шаги:
     1) кластер, содержащий наименьшее число точек, исключается;
      2) определяются центроиды всех оставшихся кластеров;
      3) для найденных центроидов вычисляется средняя точка.

Средней для группы точек называется точка (не обязательно входящая в группу), координаты которой определяются как
средние арифметические значения координат всех точек группы.
В файле записан протокол проведения эксперимента.
Каждая строка файла содержит два числа: координаты X и Y точки, соответствующей одному испытанию.
По данному протоколу надо определить среднюю точку центроидов всех кластеров за исключением содержащего наибольшее число точек.
Вам даны два входных файла (27A и 27B), каждый из которых имеет описанную выше структуру.
По данным каждого из представленных файлов определите координаты средней точки по описанным выше правилам.
В ответе запишите четыре числа:
      сначала (в первой строке, через пробел) координаты X и Y средней точки для файла 27A_____,
      затем (во второй строке, через пробел) координаты X и Y средней точки для файла 27B_____. В качестве значения координаты указывайте целую часть от умножения числового значения координаты на 10 000.


Построим решение задания. Будем придерживаться следующей схемы

  • Определяем "опроные точки" кластеров (с помощью MATPLOTLOB  или EXCEL  или TURTLES или ...
    • Для файла A это (-0.5,1),(1.5,4),(0.5,7)
    • Для файла B это  (-1, 0); (1,  4.5); (4.5, -1); (5, 3); (5.5, 6.5)
  • Разбиваем точки на кластеры методом "поиска ближайшей опроной точки".
    Для храниния точек в кластере используем словарь, 
  • Выводим размеры кластеров. Кластер с наименьшим количеством можно удалить
    (используем команду .pop() - удаление по ключу)
  • Для каждого кластера находим "среднюю точку" и сортируем по расстоянию до "средней точки"
  • Для каждого кластера находим "истинный центроид" методом перебора с отсевом по "порогу" 
  • Для полученных значений "истинных центроидов" находим отве

Обработку кластера выделим в отдельную процедуру



Прикрепленные файлы
27A_24-10.txt
27B_24-10.txt
27_A_17882.txt
27_B_17882.txt
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать