星团
本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 50 课,共 51 课。
一个天文俱乐部拍摄了一片天空。其中 225 颗星星有些彼此属于同一群,它们诞生于同一片星云;其余的则是前景或背景中的陌生星星:
这两个位置的单位都是角分,一种单位,所以 eps 表示照片上的距离。
俱乐部想知道每个簇及其大小,不包括那些独自出现在场地上的星星。k-means 也能做到吗?
挑战
困难程序会读取 eps;起始代码会设置两张图,分别是 left 和 right。
- 使用这个 eps 和
min_samples=5,根据两个位置运行 DBSCAN。打印聚类数量和场区恒星数量(标签为 -1)。 - 拟合 k-means,聚类数量与前者相同(
n_init=10,random_state=0)。打印每种方法中最大的聚类和最小的聚类。 - 在
left上绘制 DBSCAN 的聚类,最大的聚类标为cluster 1,然后用灰色绘制field stars。在right上绘制 k-means 的聚类,编号方式相同。显示图例。
换一张照片并将 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以及对应的图:
接着 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)")
# 在下方编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无监督学习中的所有课
自己练习: Python 在线编译器