27.05 Кластеры в трехмерном пространстве
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри шара радиусом . Каждая звезда обязательно
принадлежит только одному из кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
в трехмерном
пространстве, которое вычисляется по формуле:
В файле A хранятся данные о звёздах двух кластеров, где для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
, затем
координата
. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что
количество звёзд не превышает 1000.
В файле Б хранятся данные о звёздах трех кластеров, где для каждого кластера. Известно, что количество
звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите три числа: — среднее
арифметическое абсцисс центров кластеров,
– среднее арифметическое ординат центров кластеров, и
– среднее
арифметическое аппликат центров кластеров.
В ответе запишите шесть чисел через пробел: сначала целую часть произведения для файла А, затем
для файла А, и затем
для файла А, далее целую часть произведения
для файла Б,
для файла Б и
для файла Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная». Таким способом можно построить только
двухмерную диаграмму, однако для примерного понимания положения кластеров в пространстве этой диаграммы будет
достаточно.
Диаграмма для файла А имеет вид:
Из графика видно, что один кластер имеет положительные координаты , а другой отрицательные. Пользуясь
этим знанием, разделим данные на кластеры в программе.
Код для файла А
from math import * f = open("A.txt") n = f.readline() a = [[] for i in range(2)] for i in range(890 - 1): star = list(map(float, f.readline().replace(’,’, ’.’).split())) if star[0] > 0 and star[1] > 0: a[0].append(star) else: a[1].append(star) sum_x = sum_y = sum_z = tx = ty = tz = 0 for i in a: mn = 100000050000 for zvezda_1 in i: sm = 0 for zvezda_2 in i: sm += dist(zvezda_1, zvezda_2) if sm < mn: mn = sm tx, ty, tz = zvezda_1 sum_x += tx sum_y += ty sum_z += tz print(int(abs(sum_x / 2) * 1000)) print(int(abs(sum_y / 2) * 1000)) print(int(abs(sum_z / 2) * 1000))
Диаграмма для файла Б имеет вид:
Из графика видно, что один кластер имеет только отрицательные координаты , у другого координата
только отрицательная, а
больше 7. Пользуясь этим знанием, разделим данные на кластеры в программе.
Код для файла Б
from math import * f = open("B.txt") n = f.readline() a = [[] for i in range(3)] for i in range(9320 - 1): star = list(map(float, f.readline().replace(’,’, ’.’).split())) if star[0] < 0 and star[1] < 0: a[0].append(star) elif star[0] < 0 and star[1] > 7: a[1].append(star) else: a[2].append(star) sum_x = sum_y = sum_z = tx = ty = tz = 0 for i in a: mn = 100000050000 for zvezda_1 in i: sm = 0 for zvezda_2 in i: sm += dist(zvezda_1, zvezda_2) if sm < mn: mn = sm tx, ty, tz = zvezda_1 sum_x += tx sum_y += ty sum_z += tz print(int(abs(sum_x / 3) * 1000)) print(int(abs(sum_y / 3) * 1000)) print(int(abs(sum_z / 3) * 1000))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри шара радиусом . Каждая звезда обязательно
принадлежит только одному из кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
в трехмерном
пространстве, которое вычисляется по формуле:
В файле A хранятся данные о звёздах двух кластеров, где для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
, затем
координата
. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что
количество звёзд не превышает 7000.
В файле Б хранятся данные о звёздах четырех кластеров, где для каждого кластера. Известно, что
количество звёзд не превышает 16 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите три числа: — среднее
арифметическое абсцисс центров кластеров,
– среднее арифметическое ординат центров кластеров, и
– среднее
арифметическое аппликат центров кластеров.
В ответе запишите шесть чисел через пробел: сначала целую часть произведения для файла А, затем
для файла А, и затем
для файла А, далее целую часть произведения
для файла Б,
для файла Б и
для файла Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная». Таким способом можно построим по отдельности
двухмерные проекции кластеров на оси
,
и
.
Диаграммы для файла А имеют вид:
Из графика видно, что один кластер имеет ординаты, большие 20, а другой – меньшие 20. Пользуясь этим знанием, разделим данные на кластеры в программе.
Код для файла А
from math import * f = open(’3_A.txt’) n = f.readline() a = [list(map(float,i.replace(’,’,’.’).split())) for i in f] clusters = [[] for i in range(2)] for i in a: if i[1] > 20: clusters[0].append(i) else: clusters[1].append(i) sum_x = sum_y = sum_z = tx = ty = tz = 0 for cluster in clusters: mn = 10**20 for star_1 in cluster: sm = 0 for star_2 in cluster: sm += dist(star_1,star_2) if sm < mn: mn = sm tx,ty,tz = star_1 sum_x += tx sum_y += ty sum_z += tz print(int(abs(sum_x/2)*10)) print(int(abs(sum_y/2)*10)) print(int(abs(sum_z/2)*10))
Диаграммы для файла Б имеют вид:
Из графика видно, что все кластеры распределены по четырем координатным осям. Пользуясь этим знанием, разделим данные на кластеры в программе.
Код для файла Б
from math import * f = open(’3_B.txt’) n = f.readline() clusters = [[] for i in range(4)] for i in f: star = list(map(float, i.replace(’,’, ’.’).split())) if star[0] > 0 and star[1] > 0: clusters[0].append(star) elif star[0] < 0 and star[1]>0: clusters[1].append(star) elif star[0]<0 and star[1] < 0: clusters[2].append(star) else: clusters[3].append(star) sum_x = sum_y = sum_z = tx = ty = tz = 0 for cluster in clusters: mn = 10**20 for star_1 in cluster: sm = 0 for star_2 in cluster: sm += dist(star_1,star_2) if sm < mn: mn = sm tx,ty,tz = star_1 sum_x += tx sum_y += ty sum_z += tz print(int(abs(sum_x/4)*10)) print(int(abs(sum_y/4)*10)) print(int(abs(sum_z/4)*10))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри шара радиусом . Каждая звезда обязательно
принадлежит только одному из кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
в трехмерном
пространстве, которое вычисляется по формуле:
В файле A хранятся данные о звёздах трех кластеров, где для каждого кластера. В каждой строке записана
информация о расположении на карте одной звезды: сначала координата
, затем координата
, затем координата
. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество
звёзд не превышает 7000.
В файле Б хранятся данные о звёздах шести кластеров, где для каждого кластера. Известно, что
количество звёзд не превышает 16 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите одно число: —
произведение средних арифметических абсцисс, ординат и аппликат центров кластеров.
В ответе запишите два числа через пробел: сначала целую часть частного для файла А, далее целую часть
частного
для файла Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная». Таким способом можно построим по отдельности
двухмерные проекции кластеров на оси
,
и
.
Диаграммы для файла А имеют вид:
Из графика видно, что один кластер имеет абсциссы, меньшие 50, другой – от 200 до 250, а третий все остальные. Пользуясь этим знанием, разделим данные на кластеры в программе.
Код для файла А
from math import * f = open(’4_A.txt’) n = f.readline() clusters = [[] for i in range(3)] for i in f: star = list(map(float, i.replace(’,’, ’.’).split())) if star[0] < 50: clusters[0].append(star) elif 200 < star[0] < 250: clusters[1].append(star) else: clusters[2].append(star) sum_x = sum_y = sum_z = tx = ty = tz = 0 for cluster in clusters: mn = 10**20 for star_1 in cluster: sm = 0 for star_2 in cluster: sm += dist(star_1,star_2) if sm < mn: mn = sm tx,ty,tz = star_1 sum_x += tx sum_y += ty sum_z += tz print(int(((sum_x/3)*(sum_y/3)*(sum_z/3))/25))
Диаграммы для файла Б имеют вид:
Из графика видно, что шесть кластеров распределены следующим образом:
1. Первый имеет абсциссы меньшие 20
2. Второй абсциссы от 50 до 80
3. Третий ординаты меньшие 40 и абсциссы от 90 до 110
4. Четвертый ординаты от 40 до 60 и абсциссы от 80 до 120
5. Пятый абсциссы меньшие 120, а ординаты большие 100
6. Шестой все остальные точки
Код для файла Б
from math import * f = open(’4_B.txt’) n = f.readline() clusters = [[] for i in range(6)] for i in f: star = list(map(float, i.replace(’,’, ’.’).split())) if star[0] < 20: clusters[0].append(star) elif 50 < star[0] < 80: clusters[1].append(star) elif 90 < star[0] < 110 and star[1] < 40: clusters[2].append(star) elif 80 < star[0] < 120 and 40 < star[1] < 60: clusters[3].append(star) elif star[0] < 120 and star[1] > 100: clusters[4].append(star) else: clusters[5].append(star) sum_x = sum_y = sum_z = tx = ty = tz = 0 for cluster in clusters: mn = 10**20 for star_1 in cluster: sm = 0 for star_2 in cluster: sm += dist(star_1,star_2) if sm < mn: mn = sm tx,ty,tz = star_1 sum_x += tx sum_y += ty sum_z += tz print(int((sum_x/6) * (sum_y/6) * (sum_z/6) / 75))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри шара радиусом . Каждая звезда обязательно
принадлежит только одному из кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
в трехмерном
пространстве, которое вычисляется по формуле:
В файле A хранятся данные о звёздах четырех кластеров, где для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
, затем
координата
. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что
количество звёзд не превышает 12000.
В файле Б хранятся данные о звёздах пяти кластеров, где для каждого кластера. Известно, что количество
звёзд не превышает 20 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите одно число:
— корень квадратный от суммы средних арифметических абсцисс, ординат и аппликат центров
кластеров.
В ответе запишите два числа через пробел: сначала целую часть для файла А, далее целую часть
для
файла Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная». Таким способом можно построим по отдельности
двухмерные проекции кластеров на оси
,
и
.
Диаграммы для файла А имеют вид:
Из графика видно, что один кластер имеет абсциссы, меньшие 40.
Второй кластер имеет ординаты, меньшие 100, а абсциссы от 60 до 100.
Третий кластер имеет абсциссы, большие 130, а четвертый – все остальные. Пользуясь этим знанием, разделим данные на кластеры в программе.
Код для файла А
from math import * f = open(’5_A.txt’) n = f.readline() clusters = [[] for i in range(4)] for i in f: star = list(map(float, i.replace(’,’, ’.’).split())) if star[0] < 40: clusters[0].append(star) elif 60 < star[0] < 100 and star[1] < 100: clusters[1].append(star) elif star[1] > 130: clusters[2].append(star) else: clusters[3].append(star) sum_x = sum_y = sum_z = tx = ty = tz = 0 for cluster in clusters: mn = 10**20 for star_1 in cluster: sm = 0 for star_2 in cluster: sm += dist(star_1,star_2) if sm < mn: mn = sm tx,ty,tz = star_1 sum_x += tx sum_y += ty sum_z += tz print(int((sum_x/4+sum_y/4+sum_z/4)**0.5))
Диаграммы для файла Б имеют вид:
Из графика видно, что шесть кластеров распределены следующим образом:
1. Первый имеет абсциссы меньшие 60
2. Второй абсциссы от 70 до 90, а ординаты от 70
3. Третий абсциссы от 80 до 100, а ординаты меньшие 65
4. Четвертый ординаты от 140 и абсциссы меньшие 135
5. Пятый все остальные точки
Код для файла Б
from math import * f = open(’5_B.txt’) n = f.readline() clusters = [[] for i in range(5)] for i in f: star = list(map(float, i.replace(’,’, ’.’).split())) if star[0] < 60: clusters[0].append(star) elif 70 < star[0] < 90 and star[1] > 70: clusters[1].append(star) elif 80 < star[0] < 100 and star[1] < 65: clusters[2].append(star) elif star[0] < 135 and star[1] > 140: clusters[3].append(star) else: clusters[4].append(star) sum_x = sum_y = sum_z = tx = ty = tz = 0 for cluster in clusters: mn = 10**20 for star_1 in cluster: sm = 0 for star_2 in cluster: sm += dist(star_1,star_2) if sm < mn: mn = sm tx,ty,tz = star_1 sum_x += tx sum_y += ty sum_z += tz print(int((sum_x/5+sum_y/5+sum_z/5)**0.5))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри шара радиусом . Каждая звезда обязательно
принадлежит только одному из кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
в трехмерном
пространстве, которое вычисляется по формуле:
В файле A хранятся данные о звёздах двух кластеров, где для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
, затем
координата
. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что
количество звёзд не превышает 8000.
В файле Б хранятся данные о звёздах трех кластеров, где для каждого кластера. Известно, что количество
звёзд не превышает 20 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите одно число: —
квадрат произведения средних арифметических абсцисс, ординат и аппликат центров кластеров.
В ответе запишите два числа через пробел: сначала целую часть частного для файла А, далее целую часть
частного
для файла Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная». Таким способом можно построить только
двухмерную проекцию кластеров на ось
, однако для примерного понимания положения кластеров в
пространстве этой диаграммы будет достаточно.
Диаграмма для файла А имеет вид:
Из графика видно, что один кластер имеет абсциссы, меньшие 15, другой – все остальные. Пользуясь этим знанием, разделим данные на кластеры в программе.
Код для файла А
from math import * f = open(’3_A.txt’) n = f.readline() clusters = [[] for i in range(2)] for i in f: star = list(map(float, i.replace(’,’, ’.’).split())) if star[0] < 15: clusters[0].append(star) else: clusters[1].append(star) sum_x = sum_y = sum_z = tx = ty = tz = 0 for cluster in clusters: mn = 10**20 for star_1 in cluster: sm = 0 for star_2 in cluster: sm += dist(star_1,star_2) if sm < mn: mn = sm tx,ty,tz = star_1 sum_x += tx sum_y += ty sum_z += tz print(int((((sum_x/2)*(sum_y/2)*(sum_z/2)) ** 2 ) / 3))
Диаграмма для файла Б имеет вид:
Из графика видно, что три кластеров распределены следующим образом:
1. Первый имеет ограничения:
2. Второй имеет ограничения:
3. Третий все остальные точки
Код для файла Б
from math import * f = open(’3_B.txt’) n = f.readline() clusters = [[] for i in range(3)] for i in f: star = list(map(float, i.replace(’,’, ’.’).split())) if star[0] < 15 and star[1] < 15: clusters[0].append(star) elif star[1] < 1.5*star[0]-2.5: clusters[1].append(star) else: clusters[2].append(star) sum_x = sum_y = sum_z = tx = ty = tz = 0 for cluster in clusters: mn = 10**20 for star_1 in cluster: sm = 0 for star_2 in cluster: sm += dist(star_1,star_2) if sm < mn: mn = sm tx,ty,tz = star_1 sum_x += tx sum_y += ty sum_z += tz print(int((((sum_x/3)*(sum_y/3)*(sum_z/3)) ** 2 ) / 3))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на
расстоянии не более условных единиц. Каждая звезда обязательно принадлежит только одному из
кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
в трехмерном
пространстве, которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.
В файле A хранятся данные о звёздах трех кластеров, где для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
, затем
координата
. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что
количество звёзд не превышает 8000.
В файле Б хранятся данные о звёздах четырех кластеров, где для каждого кластера. Известно, что
количество звёзд не превышает 20000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите одно число: —
квадрат произведения средних арифметических абсцисс, ординат и аппликат центров кластеров.
В ответе запишите два числа через пробел: сначала целую часть частного для файла А, далее целую часть
частного
для файла Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная». Таким способом можно построить только
двухмерную проекцию кластеров на ось
, однако для примерного понимания положения кластеров в
пространстве этой диаграммы будет достаточно.
Диаграмма для файла А имеет вид:
Код для файла А
from math import * def dist_3d(p1, p2): # Расстояние между точками в декартовой системе координат return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2) ** 0.5 def dbscan(a, r): cl = [] # Инициализируем список для хранения кластеров while a: # Пока есть элементы в входном массиве ’a’ cl.append([a.pop(0)]) for i in cl[-1]: # Проходим по элементам последнего кластера for j in a[:]: if dist_3d(i, j) <= r: cl[-1].append(j) # Добавляем ’j’ в текущий кластер a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова return cl f = open("4_A.txt") s = f.readline() a = [list(map(float, i.replace(",", ".").split())) for i in f] cl = dbscan(a, 0.8) # Для файла А cl_total = [] for i in cl: if len(i) > 10: cl_total.append(i) sum_x = sum_y = sum_z = 0 for cluster in cl_total: tx = ty = tz = 0 mn = 10 ** 20 for centroid in cluster: sm = 0 for star in cluster: sm += dist_3d(centroid, star) if sm < mn: mn = sm tx, ty , tz = centroid[0], centroid[1], centroid[2] sum_x += tx sum_y += ty sum_z += tz print(int(((sum_x / 3 * sum_y / 3 * sum_z / 3) ** 2) / 10))
Диаграмма для файла Б имеет вид:
Код для файла Б
from math import * def dist_3d(p1, p2): # Расстояние между точками в декартовой системе координат return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2) ** 0.5 def dbscan(a, r): cl = [] # Инициализируем список для хранения кластеров while a: # Пока есть элементы в входном массиве ’a’ cl.append([a.pop(0)]) for i in cl[-1]: # Проходим по элементам последнего кластера for j in a[:]: if dist_3d(i, j) <= r: cl[-1].append(j) # Добавляем ’j’ в текущий кластер a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова return cl f = open("4_B.txt") s = f.readline() a = [list(map(float, i.replace(",", ".").split())) for i in f] cl = dbscan(a, 0.9) # Для файла Б cl_total = [] for i in cl: if len(i) > 10: cl_total.append(i) sum_x = sum_y = sum_z = 0 for cluster in cl_total: tx = ty = tz = 0 mn = 10 ** 20 for centroid in cluster: sm = 0 for star in cluster: sm += dist_3d(centroid, star) if sm < mn: mn = sm tx, ty , tz = centroid[0], centroid[1], centroid[2] sum_x += tx sum_y += ty sum_z += tz print(int(((sum_x / 4 * sum_y / 4 * sum_z / 4) ** 2) * 100))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на
расстоянии не более условных единиц. Каждая звезда обязательно принадлежит только одному из
кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
в трехмерном
пространстве, которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более от точек кластеров. При расчётах аномалии
учитывать не нужно.
В файле A хранятся данные о звёздах двух кластеров, где для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
, затем
координата
. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что
количество звёзд не превышает 10000.
В файле Б хранятся данные о звёздах четырех кластеров, где для каждого кластера. Известно, что
количество звёзд не превышает 21000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центроида каждого кластера, затем вычислите три числа: –
среднее арифметическое абсцисс центроидов кластеров,
– среднее арифметическое ординат центроидов кластеров
и
– среднее арифметическое аппликат центроидов кластеров.
В ответе запишите шесть чисел через пробел: сначала целую часть произведений ,
и
для файла А, далее целую часть произведения
,
и
для файла
Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная». Таким способом можно построить только
двухмерную проекцию кластеров на ось
, однако для примерного понимания положения кластеров в
пространстве этой диаграммы будет достаточно.
Дополнительно для визуализации можно сделать 3Д график, но это требует более углубленных навыков владения Python и его библиотек.
Диаграммы для файла А имеет вид:
Код для файла А
from math import * def dist_3d(p1, p2): # Расстояние между точками в декартовой системе координат return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2) ** 0.5 def dbscan(a, r): cl = [] # Инициализируем список для хранения кластеров while a: # Пока есть элементы в входном массиве ’a’ cl.append([a.pop(0)]) for i in cl[-1]: # Проходим по элементам последнего кластера for j in a[:]: if dist_3d(i, j) <= r: cl[-1].append(j) # Добавляем ’j’ в текущий кластер a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова return cl f = open("5_A.txt") s = f.readline() a = [list(map(float, i.replace(",", ".").split())) for i in f] cl = dbscan(a, 2) # Для файла A cl_total = [] for i in cl: if len(i) > 10: cl_total.append(i) sum_x = sum_y = sum_z = 0 for cluster in cl_total: tx = ty = tz = 0 mn = 10 ** 20 for centroid in cluster: sm = 0 for star in cluster: sm += dist_3d(centroid, star) if sm < mn: mn = sm tx, ty , tz = centroid[0], centroid[1], centroid[2] sum_x += tx sum_y += ty sum_z += tz print(int(abs(sum_x/ 2) * 100), int(abs(sum_y/ 2) * 100), int(abs(sum_z/ 2) * 100))
Диаграмма для файла Б имеет вид:
Код для файла Б
from math import * def dist_3d(p1, p2): # Расстояние между точками в декартовой системе координат return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2) ** 0.5 def dbscan(a, r): cl = [] # Инициализируем список для хранения кластеров while a: # Пока есть элементы в входном массиве ’a’ cl.append([a.pop(0)]) for i in cl[-1]: # Проходим по элементам последнего кластера for j in a[:]: if dist_3d(i, j) <= r: cl[-1].append(j) # Добавляем ’j’ в текущий кластер a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова return cl f = open("5_B.txt") s = f.readline() a = [list(map(float, i.replace(",", ".").split())) for i in f] cl = dbscan(a, 3) # Для файла Б cl_total = [] for i in cl: if len(i) > 10: cl_total.append(i) sum_x = sum_y = sum_z = 0 for cluster in cl_total: tx = ty = tz = 0 mn = 10 ** 20 for centroid in cluster: sm = 0 for star in cluster: sm += dist_3d(centroid, star) if sm < mn: mn = sm tx, ty , tz = centroid[0], centroid[1], centroid[2] sum_x += tx sum_y += ty sum_z += tz print(int(abs(sum_x/ 4) * 100), int(abs(sum_y/ 4) * 100), int(abs(sum_z/ 4) * 100))
Ошибка.
Попробуйте повторить позже
Лосяш решил исследовать звёздное небо над Долиной Смешариков. Он провёл кластеризацию множества звёзд по их
расположению на трёхмерной карте. Кластер звёзд — это набор точек на графике, каждая из которых находится от
хотя бы одной другой звезды на расстоянии не более условных единиц. Каждая звезда принадлежит только одному
кластеру.
Истинный центр кластера, или центроид, — это одна из звёзд, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Расстояние между двумя точками и
в трёхмерном пространстве вычисляется по формуле
Евклида:
Аномалиями называются точки, расположенные на расстоянии более одной условной единицы от всех точек кластеров. Аномалии в расчётах учитывать не нужно.
В файле A хранятся данные о звёздах трёх кластеров, где для каждого кластера. В каждой строке
записаны координаты одной звезды:
, затем
, затем
. Значения даны в условных единицах как вещественные
числа. Количество звёзд не превышает 1200.
В файле B хранятся данные о звёздах двух кластеров, где для каждого кластера. Количество звёзд не
превышает 5200. Структура данных в файле B аналогична файлу A.
Для каждого файла определите координаты центроида каждого кластера, затем вычислите одно число: —
квадрат произведения средних арифметических абсцисс, ординат и аппликат центроидов кластеров.
В ответе запишите два числа через пробел: сначала целую часть частного для файла A, затем целую часть
произведения
для файла B.
Внимание! График приведён в иллюстративных целях для произвольных значений и не относится к заданию. Используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условиях кластеров. Откроем файлы в , перейдём в раздел «Вставка
Диаграммы
Точечная». Это позволит построить двухмерную проекцию кластеров на ось
, что
достаточно для примерного понимания их положения в пространстве.
Диаграмма для файла A имеет вид:
Диаграмма для файла B имеет вид:
Для разделения звёзд на кластеры используем алгоритм DBSCAN с соответствующими радиусами. Затем для
каждого кластера определим центроид, вычислив сумму расстояний от каждой звезды до остальных и выбрав звезду
с минимальной суммой. После этого рассчитаем как квадрат произведения средних координат
центроидов.
Код для файла A:
from math import * def dbscan(a, r): cl = [] # Инициализируем список для хранения кластеров while a: # Пока есть элементы в входном массиве ’a’ cl.append([a.pop(0)]) for i in cl[-1]: # Проходим по элементам последнего кластера for j in a[:]: if dist(i, j) <= r: cl[-1].append(j) # Добавляем ’j’ в текущий кластер a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова return cl f = open("3_A.txt") a = [list(map(float, i.replace(",", ".").split())) for i in f] cl = dbscan(a, 1.5) # Для файла А cl_total = [] for i in cl: if len(i) > 50: cl_total.append(i) sum_x = sum_y = sum_z = 0 for cluster in cl_total: tx = ty = tz = 0 mn = 10 ** 20 for centroid in cluster: sm = 0 for star in cluster: sm += dist(centroid, star) if sm < mn: mn = sm tx, ty, tz = centroid[0], centroid[1], centroid[2] sum_x += tx sum_y += ty sum_z += tz print(int(((sum_x / 3 * sum_y / 3 * sum_z / 3) ** 2) / 5))
Код для файла B:
from math import * def dbscan(a, r): cl = [] # Инициализируем список для хранения кластеров while a: # Пока есть элементы в входном массиве ’a’ cl.append([a.pop(0)]) for i in cl[-1]: # Проходим по элементам последнего кластера for j in a[:]: if dist(i, j) <= r: cl[-1].append(j) # Добавляем ’j’ в текущий кластер a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова return cl f = open("3_B.txt") a = [list(map(float, i.replace(",", ".").split())) for i in f] cl = dbscan(a, 0.7) cl_total = [] for i in cl: if len(i) > 10: cl_total.append(i) sum_x = sum_y = sum_z = 0 for cluster in cl_total: tx = ty = tz = 0 mn = 10 ** 20 for centroid in cluster: sm = 0 for star in cluster: sm += dist(centroid, star) if sm < mn: mn = sm tx, ty, tz = centroid[0], centroid[1], centroid[2] sum_x += tx sum_y += ty sum_z += tz print(int(((sum_x / 2 * sum_y / 2 * sum_z / 2) ** 2) * 50))
Ошибка.
Попробуйте повторить позже
Безумный учёный, одержимый идеей контроля над галактикой, решил исследовать звёзды в трёхмерном пространстве
своего секретного лабораторного комплекса. Он провёл кластеризацию звёзд по их расположению. Кластер звёзд — это
набор точек, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более условных
единиц. Каждая звезда принадлежит только одному кластеру.
Истинный центр кластера, или центроид, — это звезда, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Расстояние между двумя точками и
вычисляется по формуле:
Аномалиями называются точки, удалённые более чем на одну условную единицу от всех точек кластеров. Аномалии в расчётах не учитываются.
В файле A хранятся данные о звёздах четырёх кластеров, где для каждого кластера. В каждой строке
указаны координаты звезды:
,
,
. Значения — вещественные числа в условных единицах. Количество звёзд не
превышает 1100.
В файле B хранятся данные о звёздах трёх кластеров, где для каждого кластера. Количество звёзд не
превышает 25000. Структура данных аналогична файлу A.
Для каждого файла найдите координаты центроида каждого кластера, затем вычислите — квадрат
произведения средних арифметических абсцисс, ординат и аппликат центроидов.
В ответе укажите два числа через пробел: сначала целую часть для файла A, затем целую часть
для файла B.
Внимание! График приведён для иллюстрации и не связан с заданием. Используйте данные из прилагаемого файла.
Оценим расположение кластеров, открыв файлы в и построив точечные диаграммы через раздел
«Вставка
Диаграммы
Точечная». Это даст представление о двухмерной проекции на плоскость
.
Диаграмма для файла A имеет вид:
Диаграмма для файла B имеет вид:
Применяем алгоритм DBSCAN для кластеризации с заданными радиусами. Для каждого кластера находим
центроид, минимизируя сумму расстояний до других звёзд. Затем вычисляем на основе средних координат
центроидов.
Код для файла A:
from math import * def dbscan(a, r): cl = [] # Инициализируем список для хранения кластеров while a: # Пока есть элементы в входном массиве ’a’ cl.append([a.pop(0)]) for i in cl[-1]: # Проходим по элементам последнего кластера for j in a[:]: if dist(i, j) <= r: cl[-1].append(j) # Добавляем ’j’ в текущий кластер a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова return cl f = open("4_A.txt") a = [list(map(float, i.replace(",", ".").split())) for i in f] cl = dbscan(a, 1.2) # Для файла А cl_total = [] for i in cl: if len(i) > 10: cl_total.append(i) sum_x = sum_y = sum_z = 0 for cluster in cl_total: tx = ty = tz = 0 mn = 10 ** 20 for centroid in cluster: sm = 0 for star in cluster: sm += dist(centroid, star) if sm < mn: mn = sm tx, ty, tz = centroid[0], centroid[1], centroid[2] sum_x += tx sum_y += ty sum_z += tz print(int(((sum_x / 4 * sum_y / 4 * sum_z / 4) ** 2) / 8))
Код для файла B:
def dbscan(a, r): cl = [] # Инициализируем список для хранения кластеров while a: # Пока есть элементы в входном массиве ’a’ cl.append([a.pop(0)]) for i in cl[-1]: # Проходим по элементам последнего кластера for j in a[:]: if dist(i, j) <= r: cl[-1].append(j) # Добавляем ’j’ в текущий кластер a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова return cl f = open("4_B.txt") s = f.readline() a = [list(map(float, i.replace(",", ".").split())) for i in f] cl = dbscan(a, 1) cl_total = [] for i in cl: if len(i) > 10: cl_total.append(i) sum_x = sum_y = sum_z = 0 for cluster in cl_total: tx = ty = tz = 0 mn = 10 ** 20 for centroid in cluster: sm = 0 for star in cluster: sm += dist(centroid, star) if sm < mn: mn = sm tx, ty, tz = centroid[0], centroid[1], centroid[2] sum_x += tx sum_y += ty sum_z += tz print(int(((sum_x / 3 * sum_y / 3 * sum_z / 3) ** 2) * 20))
Ошибка.
Попробуйте повторить позже
Финес и Ферб, вдохновлённые летними каникулами, решили построить трёхмерную модель звёздного неба и
провести кластеризацию звёзд. Кластер звёзд — это набор точек, где каждая звезда находится от хотя бы
одной другой на расстоянии не более условных единиц. Каждая звезда принадлежит только одному
кластеру.
Истинный центр кластера, или центроид, — это звезда, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Расстояние между точками и
вычисляется по формуле:
Аномалиями называются точки, расположенные более чем на одну условную единицу от всех точек кластеров. Аномалии в расчётах не учитываются.
В файле A хранятся данные о звёздах двух кластеров, где для каждого кластера. В каждой строке
записаны координаты звезды:
,
,
. Значения — вещественные числа в условных единицах. Количество звёзд не
превышает 1000.
В файле B хранятся данные о звёздах четырёх кластеров, где для каждого кластера. Количество звёзд не
превышает 5200. Структура данных аналогична файлу A.
Для каждого файла определите координаты центроида каждого кластера, затем вычислите — квадрат
произведения средних арифметических абсцисс, ординат и аппликат центроидов.
В ответе запишите два числа через пробел: сначала целую часть для файла A, затем целую часть
для файла B.
Внимание! График приведён в иллюстративных целях и не относится к заданию. Используйте данные из прилагаемого файла.
Визуализируем данные, открыв файлы в и построив точечные диаграммы через «Вставка
Диаграммы
Точечная». Это покажет двухмерную проекцию кластеров на ось
.
Диаграмма для файла A имеет вид:
Диаграмма для файла B имеет вид:
Используем DBSCAN для кластеризации с заданными радиусами. Находим центроиды кластеров, минимизируя
сумму расстояний, и вычисляем на основе средних координат.
Код для файла A:
from math import * def dbscan(a, r): cl = [] # Инициализируем список для хранения кластеров while a: # Пока есть элементы в входном массиве ’a’ cl.append([a.pop(0)]) for i in cl[-1]: # Проходим по элементам последнего кластера for j in a[:]: if dist(i, j) <= r: cl[-1].append(j) # Добавляем ’j’ в текущий кластер a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова return cl f = open("5_A.txt") a = [list(map(float, i.replace(",", ".").split())) for i in f] cl = dbscan(a, 1) cl_total = [] for i in cl: if len(i) > 10: cl_total.append(i) sum_x = sum_y = sum_z = 0 for cluster in cl_total: tx = ty = tz = 0 mn = 10 ** 20 for centroid in cluster: sm = 0 for star in cluster: sm += dist(centroid, star) if sm < mn: mn = sm tx, ty, tz = centroid[0], centroid[1], centroid[2] sum_x += tx sum_y += ty sum_z += tz print(int(((sum_x / 2 * sum_y / 2 * sum_z / 2) ** 2) / 4))
Код для файла B:
from math import * def dbscan(a, r): cl = [] # Инициализируем список для хранения кластеров while a: # Пока есть элементы в входном массиве ’a’ cl.append([a.pop(0)]) for i in cl[-1]: # Проходим по элементам последнего кластера for j in a[:]: if dist(i, j) <= r: cl[-1].append(j) # Добавляем ’j’ в текущий кластер a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова return cl f = open("5_B.txt") a = [list(map(float, i.replace(",", ".").split())) for i in f] cl = dbscan(a, 0.7) cl_total = [] for i in cl: if len(i) > 10: cl_total.append(i) sum_x = sum_y = sum_z = 0 for cluster in cl_total: tx = ty = tz = 0 mn = 10 ** 20 for centroid in cluster: sm = 0 for star in cluster: sm += dist(centroid, star) if sm < mn: mn = sm tx, ty, tz = centroid[0], centroid[1], centroid[2] sum_x += tx sum_y += ty sum_z += tz print(int(((sum_x / 4 * sum_y / 4 * sum_z / 4) ** 2) * 10))