ЕГЭ по информатике 2026 · задание 27 из 27
ЕГЭ по информатике 2026, задание 27: кластеры и анализ данных
Задание 27 — высокий уровень, максимум 2 балла. По спецификации это последовательность шагов анализа данных: собрать данные, оценить качество, выбрать модель, преобразовать, при необходимости увидеть структуру, интерпретировать. В актуальных вариантах это кластеры точек на плоскости, часто «звёзды».
Файл 2026 — `.txt`. Обычно два файла: A — маленький, для отладки, B — большой, с тем же правилом и большим числом кластеров. Формат строки читайте в условии: иногда только x и y, иногда после координат есть классы светимости и лишние поля.
Оценка:
- 2 балла — обе строки ответа верны, пары чисел в правильном порядке;
- 1 балл — верна только одна пара, либо обе пары верны, но строки переставлены;
- 0 — иначе.
В бланк вводят числа, не программу.
Что такое центр
Не подставляйте среднее арифметическое координат, пока не прочитаете определение. В нынешних формулировках центр кластера часто одна из точек этого кластера: та, у которой сумма расстояний до остальных точек кластера минимальна. Её обещают единственной.
Иногда после нахождения центров просят не координаты, а расстояние между центрами, число точек в полуплоскости, среднее центров, целую часть от координаты, умноженной на 10 000. Пишите ровно ту формулу, которая в условии. int(x * 10000) отбрасывает дробную часть и не округляет. Если x отрицательный, в Python int отбрасывает к нулю, а в условии может быть «целая часть» как округление к минус бесконечности. Для положительных координат это совпадает. Не округляйте через round.
Расстояние — обычное евклидово, если не сказано «по оси абсцисс». Расстояние по оси абсцисс — модуль разности x, без квадратного корня по двум координатам.
Конспект
- Разберите строку так, как она устроена. Два первых числа — координаты. Дальше могут идти пометки. Пропуск строки-мусора лучше сделать явно, чем поймать ошибку на середине файла B.
- Файл A визуально кластеризуется даже без графика: напечатайте минимум и максимум x и y, посмотрите группы. На экзамене
matplotlibможет не быть, на него не опирайтесь. - Кластеры в этих задачах разделены пространством. Достаточно порога: две точки в одном кластере, если между ними расстояние меньше порога, и дальше по цепочке. Порог возьмите меньше зазора между облаками и больше диаметра облака. На файле A подберите его за минуту, глядя на разброс.
- Число кластеров должно совпасть с условием. Если получилось больше или меньше, порог неверный, файл B не запускайте.
- Для каждого кластера найдите центр по определению из условия. Для «точка с минимальной суммой расстояний» переберите точки кластера. Кластеры на файле B бывают по несколько тысяч точек, квадрат по кластеру допустим, квадрат по всему файлу — уже тяжело, поэтому сначала режьте на кластеры.
- Аномалии. Если условие говорит отбросить выбросы или точки вне полос, сделайте это до центра. Иначе центр уедет.
- Посчитайте две величины для файла A, сверьте с ручной оценкой, затем тот же код — на файле B. Не меняйте формулу между файлами, меняется только число кластеров и данные.
Альтернатива порогу: если кластеры явно разделены по x, отсортируйте по x и режьте в больших зазорах. Это быстрее, но ломается, если облака стоят друг над другом. Порог по полному расстоянию универсальнее.
Старый тип задания 27 — числовая последовательность и два указателя — всё ещё встречается в открытом банке. Если в условии не точки, а последовательность и «подпоследовательность с суммой», не применяйте кластеры. Сначала определите модель.
Шаблон на Python
def read_points(path):
pts = []
for line in open(path, encoding="utf-8"):
parts = line.replace(",", ".").split()
if len(parts) < 2:
continue
try:
pts.append((float(parts[0]), float(parts[1])))
except ValueError:
continue
return pts
def clusters(pts, eps):
n = len(pts)
used = [False] * n
groups = []
for i in range(n):
if used[i]:
continue
stack = [i]
used[i] = True
group = []
while stack:
v = stack.pop()
group.append(pts[v])
x1, y1 = pts[v]
for u in range(n):
if used[u]:
continue
x2, y2 = pts[u]
if (x1 - x2) ** 2 + (y1 - y2) ** 2 <= eps * eps:
used[u] = True
stack.append(u)
groups.append(group)
return groups
def center(group):
best = None
best_sum = None
for x1, y1 in group:
s = 0.0
for x2, y2 in group:
s += ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5
if best_sum is None or s < best_sum:
best_sum = s
best = (x1, y1)
return best
pts = read_points("27_A.txt")
groups = clusters(pts, eps=1.0)
print("кластеров:", len(groups), "размеры:", [len(g) for g in groups])
centers = [center(g) for g in groups]
print(centers)
# дальше — формула из условия, например целая часть среднего x * 10000
# px = sum(c[0] for c in centers) / len(centers)
# print(int(px * 10000))Порог eps подберите на файле A. Если кластеров больше, чем обещано, увеличьте порог. Если один кластер поглотил два облака, уменьшите.
Когда центр определён как среднее, замените функцию center: среднее x и среднее y, это уже не точка из файла. Не смешивайте два определения в одной сдаче.
Производительность: поиск соседей в шаблоне квадратичный. Для файла A это незаметно. Для файла B при десятках тысяч точек может быть тесно по времени. Тогда группируйте сеткой: в список соседей попадают только точки близких ячеек. Пока файл до нескольких тысяч, прямой порог достаточен.
Типичные ошибки
- Центр заменён на среднее, хотя нужна точка кластера с минимальной суммой расстояний.
- В кластер попали выбросы, центр сместился.
- Для файла B остался порог, который на A случайно дал 2 кластера, а на B склеивает области.
- В ответ попали координаты, хотя просили расстояние между центрами.
- Целая часть заменена округлением.
- Строки A и B переставлены. Это может оставить 1 балл, если обе пары сами по себе верны.
Попробуйте объяснить с Мишкой
Бесплатный ИИ-репетитор объяснит любую тему так, как вам понятно — шаг за шагом.
Начать бесплатно