慣性
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 6/51。
この章では k の選び方について学びます。章の終わりまでに、パン屋の配達について k を選び、ゾーンを地図に示せるようになります。
まずはスコアです。慣性は、各点からその点が属する中心までの距離を二乗して合計したものです。点が中心に密集しているほど、小さくなります。
KMeansはこれをinertia_に保持します。180個のリンゴの場合:
for k in [1, 2, 3, 4]:
km = KMeans(n_clusters=k, n_init=10, random_state=0)
km.fit(X)
print(k, round(km.inertia_))次のように出力されます:
1 1718
2 752
3 230
4 196中心が増えるほど、スポークは短くなります。k が大きくなるにつれて、inertia は常に減少します。各点に1つずつ中心を置くと0になるため、最小が最良とは限りません。
チャレンジ
簡単ある陶器工房では、いくつかのサイズの箱に花瓶を詰めます。それぞれの花瓶には最も近いサイズが割り当てられ、慣性はどの程度うまく収まっているかを測ります。プログラムはbudgetを読み込み、陶器工房が許容する最大のずれを表します。
- k = 1, 2, 3 と順に試します。
vasesに対してKMeansを適合させ、各kの慣性を丸めて出力します。 - 慣性が予算以内となる最初のkで停止し、それを出力します。
別の陶器工房の場合:
k = 1, inertia 15120
k = 2, inertia 4811
k = 3, inertia 1290
Box sizes needed: 3自分で試してみよう
import numpy as np
from sklearn.cluster import KMeans
# 以下の行は変更しないでください
rng = np.random.default_rng(8)
# 花瓶の4種類:それぞれの標準的な高さと幅(cm)、および個数
kinds = [(15, 8, 25), (38, 13, 25), (22, 22, 20), (58, 26, 10)]
parts = []
for h, w, n in kinds:
parts.append(np.column_stack([rng.normal(h, 2.5, n), rng.normal(w, 2, n)]))
# 80個の花瓶を1個につき1行で表す:高さと幅(cm)
vases = np.round(np.concatenate(parts), 1)
# 陶器店が許容するずれの最大値(inertiaで表す)
budget = int(input())
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ