Menu
CoddyTech

Звёздные скопления

Часть раздела Обучение без учителя путешествия по Machine Learning на Coddy. Урок 50 из 51.

Астрономический клуб сфотографировал участок неба. Некоторые из 225 звёзд связаны между собой: они родились в одном облаке; остальные — посторонние, находящиеся перед ним или за ним:

225 звёзд в виде чёрных точек на фотографии размером 60 на 40 угловых минут: круглое скопление слева, длинный изогнутый поток, поднимающийся справа, и одинокие звёзды, разбросанные повсюду

Обе позиции указаны в угловых минутах — это одна единица измерения, поэтому eps — это расстояние на фотографии.

Клубу нужны кластеры и их размеры, без одиноких звёзд на поле. Справится ли с этим так же хорошо k-means?

challenge icon

Задание

Сложно

Программа считывает eps; в стартовом коде создаются два графика: left и right.

  1. Запусти DBSCAN с этим eps и min_samples=5 для двух координат. Выведи кластеры и звёзды поля (метка -1).
  2. Обучи модель k-средних с таким же количеством кластеров (n_init=10, random_state=0). Выведи самый большой и самый маленький кластер для каждого метода.
  3. На left изобрази кластеры DBSCAN, начиная с самого большого — cluster 1, а затем field stars серым цветом. На right изобрази кластеры k-средних, пронумерованные так же. Покажи легенды.

Для другой фотографии и eps 2.5:

DBSCAN: 3 clusters and 29 field stars
Biggest cluster: 63 stars by DBSCAN, 77 by k-means
Smallest cluster: 41 stars by DBSCAN, 48 by k-means

и её графики:

Другая фотография, два графика рядом. Слева, DBSCAN: кластер 1 — округлая группа вверху слева, кластер 2 — округлая группа вверху справа, кластер 3 — короткая полоса звёзд внизу, серые звёзды поля рассеяны. Справа, k-средних с 3 кластерами: те же три группы, каждая звезда поля отнесена к ближайшему кластеру

Затем Coddy опишет твой результат. Какому методу ты бы доверил работу со звёздами поля?

Попробуйте сами

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN, KMeans

# По одной строке для каждой звезды на снимке: положение (в угловых минутах) и яркость (в звёздных величинах)
field = pd.read_csv("field.csv")
eps = float(input())

# Две карты рядом: DBSCAN слева, k-means справа
fig, axs = plt.subplots(1, 2, figsize=(10, 4))
left = axs[0]
right = axs[1]
left.set_title("DBSCAN")
right.set_title("k-means")
for ax in axs:
    ax.set_xlabel("x (arcmin)")
    ax.set_ylabel("y (arcmin)")

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Обучение без учителя

Потренируйтесь самостоятельно: Онлайн-компилятор Python