Menu
CoddyTech

星团

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 50 课,共 51 课。

一个天文俱乐部拍摄了一片天空。其中 225 颗星星有些彼此属于同一群,它们诞生于同一片星云;其余的则是前景或背景中的陌生星星:

一张 60 × 40 角分的照片上有 225 颗黑点状的星星:左侧是一群圆形聚集的星星,右侧是一条向上延伸的弯曲长流,孤立的星星散布在各处

这两个位置的单位都是角分,一种单位,所以 eps 表示照片上的距离。

俱乐部想知道每个簇及其大小,不包括那些独自出现在场地上的星星。k-means 也能做到吗?

challenge icon

挑战

困难

程序会读取 eps;起始代码会设置两张图,分别是 left 和 right。

  1. 使用这个 eps 和 min_samples=5,根据两个位置运行 DBSCAN。打印聚类数量和场区恒星数量(标签为 -1)。
  2. 拟合 k-means,聚类数量与前者相同(n_init=10,random_state=0)。打印每种方法中最大的聚类和最小的聚类。
  3. 在 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

以及对应的图:

另一张照片,左右并排的两张图。左图为 DBSCAN:聚类 1 是左上方一群圆形分布的恒星,聚类 2 是右上方一群圆形分布的恒星,聚类 3 是底部一小条恒星,灰色的场区恒星散布在各处。右图为含 3 个聚类的 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)")

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无监督学习中的所有课

自己练习: Python 在线编译器