星団
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 50/51。
ある天文学クラブが、空の一角を撮影しました。225個の星の一部は同じ雲で生まれた仲間ですが、残りは手前や奥にいる見知らぬ星です。
どちらの位置も単位はアーク分なので、epsは写真上の距離です。
クラブは、単独で存在するフィールドスターを除いて、各クラスターとそのサイズを知りたいと考えています。k-meansでも同じようにできるでしょうか?
チャレンジ
難しいプログラムはepsを読み込みます。スターターコードでは2つの図、leftとrightを用意しています。
- そのepsと
min_samples=5を使って、2つの位置に対して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
# 写真に写る星1つにつき1行:位置(分角)と明るさ(等級)
field = pd.read_csv("field.csv")
eps = float(input())
# 2つの図を横に並べる:左が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オンラインコンパイラ