Menu
CoddyTech

K-Meansがうまくいかない場合

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 14/51。

K-meansは、各クラスタを中心の周りにある丸い塊として捉えます。ダーツのデータは、中心の的を囲むリング状になりますが、k-meansはそれを真っ二つに分けてしまいます。

140本のダーツを示す2つのグラフ。左は正解データ:密集した的のグループを広いリングが囲んでいる。右はk = 2のk-means:まっすぐな破線の境界がボード、リング、的を左右半分に分け、それぞれに中心を示す十字がある

各点は最も近い中心に割り当てられるため、2つのクラスターの境界は中心のちょうど中間を通る直線になります。リングとその中央部分を直線で分けることはできません。

細長く曲がったグループや、非常に不均一なグループも、同じように k-means の問題になります。クラスタ自体は返されるので、必ず図を確認しましょう。

challenge icon

チャレンジ

中級

ドローンが、2つの曲がった砂州にいる200頭のアザラシを発見しました。スターターコードはleftパネルに正解を描画します。

  1. k-meansでアザラシをクラスタリングします。k = 2。
  2. rightパネルに各クラスタを散布図で表示し、cluster 0またはcluster 1というラベルを付けます。
  3. 中心を黒い"X"マーカーで示し、centersというラベルを付けます。凡例を追加してから、表示します。

Coddyがチャートを説明し、それぞれの砂州にいるアザラシのうち、正しく分類された数を数えます。2つの群れの場合は、次のようになります。

2つのチャート。左は正解:広く散らばった大きな群れと、その右側に小さく密集した群れ。右はk = 2のk-means:小さな群れのクラスタが大きな群れの右端も取り込み、黒いバツ印が2つの中心を示している

自分で試してみよう

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import KMeans

# ドローンから見た、2つの湾曲した砂州で休む200頭のアザラシ(位置の単位は100 m)
X, sandbar = make_moons(n_samples=200, noise=0.07, random_state=4)


# 実際の砂州をaxに描画する
def draw_truth(ax):
    ax.scatter(X[sandbar == 0, 0], X[sandbar == 0, 1], s=12, label="north bar")
    ax.scatter(X[sandbar == 1, 0], X[sandbar == 1, 1], s=12, label="south bar")
    ax.set_title("The truth")
    ax.legend()


fig, (left, right) = plt.subplots(1, 2, figsize=(9, 4))
draw_truth(left)
right.set_title("K-means, k = 2")

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ