1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

KMeans法について

Last updated at Posted at 2025-06-24

機械学習手法の1つであるKMeans法についてまとめてみました。

概要

  • 機械学習の種類:教師なし学習
  • タスクの種類:クラスタリング
  • 手法の種類:距離ベースの分割型クラスタリング手法

1.各データにクラスタをランダムに割り振る
image.png

2.各クラスタの重心を計算する
image.png

3.各データに関して最も近い重心のクラスタを再度割り振る
image.png

4.重心を再計算する / 3と4を重心が動かなくなるまで繰り返す
image.png

データにラベル(正解)が与えられない教師なし学習であるKMeans法では、
データ同士の類似性にもとづいて自動的にグループ分け(クラスタリング)する。

K個のクラスタに分けるようデータを分類するアルゴリズムで、
各データからクラスタ中心(重心)までの距離を最小にするように反復的に分類する。

クラスタ数はあらかじめ指定する必要がある。(図表ではn_cluster=2、デフォルトはn_cluster=8)
scikitlearn公式サイト

scikitlearnを用いたKMeans法の活用例

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans
  • NumPy
    • 役割:数値計算ライブラリ
    • 用途:配列(ベクトル・行列)を使ったデータ処理
  • matplotlib
    • 役割:グラフ描画ライブラリ
    • 用途:散布図、折れ線グラフ、ヒストグラムなどを描く
  • pandas
    • 役割:表形式加工ライブラリ
    • 用途:表形式データの読み書き・加工(CSV連携・列抽出など)

なぜsklearnのimportはfromから始まっているのか

  • sklearn
    • 機械学習ライブラリ
  • sklearn.cluster
  • KMeans
    • sklearn.clusterモジュールの中に定義されているクラス
    • KMeansはこのモジュールに所属している1つのクラスタリングアルゴリズム

モジュール全体を読み込みできるが、
使うときに毎回sklearn.cluster.KMeansの書き込みが必要になり手間がかかる。

import sklearn.cluster
model = sklearn.cluster.KMeans(n_clusters=3)

一方でfromを使う場合、Kmeansだけを読み込むが、
シンプルに書いて使うことができる。

from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)

実際の活用例

1.CSV読み込み

df = pd.read_csv("Sample/ocean.csv")

2.特徴量の選択:NumPy配列(n次元配列)

X = df[["SST (°C)", "Species Observed"]].values

3.KMeansの実行

kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
labels = kmeans.labels_
centers = kmeans.cluster_centers_

4.結果をデータフレームに追加

df["Cluster"] = labels

5.クラスタリング結果の可視化

plt.scatter(df["SST (°C)"], df["Species Observed"], c=df["Cluster"], cmap="viridis")
plt.scatter(centers[:, 0], centers[:, 1], c="red", marker="X", s=200)
plt.xlabel("温度")
plt.ylabel("海洋生物の数")
plt.title("クラスタリング")
plt.show()

各コードの内容について

plt.scatter(df["SST (°C)"], df["Species Observed"], c=df["Cluster"], cmap="viridis")
  • df["SST (°C)"], df["Species Observed"]:X軸とY軸に使う列(例:温度と海洋生物数)
  • c=df["Cluster"]:点の色をクラスタ番号で変える(KMeans結果)
  • cmap="viridis":色のスタイルを指定(緑~黄~紫系のグラデーション)
plt.scatter(centers[:, 0], centers[:, 1], c="red", marker="X", s=200)
  • center[:, 0]:各クラスタの中心(X軸=年齢)
  • center[:, 1]:各クラスタの中心(Y軸=年収)
  • c="red":中心は赤色で表示
  • marker="X":マーカーの形を「X]に(重心をわかりやすく)
  • s=200:点の大きさを大きくする
plt.xlabel("温度") #X軸に「温度」と表示
plt.ylabel("海洋生物の数") #Y軸に「海洋生物の数」と表示
plt.title("クラスタリング") #グラフタイトル
plt.show() #グラフを表示

image.png

KMeansとkmeans_plusplus

scikitlearnの公式サイトでsklearn.clusterに所属するアルゴリズムをみていると、
Kmeansとは別にkmeans_plusplusなるものがあるため調べてみました。
scikitlearn公式サイト

簡単にいうと初期値となるクラスタ中心(重心)をランダムに設定するか、
より効率的に配置するかの違いがあるようです。

KMeans

  • 初期の重心をランダム値で設定
  • 何度再計算してもうまくクラスタリングできないことがある
    image.png

kmeans_plusplus / k-means++

  • 初期の重心を各点が離れた場所に配置
  • より効率的にクラスタリングできる
    image.png

実はKMeansにはもともとk-means++がデフォルト値として組み込まれている。
KMeansのinitパラメータに何も指定しないとデフォルト値としてk-means++のアルゴリズムが適用される。

まとめ

今回はクラスタリング手法の1種であるKMeans法について概要を整理しました。
引き続き機械学習の知識定着と活用する力を高めていきたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?