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

27.02 Кластеры с аномалиями

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

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

Задача 1#101105Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиусом R. Каждая звезда обязательно принадлежит только одному из кластеров. Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна. Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

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

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

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

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

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

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

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

PIC

Вложения к задаче
Показать ответ и решение

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

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

PIC

Из нее видно, что все точки первого кластера расположены между абсциссами (-20; 20) и ординатами (0; 40). У второго же кластера все точки имеют абсциссу, большую 0, и ординату, меньшую -60.

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

f = open(’3A.txt’)
n = f.readline()
a = [[] for i in range(2)]
for i in range(811):
    star = list(map(float, f.readline().replace(’,’,’.’).split()))
    if (star[1] > 0 and star[1] < 40) and (star[0] > -20 and star[0] < 20):
        a[0].append(star)
    elif star[1] < -60 and star[0] > 0:
        a[1].append(star)

sum_x = sum_y = tx = ty = 0
for i in a:
    mn = 100000050000
    for j in i:
        x1, y1 = j
        sm = 0
        for k in i:
            x2, y2 = k
            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 / 2) * 100))
print(int(abs(sum_y / 2) * 100))

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

PIC

Из нее видно, что все точки, чьи абсциссы больше -20 и ординаты меньше -60, принадлежат первому кластеру; точки, чьи ординаты принадлежат интервалу (-40; 0) и абсциссы больше -40, – второму кластеру; а точки, чьи абсциссы меньше -60 и ординаты меньше -40, – третьему кластеру.

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

n = f.readline()
a = [[] for i in range(3)]
for i in range(11003):
    star = list(map(float, f.readline().replace(’,’, ’.’).split()))
    if star[1] < -60 and star[0] > -20:
        a[0].append(star)
    elif (star[1] < 0 and star[1] > -40) and star[0] > -40:
        a[1].append(star)
    elif star[1] < -40 and star[0] < -60:
        a[2].append(star)

sum_x = sum_y = tx = ty = 0
for i in a:
    mn = 100000050000
    for j in i:
        x1, y1 = j
        sm = 0
        for k in i:
            x2, y2 = k
            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) * 100))
print(int(abs(sum_y / 3) * 100))

Ответ: 3383 2354 3379 5675

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

Задача 2#101106Максимум баллов за задание: 2

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

Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна.

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

d(A, B) = ∘ (x-−-x-)2 +-(y-−-y-)2
            2   1      2   1

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

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

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

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

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|⋅100  для файла А, затем |P |⋅100
  y  для файла А, далее целую часть произведения |P |⋅100
 x  для файла Б и |P |⋅100
 y  для файла Б.

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

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

PIC

Вложения к задаче
Показать ответ и решение

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

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

PIC

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

1) − 9 < x < − 4;4 < y < 9

2) 1 < x < 5;3 < y < 8

3) 6 < x < 10;0 < y < 5

4) − 5 < x < 0;− 4 < y < 2

5) − 14 < x < − 9;− 11 < y < − 6

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

f = open(’4A.txt’)
n = f.readline()
a = [[] for i in range(5)]
for i in range(1508):
    star = list(map(float, f.readline().replace(’,’, ’.’).split()))
    if (-9 < star[0] < -4) and (4 < star[1] < 9):
        a[0].append(star)
    elif (1 < star[0] < 5) and (3 < star[1] < 8):
        a[1].append(star)
    elif (6 < star[0] < 10) and (0 < star[1] < 5):
        a[2].append(star)
    elif (-5 < star[0] < 0) and (-4 < star[1] < 2):
        a[3].append(star)
    elif (-14 < star[0] < -9) and (-11 < star[1] < -6):
        a[4].append(star)

sum_x = sum_y = tx = ty = 0
for i in a:
    mn = 100000050000
    for j in i:
        x1, y1 = j
        sm = 0
        for k in i:
            x2, y2 = k
            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) * 100))
print(int(abs(sum_y / 5) * 100))

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

PIC

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

1) − 19 < x < − 8;− 26 < y < − 14

2) − 6 < x < 5;2 < y < 14

3) x > 5;y > 0

4) − 14 < x < − 3;− 11 < y < 2

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

f = open(’4B.txt’)
n = f.readline()
a = [[] for i in range(4)]
for i in range(18008):
    star = list(map(float, f.readline().replace(’,’, ’.’).split()))
    if (-19 < star[0] < -8) and (-26 < star[1] < -14):
        a[0].append(star)
    elif (-6 < star[0] < 5) and (2 < star[1] < 14):
        a[1].append(star)
    elif (star[0] > 5) and (star[1] > 0):
        a[2].append(star)
    elif (-14 < star[0] < -3) and (-11 < star[1] < 2):
        a[3].append(star)

sum_x = sum_y = tx = ty = 0
for i in a:
    mn = 100000050000
    for j in i:
        x1, y1 = j
        sm = 0
        for k in i:
            x2, y2 = k
            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 / 4) * 100))
print(int(abs(sum_y / 4) * 100))

Ответ: 195 105 276 263

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

Задача 3#101596Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиусом R  . Каждая звезда обязательно принадлежит только одному из кластеров. Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна. Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

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

Аномалиями назовём точки, находящиеся на расстоянии более трёх условных единиц от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах четырех кластеров, где R = 9  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды: сначала координата x  , затем координата y  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 3000.

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

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

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

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

PIC

Вложения к задаче
Показать ответ и решение

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

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

PIC

Рассмотрим все 4 кластера и координаты, в которых они находятся:

1) − 180 < x < − 140,− 150 < y < − 110

2) − 180 < x < − 140,− 200 < y < − 150

3) − 10 < x < 25,− 180 < y < − 140

4) 60 < x < 90,− 55 < y < − 20

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

f = open(’2A.txt’)
n = f.readline()
a = [[] for i in range(4)]
for i in range(2145):
    star = list(map(float, f.readline().replace(’,’,’.’).split()))
    if -180 < star[0] < -140 and -150 < star[1] < -110:
        a[0].append(star)
    elif -180 < star[0] < -140 and -200 < star[1] < -150:
        a[1].append(star)
    elif 60 < star[0] < 90 and -55 < star[1] < -20:
        a[2].append(star)
    elif -10 < star[0] < 25 and -180 < star[1] < -140:
        a[3].append(star)

sum_x = sum_y = tx = ty = 0
for i in a:
    mn = 100000050000
    for j in i:
        x1, y1 = j
        sm = 0
        for k in i:
            x2, y2 = k
            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 / 4) * 1000))
print(int(abs(sum_y / 4) * 1000))

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

PIC

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

1) − 40 < x < 0,50 < y < 100

2) 125 < x < 165,− 50 < y < 0

3) 124 < x < 160,− 125 < y < − 75

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

f = open(’2B.txt’)
n = f.readline()
a = [[] for i in range(3)]
for i in range(15032):
    star = list(map(float, f.readline().replace(’,’,’.’).split()))
    if -40 < star[0] < 0 and 50 < star[1] < 100:
        a[0].append(star)
    elif 125 < star[0] < 165 and -50 < star[1] < 0:
        a[1].append(star)
    elif 124 < star[0] < 160 and -125 < star[1] < -75:
        a[2].append(star)

sum_x = sum_y = tx = ty = 0
for i in a:
    mn = 100000050000
    for j in i:
        x1, y1 = j
        sm = 0
        for k in i:
            x2, y2 = k
            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))

Ответ: 58649 124483 87368 18008

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

Задача 4#103236Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиусом R  . Каждая звезда обязательно принадлежит только одному из кластеров. Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна.

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

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

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

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

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

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

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

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

PIC

Вложения к задаче
Показать ответ и решение

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

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

PIC

Рассмотрим все 4 кластера и координаты, в которых они находятся:

1) x > 70,y > 0

2) − 10 < x < 0,y > 0

3) − 50 < x < − 30,− 40 < y < − 20

4) − 30 < x < − 18,y > 0

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

f = open(’2A.txt’)
n = f.readline()  # Считываем первую строку файла с названиями столбцов
a = [[] for i in range(4)]  # Создаём список для кластеров
# Считваем звёзды и определяем их к кластерам
for i in range(814):
    star = list(map(float, f.readline().replace(’,’,’.’).split()))
    if (star[0] > 70) and (star[1] > 0):
        a[0].append(star)
    elif (-10 < star[0] < 0) and (star[1] > 0):
        a[1].append(star)
    elif (-50 < star[0] < -30) and (-40 < star[1] < -20):
        a[2].append(star)
    elif (-30 < star[0] < -18) and (star[1] > 0):
        a[3].append(star)

sum_x = sum_y = 0  # Переменные для суммы абсцисс и ординат центров
for i in a:
    tx = ty = 0  # Координаты текущего центра кластера
    mn = 100000050000  # Минимальное расстояние
    for j in i:
        x1, y1 = j
        sm = 0  # Суммарное расстояние
        for k in i:
            x2, y2 = k
            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(sum_x / 4 * 10))
print(int(sum_y / 4 * 10))

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

PIC

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

1) y > 80

2) 40 < x < 60,− 20 < y < 20

3) y < − 80

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

f = open(’2B.txt’)
n = f.readline()  # Считываем первую строку файла с названиями столбцов
a = [[] for i in range(3)]  # Создаём список для кластеров
# Считваем звёзды и определяем их к кластерам
for i in range(20012):
    star = list(map(float, f.readline().replace(’,’,’.’).split()))
    if star[1] > 80:
        a[0].append(star)
    elif (40 < star[0] < 60) and (-20 < star[1] < 20):
        a[1].append(star)
    elif star[1] < -80:
        a[2].append(star)

sum_x = sum_y = 0  # Переменные для суммы абсцисс и ординат центров
for i in a:
    tx = ty = 0  # Координаты текущего центра кластера
    mn = 100000050000  # Минимальное расстояние
    for j in i:
        x1, y1 = j
        sm = 0  # Суммарное расстояние
        for k in i:
            x2, y2 = k
            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(sum_x / 3 * 10))
print(int(sum_y / 3 * 10))

Ответ: 19 400 69 18

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

Задача 5#103239Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба, а также по блеску звезды. Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиуса R  . Каждая звезда, подходящая под заданный уровень блеска, обязательно принадлежит только одному из кластеров. Остальные звёзды не относятся к рассматриваемым кластерам.

Истинная периферия кластера, или перифероид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера максимальна.

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

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

Аномалиями назовём точки, находящиеся на расстоянии более R  условных единиц от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах шести кластеров, где R = 10  для каждого кластера, а звёзды обладают блеском условных единиц, целая часть которых четна. В каждой строке записана информация об уровне блеска звезды, а также о расположении на карте одной звезды: сначала координата x  , затем координата y  и наконец уровень блеска m  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 3000.

В файле Б хранятся данные о звёздах трех кластеров, где R = 3  для каждого кластера, а звёзды обладают блеском условных единиц, целая часть которых нечетна. Известно, что количество звёзд не превышает 20000. Структура хранения информации о звездах в файле Б аналогична файлу А.

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

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

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

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

PIC

Вложения к задаче
Показать ответ и решение

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

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

PIC

Рассмотрим 6 кластеров и координаты, в которых они находятся:

1) x < − 280,y > 150

2) x < − 260,− 50 < y < 50

3) − 140 < x < − 100,− 200 < y < − 150

4) 140 < x < 200,− 100 < y < 0

5) 180 < x < 215,y < − 200

6) 215 < x < 250,y < − 200

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

f = open(’5A.txt’)
n = f.readline()  # Считываем первую строку файла с названиями столбцов

#распределение звезд на кластеры с помощью метода dbscan

# сохраняем массив данных
st = [list(map(float, i.replace(’,’, ’.’).split())) for i in f]
# подбираем по 1 звезде для каждого кластера меняя параметры в скобках
# for i in range(len(st)):
#     if (215 < st[i][0] < 250 and -200 > st[i][1]) and int(st[i][2]) % 2 == 0:
#         print(i)
#         break

a = [[[st[338][0], st[338][1]]], [[st[1332][0], st[1332][1]]], [[st[2][0], st[2][1]]], [[st[999][0], st[999][1]]], [[st[1666][0], st[1666][1]]], [[st[666][0], st[666][1]]]]

st.pop(1666), st.pop(1332), st.pop(999), st.pop(666), st.pop(338), st.pop(2)

# отсеиваем все звезды с неподходящим блеском
for i in range(len(st)):
    if int(st[i][2]) % 2 != 0:
        st[i] = ’*’
# разделяем звезды на кластеры методом dbscan
for k in range(6):
    for j in a[k]:
        for i in range(len(st)):
            if st[i] != ’*’:
                p = [st[i][0], st[i][1]]
                if dist(p, j) < 10 and int(st[i][2]) % 2 == 0:
                    a[k].append(p)
                    st[i] = ’*’

# распределение звезд на кластеры с помощью координат

a = [[] for i in range(6)]  # Создаём список для кластеров
for line in f:  # Считваем звёзды и определяем их к кластерам
    x, y, m = list(map(float, line.replace(’,’, ’.’).split()))
    if int(m) % 2 == 0:
        if (x < -280) and (y > 150):
            a[0].append([x, y])
        elif (x < -260) and (-50 < y < 50):
            a[1].append([x, y])
        elif (-140 < x < -100) and (-200 < y < -150):
                                                                                                  
                                                                                                  
            a[2].append([x, y])
        elif (140 < x < 200) and (-100 < y < 0):
            a[3].append([x, y])
        elif (180 < x < 215) and (y < -200):
            a[4].append([x, y])
        elif (215 < x < 250) and (y < -200):
            a[5].append([x, y])

sum_x = sum_y = 0  # Переменные для суммы абсцисс и ординат периферий
for i in a:
    tx = ty = 0  # Координаты текущей периферии кластера
    mx = -100000050000  # Максимальное расстояние
    for j in i:
        x1, y1 = j
        sm = 0  # Суммарное расстояние
        for k in i:
            x2, y2 = k
            sm += ((x2-x1)**2 + (y2-y1)**2)**0.5
        if sm > mx:
            mx = sm
            tx, ty = x1, y1
    sum_x += tx
    sum_y += ty
print(int(abs(sum_x / 6)))
print(int(abs(sum_y / 6)))

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

PIC

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

1) − 17 < x < − 5,40 < y < 50

2) 40 < x < 50,8 < y < 20

3)− 15 < x < 0,− 35 < y < − 20

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

f = open(’5B.txt’)
n = f.readline()  # Считываем первую строку файла с названиями столбцов

#распределение звезд на кластеры с помощью метода dbscan

# сохраняем массив данных
st = [list(map(float, i.replace(’,’, ’.’).split())) for i in f]
# подбираем по 1 звезде для каждого кластера меняя параметры в скобках
# for i in range(len(st)):
#     if (40 < st[i][0] < 50 and 8 < st[i][1] < 20) and int(st[i][2]) % 2 != 0:
#         print(i)
#         break

a = [[[st[8000][0], st[8000][1]]], [[st[4003][0], st[4003][1]]], [[st[2][0], st[2][1]]]]

st.pop(8000), st.pop(4003), st.pop(2)

# отсеиваем все звезды с неподходящим блеском
for i in range(len(st)):
    if int(st[i][2]) % 2 == 0:
        st[i] = ’*’
# разделяем звезды на кластеры методом dbscan
for k in range(3):
    for j in a[k]:
        for i in range(len(st)):
            if st[i] != ’*’:
                p = [st[i][0], st[i][1]]
                if dist(p, j) < 3 and int(st[i][2]) % 2 != 0:
                    a[k].append(p)
                    st[i] = ’*’

# распределение звезд на кластеры с помощью координат

a = [[] for i in range(3)]  # Создаём список для кластеров
for line in f:  # Считваем звёзды и определяем их к кластерам
    x, y, m = list(map(float, line.replace(’,’, ’.’).split()))
    if int(m) % 2 != 0:
        if (-17 < x < -5) and (40 < y < 50):
            a[0].append([x, y])
        elif (40 < x < 50) and (8 <  y < 20):
            a[1].append([x, y])
        elif (-15 < x < 0) and (-35 < y < -20):
                                                                                                  
                                                                                                  
            a[2].append([x, y])

sum_x = sum_y = 0  # Переменные для суммы абсцисс и ординат периферий
for i in a:
    tx = ty = 0  # Координаты текущей периферии кластера
    mx = -100000050000  # Максимальное расстояние
    for j in i:
        x1, y1 = j
        sm = 0  # Суммарное расстояние
        for k in i:
            x2, y2 = k
            sm += ((x2-x1)**2 + (y2-y1)**2)**0.5
        if sm > mx:
            mx = sm
            tx, ty = x1, y1
    sum_x += tx
    sum_y += ty
print(int(abs(sum_x / 3) * 500))
print(int(abs(sum_y / 3) * 500))

Ответ: 14 99 4765 6388

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

Задача 6#103464Максимум баллов за задание: 2

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

Истинный центр кластера, или центроид, – это одна из звёзд кластера, сумма расстояний от которой до всех остальных звёзд кластера минимальна.

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

d(A, B) = ∘ (x-−-x-)2 +-(y-−-y-)2
            2   1      2   1

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

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

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

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

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|⋅1000  для файла А и |P |⋅1000
  y  для файла А, далее целую часть произведения |P |⋅100
 x  для файла Б и |P |⋅100
 y  для файла Б.

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

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

PIC

Вложения к задаче
Показать ответ и решение

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

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

PIC

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

1) x < − 1  и − 1 < y < 2

2) x > 1  и y > 3

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

file = open("3_A.txt")
file.readline()
clusters = [[] for i in range(2)]
for star in file:
    x, y = list(map(float, star.replace(’,’, ’.’).split()))
    if (x < -1) and (-1 < y < 2):
        clusters[0].append((x, y))
    elif (x > 1) and (y > 3):
        clusters[1].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 / 2) * 1000))
print(int(abs(sum_y / 2) * 1000))

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

PIC

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

1) x < − 7  и y > − 3

2) x > 5  и y > 6

3) − 1 < x < 3  и y < − 5

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

file = open("3_B.txt")
file.readline()
clusters = [[] for i in range(3)]
for star in file:
    x, y = list(map(float, star.replace(’,’, ’.’).split()))
    if (x < -7) and (y > -3):
        clusters[0].append((x, y))
    elif (x > 5) and (y > 6):
        clusters[1].append((x, y))
    elif (-1 < x < 3) and (y < -5):
        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) * 100))
print(int(abs(sum_y / 3) * 100))

Ответ: 18 2293 25 92

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

Задача 7#103465Максимум баллов за задание: 2

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

Истинный центр кластера, или центроид, – это одна из звёзд кластера, сумма расстояний от которой до всех остальных звёзд кластера минимальна.

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

d(A, B) = ∘ (x-−-x-)2 +-(y-−-y-)2
            2   1      2   1

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах четырёх кластеров, где R = 2  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды: сначала координата x  , затем координата y  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 1500.

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

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

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|⋅500  для файла А и |P |⋅500
  y  для файла А, далее целую часть произведения |P |⋅50
 x  для файла Б и |P  |⋅50
  y  для файла Б.

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

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

PIC

Вложения к задаче
Показать ответ и решение

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

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

PIC

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

1) x < − 2.75  и y < − 2

2) x > 1  и y > 2

Для 3 и 4 кластеров проведём прямую через точки (0,2)  и (8,− 6)  . Уравнением этой прямой будет y = − x + 2  . Тогда кластеры отделяются следующими неравенствами:

3) y > − x + 2  и y < 1

4) y < − x + 2  и x > 1.5

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

file = open("4_A.txt")
file.readline()
clusters = [[] for i in range(4)]
for star in file:
    x, y = list(map(float, star.replace(’,’, ’.’).split()))
    if (x < -2.75) and (y < -2):
        clusters[0].append((x, y))
    elif (x > 1) and (y > 2):
        clusters[1].append((x, y))
    elif (y > -x + 2) and (y < 1):
        clusters[2].append((x, y))
    elif (y < -x + 2) and (x > 1.5):
        clusters[3].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 / 4) * 500))
print(int(abs(sum_y / 4) * 500))

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

PIC

Для данных 3 кластеров проведём всего 4 наклонные прямые для их отделения:

y = x  , y = x+ 1  , y = − x  и y = − 0.8∗x

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

1) y > − x  и y > x+ 1  и y > 2.5

2) y < x  и y > − 1.25∗ x  и y > − 5

3) y < x  и y < − 1.25∗ x  и y < − 2.5

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

file = open("4_B.txt")
file.readline()
clusters = [[] for i in range(3)]
for star in file:
    x, y = list(map(float, star.replace(’,’, ’.’).split()))
    if (y > -x) and (y > x + 1) and (y > 2.5):
        clusters[0].append((x, y))
    elif (y < x) and (y > -1.25*x) and (y > -5):
        clusters[1].append((x, y))
    elif (y < x) and (y < -1.25*x) and (y < -2.5):
        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) * 50))
print(int(abs(sum_y / 3) * 50))

Ответ: 1244 825 88 4

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

Задача 8#103615Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров. Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна. Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B (x2,y2)  на плоскости, которое вычисляется по формуле:

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

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах двух кластеров, где R = 0,5  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды: сначала координата x  , затем координата y  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 2500.

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

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

В ответе запишите четыре числа через пробел: сначала целую часть произведения Px ⋅100  для файла А, затем P  ⋅100
 y  для файла А, далее целую часть P ⋅100
 x  для файла Б и P  ⋅100
  y  для файла Б. Возможные данные одного из файлов иллюстрированы графиком.

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

PIC

Вложения к задаче
Показать ответ и решение

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

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

PIC

Из нее видно, что кластеры имеют необычную форму, поэтому для разделения точек по кластерам будем использовать метод dbscan. Чтобы найти стартовые точки определим области, в которых кластеры не перессекаются и нет анамальных точек. Для верхнего кластера будем использовать координаты: x ∈ [− 5;− 4],y ∈ [5;10]  . Для нижнего будем использовать координаты: x ∈ [15;20],y ∈ [− 5;5]  .

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

from math import *
f = open("1_A.txt")
s = f.readline() # Считываем первую строку файла с названиями столбцов
# сохраняем массив данных
st = [list(map(float, i.replace(’,’, ’.’).split())) for i in f]
# подбираем по 1 звезде для каждого кластера меняя параметры
# for i in range(len(st)):
#     if -5 < st[i][0] < -4 and 5 < st[i][1] < 10:
#         print(i)
#         break

a = [[[st[20][0], st[20][1]]], [[st[98][0], st[98][1]]]]

st.pop(98), st.pop(20)

# разделяем звезды на кластеры методом dbscan
for k in range(2):
    for j in a[k]:
        for i in range(len(st)):
            if st[i] != ’*’:
                p = [st[i][0], st[i][1]]
                if dist(p, j) < 0.5:
                    a[k].append(p)
                    st[i] = ’*’

sum_x = sum_y = 0  # Переменные для суммы абсцисс и ординат периферий
for i in a:
    tx = ty = 0  # Координаты текущей периферии кластера
    mn = 100000050000  # Минимальное расстояние
    for j in i:
        x1, y1 = j
        sm = 0  # Суммарное расстояние
        for k in i:
            x2, y2 = k
            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(sum_x / 2 * 100))
print(int(sum_y / 2 * 100))
                                                                                                  
                                                                                                  

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

PIC

Из нее видно, что кластеры имеют необычную форму, поэтому для разделения точек по кластерам будем использовать метод dbscan. Чтобы найти стартовые точки определим области, в которых кластеры не перессекаются и нет анамальных точек. Для верхнего левого кластера будем использовать координаты: x ∈ [0;5],y ∈ [4;5]  . Для верхнего правого кластера будем использовать координаты: x ∈ [13;15],y ∈ [3;4]  . Для нижнего левого будем использовать координаты: x ∈ [− 15;− 10],y ∈ [0;1]  . Для нижнего правого будем использовать координаты: x ∈ [5;10],y ∈ [− 3;− 2]  .

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

from math import *
f = open("1_B.txt")
s = f.readline() # Считываем первую строку файла с названиями столбцов
# сохраняем массив данных
st = [list(map(float, i.replace(’,’, ’.’).split())) for i in f]
# подбираем по 1 звезде для каждого кластера меняя параметры
# for i in range(len(st)):
#     if 5 < st[i][0] < 10 and -3 < st[i][1] < -2:
#         print(i)
#         break

a = [[[st[39][0], st[39][1]]], [[st[26][0], st[26][1]]], [[st[4][0], st[4][1]]], [[st[21][0], st[21][1]]]]

st.pop(39), st.pop(26), st.pop(21), st.pop(4)

# разделяем звезды на кластеры методом dbscan
for k in range(4):
    for j in a[k]:
        for i in range(len(st)):
            if st[i] != ’*’:
                p = [st[i][0], st[i][1]]
                if dist(p, j) < 0.2:
                    a[k].append(p)
                    st[i] = ’*’

# print(len(a[0]) + len(a[1]) + len(a[2]) + len(a[3]))
sum_x = sum_y = 0  # Переменные для суммы абсцисс и ординат периферий
for i in a:
    tx = ty = 0  # Координаты текущей периферии кластера
    mn = 100000050000  # Минимальное расстояние
    for j in i:
        x1, y1 = j
        sm = 0  # Суммарное расстояние
        for k in i:
            x2, y2 = k
            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(sum_x / 4 * 100))
                                                                                                  
                                                                                                  
print(int(sum_y / 4 * 100))

Ответ: 488 253 315 127

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

Задача 9#103840Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиусом R. Каждая звезда обязательно принадлежит только одному из кластеров. Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна. Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B (x2,y2)  на плоскости, которое вычисляется по формуле:

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

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах трех кластеров, где R = 3  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды: сначала координата x  , затем координата y  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 2500.

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

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

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

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

PIC

Вложения к задаче
Показать ответ и решение

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

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

PIC

Для решения задачи будем использовать метод dbscan. Определим границы для поиска стартовых точек в программе, так как нам необходимо найти лишь одну точку, которая принадлежит каждому кластеру, то границы обозначим примерные, но такие что анамалии в них не попадают. Для первого кластера: x ∈ [− 2;0],y ∈ [5;10]  . Для второго кластера: x ∈ [2;8],y ∈ [0;5]  . Для третьего кластера: x ∈ [− 6;− 2],y ∈ [− 5;0]  .

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

from math import *
f = open(’4_A.txt’)
s = f.readline() # Считываем первую строку файла с названиями столбцов
# сохраняем массив данных
st = [list(map(float, i.replace(’,’, ’.’).split())) for i in f]

# подбираем по 1 звезде для каждого кластера меняя параметры
# for i in range(len(st)):
#     if -6 < st[i][0] < -2 and -5 < st[i][1] < 0:
#         print(i)
#         break

a = [[[st[23][0], st[23][1]]], [[st[4][0], st[4][1]]], [[st[6][0], st[6][1]]]]

st.pop(23), st.pop(4), st.pop(6)

# разделяем звезды на кластеры методом dbscan
for k in range(3):
    for j in a[k]:
        for i in range(len(st)):
            if st[i] != ’*’:
                p = [st[i][0], st[i][1]]
                if dist(p, j) < 0.5:
                    a[k].append(p)
                    st[i] = ’*’

sum_x = sum_y = 0  # Переменные для суммы абсцисс и ординат периферий
for i in a:
    tx = ty = 0  # Координаты текущей периферии кластера
    mn = 100000050000  # Минимальное расстояние
    for j in i:
        x1, y1 = j
        sm = 0  # Суммарное расстояние
        for k in i:
            x2, y2 = k
            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))

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

PIC

Для решения задачи будем использовать метод dbscan. Определим границы для поиска стартовых точек в программе, так как нам необходимо найти лишь одну точку, которая принадлежит каждому кластеру, то границы обозначим примерные, но такие что анамалии в них не попадают. Для первого кластера: x ∈ [− 7;− 5],y ∈ [5;10]  . Для второго кластера: x ∈ [− 10;− 5],y ∈ [− 11;− 8]  . Для третьего кластера: x ∈ [− 1;1],y ∈ [− 1;1]  . Для четвертого кластера: x ∈ [5;7],y ∈ [− 10;− 5]  . Для пятого кластера: x ∈ [6;10],y ∈ [5;7]  .

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

from math import *
f = open(’4_B.txt’)
s = f.readline() # Считываем первую строку файла с названиями столбцов
# сохраняем массив данных
st = [list(map(float, i.replace(’,’, ’.’).split())) for i in f]

# подбираем по 1 звезде для каждого кластера меняя параметры
# for i in range(len(st)):
#     if 6 < st[i][0] < 10 and 5 < st[i][1] < 7:
#         print(i)
#         break

a = [[[st[9][0], st[9][1]]], [[st[32][0], st[32][1]]], [[st[14][0], st[14][1]]], [[st[2][0], st[2][1]]], [[st[16][0], st[16][1]]]]

st.pop(9), st.pop(32), st.pop(14), st.pop(2), st.pop(16)

# разделяем звезды на кластеры методом dbscan
for k in range(5):
    for j in a[k]:
        for i in range(len(st)):
            if st[i] != ’*’:
                p = [st[i][0], st[i][1]]
                if dist(p, j) < 0.5:
                    a[k].append(p)
                    st[i] = ’*’

sum_x = sum_y = 0  # Переменные для суммы абсцисс и ординат периферий
for i in a:
    tx = ty = 0  # Координаты текущей периферии кластера
    mn = 100000050000  # Минимальное расстояние
    for j in i:
        x1, y1 = j
        sm = 0  # Суммарное расстояние
        for k in i:
            x2, y2 = k
            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))

Ответ: 295 1734 200 1015
Рулетка
Вы можете получить скидку в рулетке!