Задача к ЕГЭ по информатике на тему «Анализ данных (звезды)» №23

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

Будем называть центром кластера точку этого кластера, сумма расстояний от которой до всех остальных точек кластера минимальна. Для каждого кластера гарантируется единственность его центра.

Расстояние между двумя точками на плоскости A(x1,y1)  и B (x2,y2)  вычисляется по формуле:

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

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

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

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

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|× 1000  , затем целую часть произведения |Py|× 1000  для файла А, а затем — аналогичные данные для файла Б.

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

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

PIC

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Для этих 5 кластеров необходимо провести 2 наклонных прямых, чтобы их отделить:

y = 3.5 +0.5∗ x  и y = 4.5 − x

В итоге получим следующие неравенства для последовательного отделения:

1) y > 3.5 + 0.5 ∗x  » class=»math» src=»/images/inform/reshen/reshen-7364-7.svg» width=»auto»> и <img decoding=

2) y < 3.5 + 0.5 ∗x  и x < − 1.5

3) x > 3.5  » class=»math» src=»/images/inform/reshen/reshen-7364-11.svg» width=»auto»> и <img decoding=

4) y > 4.5 − x  » class=»math» src=»/images/inform/reshen/reshen-7364-13.svg» width=»auto»> </p>
<p class= 5) все остальные точки

Код программы для файла А:

file = open("5_A.txt")
file.readline()
clusters = [[] for i in range(5)]
for star in file:
    x, y = list(map(float, star.replace(’,’, ’.’).split()))
    if (y > 3.5 + 0.5*x) and (x < -1.5):
        clusters[0].append((x, y))
    elif (y < 3.5 + 0.5*x) and (x < -1.5):
        clusters[1].append((x, y))
    elif (x > 3.5) and (y < 0.5):
        clusters[2].append((x, y))
    elif y > 4.5 - x:
        clusters[3].append((x, y))
    else:
        clusters[4].append((x, y))

sum_x = sum_y = 0
for cluster in clusters:
    tx = ty = 0
    mn = 10**20
    for centroid in cluster:
        x1, y1 = centroid
        sm = 0
        for star in cluster:
            x2, y2 = star
            sm += ((x2-x1)**2 + (y2-y1)**2)**0.5
        if sm < mn:
            mn = sm
            tx, ty = x1, y1
    sum_x += tx
    sum_y += ty

print(int(abs(sum_x / 5) * 1000))
print(int(abs(sum_y / 5) * 1000))

Диаграмма для файла Б имеет вид:

PIC

Рассмотрим 3 кластера и координаты, которыми их можно последовательно отделить:

1) y > 2∗ x+ 4  » class=»math» src=»/images/inform/reshen/reshen-7364-15.svg» width=»auto»> </p>
<p class= 2) y > − 0.5∗ x− 1  » class=»math» src=»/images/inform/reshen/reshen-7364-16.svg» width=»auto»> </p>
<p class= 3) все остальные точки

Код программы для файла Б:

file = open("5_B.txt")
file.readline()
clusters = [[] for i in range(3)]
for star in file:
    x, y = list(map(float, star.replace(’,’, ’.’).split()))
    if y > 2*x + 4:
        clusters[0].append((x, y))
    elif y > -0.5*x - 1:
        clusters[1].append((x, y))
    else:
        clusters[2].append((x, y))

sum_x = sum_y = 0
for cluster in clusters:
    tx = ty = 0
    mn = 10**20
    for centroid in cluster:
        x1, y1 = centroid
        sm = 0
        for star in cluster:
            x2, y2 = star
            sm += ((x2-x1)**2 + (y2-y1)**2)**0.5
        if sm < mn:
            mn = sm
            tx, ty = x1, y1
    sum_x += tx
    sum_y += ty

print(int(abs(sum_x / 3) * 1000))
print(int(abs(sum_y / 3) * 1000))

Ответ: 462 711 169 660
Оцените статью
Я решу все!