27.02 Кластеры с аномалиями
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиусом R. Каждая звезда обязательно
принадлежит только одному из кластеров. Истинный центр кластера, или центроид, – это одна из звёзд на графике,
сумма расстояний от которой до всех остальных звёзд кластера минимальна. Под расстоянием понимается расстояние
Евклида между двумя точками и
на плоскости, которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.
В файле A хранятся данные о звёздах двух кластеров, где для каждого кластера. В каждой строке записана
информация о расположении на карте одной звезды: сначала координата
, затем координата
. Значения даны в
условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает
1000.
В файле Б хранятся данные о звёздах трех кластеров, где для каждого кластера. Известно, что количество
звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите два числа: —
среднее арифметическое абсцисс центров кластеров, и
– среднее арифметическое ординат центров
кластеров.
В ответе запишите четыре числа через пробел: сначала целую часть произведения для файла А, затем
для файла А, далее целую часть произведения
для файла Б и
для файла Б. Возможные
данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная».
Диаграмма для файла А имеет вид:
Из нее видно, что все точки первого кластера расположены между абсциссами (-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))
Диаграмма для файла Б имеет вид:
Из нее видно, что все точки, чьи абсциссы больше -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))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри прямоугольника высотой и шириной
.
Каждая звезда обязательно принадлежит только одному из кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
на плоскости,
которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.
В файле A хранятся данные о звёздах пяти кластеров, где ,
для каждого кластера. В
каждой строке записана информация о расположении на карте одной звезды: сначала координата x,
затем координата y. Значения даны в условных единицах. Известно, что количество звёзд не превышает
1600.
В файле B хранятся данные о звёздах четырех кластеров, где ,
для каждого кластера. Известно, что
количество звёзд не превышает 21000. Структура хранения информации о звездах в файле B аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите два числа: —
среднее арифметическое абсцисс центров кластеров, и
– среднее арифметическое ординат центров
кластеров.
В ответе запишите четыре числа через пробел: сначала целую часть произведения для файла А, затем
для файла А, далее целую часть произведения
для файла Б и
для файла
Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная».
Диаграмма для файла А имеет вид:
Рассмотрим интервалы, в которых лежит каждый кластер:
1)
2)
3)
4)
5)
Код программы для файла А:
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))
Диаграмма для файла Б имеет вид:
Рассмотрим интервалы, в которых лежит каждый кластер:
1)
2)
3)
4)
Код программы для файла Б:
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))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиусом . Каждая звезда обязательно
принадлежит только одному из кластеров. Истинный центр кластера, или центроид, – это одна из звёзд на графике,
сумма расстояний от которой до всех остальных звёзд кластера минимальна. Под расстоянием понимается расстояние
Евклида между двумя точками
и
на плоскости, которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более трёх условных единиц от точек кластеров. При расчётах аномалии учитывать не нужно.
В файле A хранятся данные о звёздах четырех кластеров, где для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
. Значения
даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не
превышает 3000.
В файле Б хранятся данные о звёздах трех кластеров, где для каждого кластера. Известно, что количество
звёзд не превышает 20 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите два числа: —
среднее арифметическое абсцисс центров кластеров, и
– среднее арифметическое ординат центров
кластеров.
В ответе запишите четыре числа через пробел: сначала целую часть произведения для файла А, затем
для файла А, далее целую часть произведения
для файла Б и
для файла Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная».
Диаграмма для файла А имеет вид:
Рассмотрим все 4 кластера и координаты, в которых они находятся:
1)
2)
3)
4)
Код программы для файла А:
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))
Диаграмма для файла Б имеет вид:
Рассмотрим все 3 кластера и координаты, в которых они находятся:
1)
2)
3)
Код программы для файла Б:
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))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиусом . Каждая звезда обязательно
принадлежит только одному из кластеров. Истинный центр кластера, или центроид, – это одна из звёзд на графике,
сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
на плоскости,
которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.
В файле A хранятся данные о звёздах четырех кластеров, где для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
. Значения
даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не
превышает 1000.
В файле Б хранятся данные о звёздах трех кластеров, где для каждого кластера. Известно, что количество
звёзд не превышает 25 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите два числа: –
среднее арифметическое абсцисс центров кластеров, и
– среднее арифметическое ординат центров
кластеров.
В ответе запишите четыре числа через пробел: сначала целую часть произведения для файла А, затем
для файла А, далее целую часть произведения
для файла Б и
для файла Б. Возможные
данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная».
Диаграмма для файла А имеет вид:
Рассмотрим все 4 кластера и координаты, в которых они находятся:
1)
2)
3)
4)
Код программы для файла А:
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))
Диаграмма для файла Б имеет вид:
Рассмотрим все 3 кластера и координаты, в которых они находятся:
1)
2)
3)
Код программы для файла Б:
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))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба, а
также по блеску звезды. Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиуса .
Каждая звезда, подходящая под заданный уровень блеска, обязательно принадлежит только одному из кластеров.
Остальные звёзды не относятся к рассматриваемым кластерам.
Истинная периферия кластера, или перифероид, – это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера максимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
на плоскости,
которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более условных единиц от точек кластеров. При
расчётах аномалии учитывать не нужно.
В файле A хранятся данные о звёздах шести кластеров, где для каждого кластера, а звёзды обладают
блеском условных единиц, целая часть которых четна. В каждой строке записана информация об уровне блеска звезды,
а также о расположении на карте одной звезды: сначала координата
, затем координата
и наконец уровень
блеска
. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что
количество звёзд не превышает 3000.
В файле Б хранятся данные о звёздах трех кластеров, где для каждого кластера, а звёзды обладают блеском
условных единиц, целая часть которых нечетна. Известно, что количество звёзд не превышает 20000. Структура
хранения информации о звездах в файле Б аналогична файлу А.
Для каждого файла определите координаты периферии каждого кластера, затем вычислите два числа: —
среднее арифметическое абсцисс периферий кластеров, и
– среднее арифметическое ординат периферий
кластеров.
В ответе запишите четыре числа через пробел: сначала целую часть для файла А и
для файла А, далее
целую часть произведения
для файла Б и
для файла Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная».
Диаграмма для файла А имеет вид:
Рассмотрим 6 кластеров и координаты, в которых они находятся:
1)
2)
3)
4)
5)
6)
Код программы для файла А:
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)))
Диаграмма для файла Б имеет вид:
Рассмотрим все 3 кластера и координаты, в которых они находятся:
1)
2)
3)
Код программы для файла Б:
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))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри прямоугольника высотой и шириной
.
Каждая звезда обязательно принадлежит только одному из кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд кластера, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
на плоскости,
которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.
В файле A хранятся данные о звёздах двух кластеров, где ,
для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
. Значения
даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не
превышает 1000.
В файле Б хранятся данные о звёздах трёх кластеров, где ,
для каждого кластера. Известно, что
количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите два числа: —
среднее арифметическое абсцисс центров кластеров, и
– среднее арифметическое ординат центров
кластеров.
В ответе запишите четыре числа через пробел: сначала целую часть произведения для файла А и
для файла А, далее целую часть произведения
для файла Б и
для файла
Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная».
Диаграмма для файла А имеет вид:
Рассмотрим 2 кластера и координаты, которыми их можно последовательно отделить:
1) и
2) и
Код программы для файла А:
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))
Диаграмма для файла Б имеет вид:
Рассмотрим 3 кластера и координаты, которыми их можно последовательно отделить:
1) и
2) и
3) и
Код программы для файла Б:
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))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиусом . Каждая звезда обязательно
принадлежит только одному из кластеров.
Истинный центр кластера, или центроид, – это одна из звёзд кластера, сумма расстояний от которой до всех остальных звёзд кластера минимальна.
Под расстоянием понимается расстояние Евклида между двумя точками и
на плоскости,
которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.
В файле A хранятся данные о звёздах четырёх кластеров, где для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
. Значения
даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не
превышает 1500.
В файле Б хранятся данные о звёздах трёх кластеров, где для каждого кластера. Известно, что количество
звёзд не превышает 15000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите два числа: —
среднее арифметическое абсцисс центров кластеров, и
– среднее арифметическое ординат центров
кластеров.
В ответе запишите четыре числа через пробел: сначала целую часть произведения для файла А и
для файла А, далее целую часть произведения
для файла Б и
для файла
Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная».
Диаграмма для файла А имеет вид:
Рассмотрим 4 кластера и координаты, которыми их можно последовательно отделить:
1) и
2) и
Для 3 и 4 кластеров проведём прямую через точки и
. Уравнением этой прямой будет
.
Тогда кластеры отделяются следующими неравенствами:
3) и
4) и
Код программы для файла А:
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))
Диаграмма для файла Б имеет вид:
Для данных 3 кластеров проведём всего 4 наклонные прямые для их отделения:
,
,
и
В итоге получим следующие неравенства для отделения:
1) и
и
2) и
и
3) и
и
Код программы для файла Б:
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))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой
звезды на расстоянии не более R условных единиц. Каждая звезда обязательно принадлежит только
одному из кластеров. Истинный центр кластера, или центроид, – это одна из звёзд на графике, сумма
расстояний от которой до всех остальных звёзд кластера минимальна. Под расстоянием понимается расстояние
Евклида между двумя точками и
на плоскости, которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.
В файле A хранятся данные о звёздах двух кластеров, где для каждого кластера. В каждой строке
записана информация о расположении на карте одной звезды: сначала координата
, затем координата
. Значения
даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не
превышает 2500.
В файле Б хранятся данные о звёздах четырех кластеров, где для каждого кластера. Известно, что
количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите два числа: —
среднее арифметическое абсцисс центров кластеров, и
– среднее арифметическое ординат центров
кластеров.
В ответе запишите четыре числа через пробел: сначала целую часть произведения для файла А, затем
для файла А, далее целую часть
для файла Б и
для файла Б. Возможные данные одного из
файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная».
Диаграмма для файла А имеет вид:
Из нее видно, что кластеры имеют необычную форму, поэтому для разделения точек по кластерам будем
использовать метод dbscan. Чтобы найти стартовые точки определим области, в которых кластеры не перессекаются и
нет анамальных точек. Для верхнего кластера будем использовать координаты: . Для нижнего
будем использовать координаты:
.
Код программы для файла А:
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))
Диаграмма для файла Б имеет вид:
Из нее видно, что кластеры имеют необычную форму, поэтому для разделения точек по кластерам будем
использовать метод dbscan. Чтобы найти стартовые точки определим области, в которых кластеры не перессекаются и
нет анамальных точек. Для верхнего левого кластера будем использовать координаты: . Для
верхнего правого кластера будем использовать координаты:
. Для нижнего левого будем
использовать координаты:
. Для нижнего правого будем использовать координаты:
.
Код программы для файла Б:
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))
Ошибка.
Попробуйте повторить позже
Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба.
Кластер звёзд – это набор звёзд (точек) на графике, лежащий внутри круга радиусом R. Каждая звезда обязательно
принадлежит только одному из кластеров. Истинный центр кластера, или центроид, – это одна из звёзд на графике,
сумма расстояний от которой до всех остальных звёзд кластера минимальна. Под расстоянием понимается расстояние
Евклида между двумя точками и
на плоскости, которое вычисляется по формуле:
Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.
В файле A хранятся данные о звёздах трех кластеров, где для каждого кластера. В каждой строке записана
информация о расположении на карте одной звезды: сначала координата
, затем координата
. Значения даны в
условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает
2500.
В файле Б хранятся данные о звёздах пяти кластеров, где для каждого кластера. Известно, что количество
звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу
А.
Для каждого файла определите координаты центра каждого кластера, затем вычислите два числа: —
среднее арифметическое абсцисс центров кластеров, и
– среднее арифметическое ординат центров
кластеров.
В ответе запишите четыре числа через пробел: сначала целую часть произведения для файла А, затем
для файла А, далее целую часть произведения
для файла Б и
для файла Б.
Возможные данные одного из файлов иллюстрированы графиком.
Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.
Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в ,
перейдем в раздел «Вставка
Диаграммы
Точечная».
Диаграмма для файла А имеет вид:
Для решения задачи будем использовать метод dbscan. Определим границы для поиска стартовых точек в
программе, так как нам необходимо найти лишь одну точку, которая принадлежит каждому кластеру, то границы
обозначим примерные, но такие что анамалии в них не попадают. Для первого кластера: . Для
второго кластера:
. Для третьего кластера:
.
Код программы для файла А:
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))
Диаграмма для файла Б имеет вид:
Для решения задачи будем использовать метод dbscan. Определим границы для поиска стартовых точек в
программе, так как нам необходимо найти лишь одну точку, которая принадлежит каждому кластеру, то границы
обозначим примерные, но такие что анамалии в них не попадают. Для первого кластера: . Для
второго кластера:
. Для третьего кластера:
. Для четвертого кластера:
. Для пятого кластера:
.
Код программы для файла Б:
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))