【Scikit-learn】K-means法でクラスタ分析

Pythonと機械学習ライブラリ「scikit-learn」を用いて、K-means法によるクラスタ分析を行う方法について解説します。

クラスタ分析とは

クラスタ分析 (clustering)とは、データを分類する手法です。
与えられたデータを外的基準なし(教師データなし)で自動的に分類します。
クラスタリング、クラスタ解析、クラスター分析などとも呼ばれています。

クラスタ分析にはいくつかの手法が提案されています。
代表的なのは「階層型手法(ウォード法など)」「非階層的手法(K-means法など)」です。

今回は、後者をscikit-learnで実装してきます。

【分析方法】K-means法とは

K-means法(k平均法)とは、平均値を用いて与えられたデータを分類する手法です。
与えられたデータを、クラスタ平均値を用いて、k個のクラスタ数に分類することからこの名前がついています。
クラスタ分析の非階層的手法と代表例ですが、シンプルなアルゴリズムです。

401 Unauthorized

scikit-learnでは、sklearn.cluster.KMeansクラスを使うことでk-means方を実装できます。
その使い方は下記の通りです。

書式

sklearn.cluster.KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001,precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1)

※各パラメータに設定されてる値(=の後)はデフォルト値

パラメータ 内容
n_clusters クラスタの個数(分類する種類の数)
max_iter 繰り返し回数の最大値
n_init 初期値選択時に、異なる乱数のシードで初期の重心を選ぶ処理の実行回数
init 初期化の方法(’k-means++”, ‘random’ ndarray で指定)
tol 収束判定の許容可能誤差
precompute_distances 距離 (データのばらつき具合) を事前に計算するか否か( ‘auto’, True, False で指定)
verbose 1 なら分析結果を詳細表示
random_state 乱数のシードを固定する場合に指定(数値か「integer or numpy.RandomState」で指定)
copy_x メモリ内でデータを複製してから、距離を事前に計算するか否か
n_jobs 並列処理で初期化する際の多重度(-1 で全てのCPU を使用)
メソッド 内容
fit(X[, y]) クラスタリングの計算をする
fit_predict(X[, y]) 各サンプルのクラスタ番号を算出
fit_transform(X[, y]) クラスタリングの計算をして、Xを分析に用いた距離空間に変換して返す
get_params([deep]) 計算に用いたパラメータを返す
predict(X) Xのサンプルが属しているクラスタ番号を返す
set_params(**params) パラメータを設定
transform(X[, y]) Xを分析に用いた距離空間に変換して返す

【参考文献】 http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

ソースコード

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans

# CSVファイルを取得
data = pd.read_csv("data.csv")

# Pandasデータフレームをnumpy配列に変換
data = np.array([data['x1'].tolist(), data['x2'].tolist(), data['x3'].tolist()], np.int32)

# numpy配列を転置
data = data.T

# k-means法でクラスタ分析(クラスタ数は3)
result = KMeans(n_clusters=3).fit_predict(data)

# クラスタ番号を表示
print(result)

if __name__ == "__main__":
    main()

【data.csv】

x1,x2,x3
45,17.5,30
38,17.0,25
41,18.5,20
34,18.5,30
59,16.0,45
47,19.0,35
35,19.5,25
43,16.0,35
54,18.0,35
52,19.0,40

実行結果

サンプルプログラムの実行結果は下記の通りです。

[2 1 1 1 0 2 1 2 0 0]

今回はdata.csvのx1, x2, x3の3つのデータをもつ10組をk-means法で3つのクラスタに分類しています。
上記の結果だと1組目のデータはクラスタ番号2、2組目はクラスタ番号1…という風に分類されています。

【Scikit-learn】K-means法でデータにラベリング
この記事では、Pythonと機械学習ライブラリ「scikit-learn」を用いて、K-means法によるクラスタ分析でラベリングする方法について解説します。
【Scikit-learn】K-means法でクラスタ毎のサンプル数を表示
この記事では、Pythonと機械学習ライブラリ「scikit-learn」を用いて、K-means法によるクラスタ分析でクラスタ毎のサンプル数を表示する方法について解説します。
【Scikit-learn】K-means法でクラスタ毎の平均値を表示
この記事では、Pythonと機械学習ライブラリ「scikit-learn」を用いて、K-means法によるクラスタ分析でクラスタ毎のサンプル数を表示する方法について解説します。
Scikit-learnの使い方まとめ(機械学習入門・サンプル集)
Pythonモジュール「Scikit-learn」で機械学習を行う方法について入門者向けに使い方を解説します。

コメント