Задание EGEINFAAB9D2: Эффективная обработка данных и кластеры

ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий

Открыть решение ↓ Ошибка или пожелание

Тип задачи: Эффективная обработка данных и кластеры.

Учебные темы: Анализ данных. Основные задачи анализа данных: прогнозирование, классификация, кластеризация, анализ отклонений. Последовательность решения задач анализа данных: сбор первичных данных, очистка и оценка качества данных, выбор и/или построение модели, преобразование данных, визуализация данных, интерпретация результатов. Программные средства и интернет-сервисы для обработки и представления данных. Большие данные. Машинное обучение; Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве.

Впишите правильный ответ.

 Рисунок из условия ФИПИЗадание выполняется с использованием прилагаемых файлов.

Фрагмент звёздного неба спроецирован на плоскость с декартовой системой координат. Учёный решил провести кластеризацию полученных точек, являющихся изображениями звёзд, то есть разбить их множество на N непересекающихся непустых подмножеств (кластеров), таких, что точки каждого подмножества лежат внутри прямоугольника со сторонами длиной H и W, причём эти прямоугольники между собой не пересекаются. Стороны прямоугольников не обязательно параллельны координатным осям. Гарантируется, что такое разбиение существует и единственно для заданных размеров прямоугольников.

Будем называть центром кластера точку этого кластера, сумма расстояний от которой до всех остальных точек кластера минимальна. Для каждого кластера гарантируется единственность его центра. Расстояние между двумя точками на плоскости A(x1, y1)   и B(x2, y2) вычисляется по формуле:

d(A, B)=(x2−x1)2+(y2−y1)2. 

В файле A хранятся координаты точек двух кластеров, где H = 6, W = 6 для каждого кластера. В каждой строке записана информация о расположении на карте одной точки: сначала координата x, затем координата y. Известно, что количество точек не превышает 1000.

В файле Б хранятся координаты точек трёх кластеров, где H = 8, W = 8 для каждого кластера. Известно, что количество точек не превышает 10 000. Структура хранения информации в файле Б аналогична структуре в файле А.

 

Для каждого файла определите координаты центра каждого кластера, затем вычислите два числа: Px – среднее арифметическое абсцисс центров кластеров, и Py – среднее арифметическое ординат центров кластеров.

В ответе запишите четыре числа: в первой строке – сначала абсолютное значение целой части произведения Px × 10 000, затем абсолютное значение целой части произведения Py × 10 000 для файла А; во второй строке – аналогичные данные для файла Б.

Возможные данные одного из файлов проиллюстрированы графиком. 

 

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

 

 

 

Рисунок из условия ФИПИ

Скачать файл задания (ZIP, ФИПИ)


i
СВОЙСТВА ЗАДАНИЯ
Тип ответа:Краткий ответ
Номер: AAB9D2
НЕ РЕШЕНО Ответить

Решение задания EGEINFAAB9D2

Ответ: 26216 24182 150891 63754

Решение.
Распакуем скачанный архив и сохраним два текстовых файла 1_27_A.txt и 1_27_B.txt рядом с программой. Архив на странице содержит эти два неизменённых файла из официального комплекта ФИПИ 2025 года. Для вычислений нужны реальные точки из файлов: иллюстративный рисунок или пример строк из условия их не заменяет.
Считываем координаты, заменяя десятичную запятую точкой. Строку заголовка X Y, если она есть, пропускаем. В файле A получаем 100 точек, в файле B — 10000. Нумерация точек ниже начинается с 1 и не включает заголовок.
Сначала определим кластеры. По диаграмме фактических данных выбираем следующие прямоугольники; затем программа проверяет принадлежность каждой точки ровно одному из них:

Файл и кластерДиапазон xДиапазон yЧисло точек
A1от 0.5 до 6.5от -5.5 до 0.550
A2от -2.2 до 3.8от 4.8 до 10.850
B1от 12 до 20от 9.5 до 17.53333
B2от 21.5 до 29.5от -4.5 до 3.53334
B3от 0 до 8от 3 до 113333

Все прямоугольники файла A имеют стороны 6 и 6, а файла B — 8 и 8. Внутри каждого файла прямоугольники попарно не пересекаются, все кластеры непусты и каждая исходная точка попала ровно в один из них. Следовательно, найдено допустимое разбиение. По гарантии единственности в условии это и есть искомые кластеры. Выбранные границы относятся именно к данным этого файла.
Центр ищем среди всех точек соответствующего кластера. Для каждой точки p вычисляем S(p) = Σ d(p, q), где q пробегает все точки этого же кластера, и выбираем точку с минимальным S. Саму p можно включить в сумму: её расстояние до себя равно нулю.
Используем евклидово расстояние d(p, q) = √(xₚ − xq)² + (yₚ − yq)². Сумма квадратов расстояний и среднее арифметическое координат всех точек задают другие критерии и здесь не подходят. Полный перебор проверяет каждого кандидата; сравнение со вторым результатом подтверждает строгий минимум.
Полученные центры:

Файл и кластерНомер точкиx центраy центра
A1993.981033369-1.961127579
A2131.2622776356.797635538
B1302415.7550191213.34466476
B2541825.20349762-0.833550091
B322304.3090731896.615238685

После нахождения центров усредняем именно их координаты. Каждый кластер в этом среднем имеет одинаковый вес независимо от количества точек в нём:
Pₓ = x₁ + … + xₖk, Pᵧ = y₁ + … + yₖk.
Для файла A: Pₓ = 2.621655502000, Pᵧ = 2.418253979500. После умножения на 10000, взятия целой части и модуля получаем 26216 24182.
Для файла B: Pₓ = 15.089196643000, Pᵧ = 6.375451118000. После умножения на 10000, взятия целой части и модуля получаем 150891 63754.
Программа на Python 3:

from math import dist, fsum
from statistics import mean

def read_points(filename):
    rows = []
    with open(filename, encoding='utf-8-sig') as source:
        for line in source:
            parts = line.replace(',', '.').split()
            if not parts or parts[0].upper() == 'X':
                continue
            x, y = map(float, parts[:2])
            rows.append((x, y, parts[2] if len(parts) > 2 else ''))
    return rows

def split_points(rows, boxes):
    groups = [[] for _ in boxes]
    for point in rows:
        x, y = point[:2]
        matches = [i for i, (x1, x2, y1, y2) in enumerate(boxes)
                   if x1 <= x <= x2 and y1 <= y <= y2]
        assert len(matches) == 1
        groups[matches[0]].append(point)
    assert all(groups)
    return groups

def center(group):
    return min(group, key=lambda p: fsum(dist(p[:2], q[:2])
                                       for q in group))

boxes_A = [[0.5, 6.5, -5.5, 0.5], [-2.2, 3.8, 4.8, 10.8]]

boxes_B = [[12, 20, 9.5, 17.5], [21.5, 29.5, -4.5, 3.5], [0, 8, 3, 11]]

for letter, boxes in [('A', boxes_A), ('B', boxes_B)]:
    groups = split_points(read_points('1_27_' + letter + '.txt'), boxes)
    centers = [center(group) for group in groups]
    px = mean(p[0] for p in centers)
    py = mean(p[1] for p in centers)
    print(abs(int(px * 10000)), abs(int(py * 10000)))

Результат выполнения:
26216 24182
150891 63754
Проверка полноты: каждая входная точка проверена при разбиении, в каждом кластере просмотрены все кандидаты в центры и все расстояния до остальных точек. Независимый расчёт другим алгоритмом разбиения подтвердил все составы кластеров и номера центров. Финальные целые числа также проверены вычислениями с исходными десятичными координатами без потери точности при округлении.
Основные затраты времени — O(N²) для полного перебора расстояний; память — O(N). Матрица всех попарных расстояний не хранится.
Ответ: 26216 24182 150891 63754.

Помочь улучшить сайт

Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINFAAB9D2.

Сообщение увидит только команда сайта: на странице оно не публикуется.

Комментарии к решению

Комментарии видны всем посетителям сайта.

Комментариев пока нет. Будьте первым.

Чтобы оставить комментарий, войдите или зарегистрируйтесь.