Pythonでクラスタリングの方法【ラズパイで機械学習】3次元グラフ出力

公開日2020/8/25 更新日2020/8/25

・はじめに

【経歴】
京大院卒業・航空宇宙工学を学ぶ/大企業メーカーでエンジニア/
自由を求め脱出/作曲家⇄ブロガー⇄Webデザイン/
STEAM教育の大切さに気づきSTEAM+M Lab オンライン研究所を設立/作曲家で研究所所長兼任
【経過】
20曲リリース/AWA動画広告BGMプログラム採用実績あり
soublog417記事/月1万5千PV達成

ポケモン892個体の6つのステータスをもとに、分類を行います。

6つのステータスとは、「HP,」 「攻撃」、「防御」、「特攻」、「特防」、「すばやさ」です。

機械学習のクラスタリングという手法を取ります。

つまり、分類先は決まっておらず教師なし学習とも呼ばれています。

6つのステータスつまり、6つの特徴量があるのですが、データを低次元化した主成分分析を行います。

クラスターの数は6つで解析します。

目次は次の通りです。

  • ポケモン剣盾892種類をステータスで6つに分類
  • Pythonでクラスタリング
    ・準備
    ・クラスタリングデータのセット
    ・k-means法でクラスタリング
    ・結果を出力
    ・クラスターの重心のパラメータを求める
    ・平均を求める
    ・それぞれの個体のクラスター番号を調べる
  • まとめ

それでは解説します。

・ポケモン剣盾892種類をステータスで6つに分類

ポケモン剣盾で登場する892ひきを、クラスタリングしました。

クラスターは6つです。

ポケモンのクラスタリングによるステータスによる分類は下記ブログを参照してください。

・Pythonでクラスタリング

・準備

Pythonによるk-meansクラスタリングを実施します。

Numpyのインストールをします。

Numpyは配列の演算を行うためのライブラリです。

pip install numpy

次にPandasのインストールをします。

Pandasはサンプルデータを読み込み、データフレームに変換します。

pip install pandas

なお、pandasのインストールは

Running setup.py bdist_wheel for pandas …

というコメントで止まって、完了まで時間がかかります。

機械学習ライブラリのscikit-learnをインストールします。

scikit-learnは機械学習のアルゴリズムやサンプルデータが含まれています。

pip install scikit-learn

matplotlibをインストールします。

matplotlibでクラスタリングの結果をグラフにプロットします。

pip install matplotlib

各ライブラリをインストールしたら、インポートを行います。

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets, preprocessing
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd

pandasを利用し、CSVデータを読み込みデータフレームに変換します。

df=pd.read_csv(‘pokemon1.csv’)

データフレームを出力してみます。

print(df)

すると、下記がディスプレイに出力されます。

name no hp at de sa sd qu

0 フシギダネ 1 231 134 134 166 166 126
1 フシギソウ 2 261 160 162 196 196 156
2 フシギバナ 3 301 200 202 236 236 196
3 ヒトカゲ 4 219 140 122 156 136 166
4 リザード 5 257 164 152 196 166 196
5 リザードン 6 297 204 192 254 206 236
6 ゼニガメ 7 229 132 166 136 164 122
7 カメール 8 259 162 196 166 196 152
8 カメックス 9 299 202 236 206 246 192
9 キャタピー 10 231 96 106 76 76 126
10 トランセル 11 241 76 146 86 86 96
11 バタフリー 12 261 126 136 216 196 176

.. … … … … … … … …

877 ゾウドウ 878 285 196 134 116 134 116
878 ダイオウドウ 879 385 296 174 196 174 96
879 パッチラゴン 880 321 236 216 196 176 186
880 パッチルドン 881 321 236 216 216 196 146
881 ウオノラゴン 882 321 216 236 176 196 186
882 ウオチルドン 883 321 216 236 196 216 146
883 ジュラルドン 884 281 226 266 276 136 206
884 ドラメシヤ 885 197 156 96 116 96 200
885 ドロンチ 886 277 196 136 156 136 240
886 ドラパルト 887 317 276 186 236 186 320
887 ザシアン 888 325 296 266 196 266 312
888 ザマゼンタ 889 325 296 266 196 266 312
889 ムゲンダイナ 890 421 206 226 326 226 296
890 ダクマ 891 261 216 156 142 136 180
891 ウーラオス 892 341 296 236 162 156 230

・クラスタリングデータのセット

クラスタリングは6次元の配列を使ったものなので、hp at de sa sd quの6つのデータをXに格納します。

クラスタリングデータの正規化を行います。

ここではscikit-learnのモジュールであるpreprocessingを使っていきます。

X=df[[“hp”,”at”,”de”,”sa”,”sd”,”qu”]]
sc=preprocessing.StandardScaler()
sc.fit(X)
X_norm=sc.transform(X)

・k-means法でクラスタリング

kMeans法でクラスタリングを行っていきます。

今回はクラスタは6つで行います。

cls = KMeans(n_clusters=6)
result = cls.fit(X_norm)

・結果を出力

結果を3Dに出力します。

fig=plt.figure()
ax = Axes3D(fig)
ax.scatter(X_norm[:,0],X_norm[:,1],X_norm[:,2],c=result.labels_)

ax.scatter(result.cluster_centers_[:,0],result.cluster_centers_[:,1],result.cluster_centers_[:,2],s=250, marker=’*’,c=’red’)

ax.set_xlabel(‘X_norm’)
ax.set_ylabel(‘Y_norm’)
ax.set_zlabel(‘Z_norm’)
plt.show()

なお、もともと、6次元であったのですがグラフは3次元までしか表せられないので、低次元化を行いました。

さらに、これらは正規化されたデータとなっています。

・クラスターの重心のパラメータを求める

正規化されたデータセットをもとに戻します。

inversed=sc.inverse_transform(result.cluster_centers_)

そして、ディスプレイに出力します。
print(inversed)

6つのクラスター重心のパラメータが出力されます。

[[329.02439024 260.36585366 224.43902439 261.19512195 231.36585366 232.09756098]
[239.44654088 143.17610063 137.10691824 129.57861635 131.4591195 133.7672956]
[341.27536232 234.66666667 201.72463768 178.49275362 184.04347826 145.02898551]
[262.84848485 202.57575758 297.57575758 158.84848485 231.57575758 120.66666667]
[276.59509202 218.41717791 174.56441718 176.40490798 169.37423313 226.17177914]
[283.176 164.4 182.352 238.928 224.512 182.272]

・平均を求める

平均を求めます。

print(sc.mean_)

すると、ディスプレイに平均が出力されます。

[278.08295964 189.22197309 180.19058296 175.29147982 176.15470852 167.26233184]

・それぞれの個体のクラスター番号を調べる

print(cls.labels_)

すると、892個体のクラスター番号が求まります。

[1 5 5 1 4 5 1 5 5 1 1 5 1 1 4 1 1 4 1 4 1 4 1 4 1 4 1 2 1 1 2 1 1 4 1 5 1
5 1 2 1 4 1 5 5 1 2 1 5 1 4 1 4 1 5 1 4 1 0 1 4 2 2 5 5 1 2 2 1 4 2 1 5 1
3 3 4 4 1 2 1 5 1 1 4 1 5 1 2 1 3 1 5 5 3 1 5 1 4 1 4 1 2 1 3 4 4 2 1 3 1
・・・・・・
4 1 4 4 1 2 1 1 2 1 1 5 1 5 1 5 1 4 1 2 1 4 1 2 2 1 4 2 1 3 5 1 4 1 5 1 2
1 2 1 5 1 5 5 1 1 2 4 2 5 2 5 3 1 5 4 3 1 5 2 3 5 4 1 2 2 2 2 2 0 1 4 0 0
0 0 4 2]

・まとめ

それでは、クラスタリングのPythonのプログラムをまとめて表示しておきます。

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets, preprocessing
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
df=pd.read_csv(‘pokemon1.csv’)
print(df)
X=df[[“hp”,”at”,”de”,”sa”,”sd”,”qu”]]
sc=preprocessing.StandardScaler()
sc.fit(X)
X_norm=sc.transform(X)
cls = KMeans(n_clusters=6)
result = cls.fit(X_norm)

fig=plt.figure()
ax = Axes3D(fig)
ax.scatter(X_norm[:,0],X_norm[:,1],X_norm[:,2],c=result.labels_)

ax.scatter(result.cluster_centers_[:,0],result.cluster_centers_[:,1],result.cluster_centers_[:,2],s=250, marker=’*’,c=’red’)

ax.set_xlabel(‘X_norm’)
ax.set_ylabel(‘Y_norm’)
ax.set_zlabel(‘Z_norm’)
plt.show()

inversed=sc.inverse_transform(result.cluster_centers_)
print(inversed)

print(sc.mean_)

print(cls.labels_)

以上参考になれば幸いです。

Pythonに戻る

スポンサードリンク

TechAcademyとは?
プログラミングやアプリ開発を学べる600社、30,000名を超える教育実績があるオンラインスクール。
1人では続かない方のための短期集中プログラム「オンラインブートキャンプ」を開催。
現役のプロのサポートと独自の学習システムで短期間で成長できます。
最短4週間で未経験からプロを育てるオンライン完結のスクールです、どこかに通う必要なく、自宅でもプログラミングやアプリ開発を学ぶことができます。

人工知能に関するスキルを習得したいなら下記。
機械学習のライブラリを使って実装を行います。
実務に近い形で学習し、社会でも通用するスキルが身につきます。
⓵回帰モデルの作成
②クラスタリングの実装
③Amazonレビューを評価分析
④手書き数字の画像認識

機械学習の基礎を習得したいなら下記。
期間内で4つの機械学習プログラムを開発します。
⓵画像を解析して分類
②データから花の形を分類
③住宅価格の分析と予想
④ビットコインの価格変動を予想
実務に近い形で学習することで、社会でも通用するスキルが身につきます。

統計学の基礎・データ分析の手法を習得するなら下記。

Pythonのライブラリを使って実装を行います。
実務に近い形で学習することで、社会でも通用するスキルが身につきます。

⓵区間推定、仮説検定による母集団の検証
②住宅価格の予測
③化学合成実験のデータを分散分析
④サッカーの勝敗予測

Pythonでクラスタリングの方法【ラズパイで機械学習】3次元グラフ出力” に対して2件のコメントがあります。

コメントは受け付けていません。