Тема 27. Анализ данных

27.01 Стандартные кластеры

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела анализ данных
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#103466

Фрагмент звёздного неба спроецирован на плоскость с декартовой системой координат. Учёный решил провести кластеризацию полученных точек, являющихся изображениями звёзд, то есть разбить их множество на 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  и x < − 1.5

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

3) x > 3.5  и y < 0.5

4) y > 4.5 − x

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

2) y > − 0.5∗ x− 1

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

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!