誰かがやっていそうだと思っていたら、意外にもやっていなかったので、やってみる。
#環境
- Anakonda3
- JupyterNoteBook5.0.0
#コード
FizzBuzz+with+KMeans.py
import numpy as np
from sklearn.cluster import KMeans
result=KMeans(n_clusters=4,n_jobs=-1).fit_predict(np.array([np.tile([0,0,1],30),np.tile([0,0,0,0,1],18)]).T)
print(['FizzBuzz' if t == result[14] else 'Fizz' if t == result[2] else 'Buzz' if t == result[4] else 0 for t in result])
#解説
###モジュールのインポート
import numpy as np
from sklearn.cluster import KMeans
K-means法で機械学習を行うためにskleran.cluster
を、行列を扱うためにnumpy
をインポートしている。
###データの作成・準備
palameter = 6
array_A=np.tile([0,0,1],palameter*5)
array_B=np.tile([0,0,0,0,1],palameter*3)
1~90の範囲において、以下の配列を作成した。
- 3の倍数[Fizz]にフラグを立てた配列をarray_A
- 5の倍数[Buzz]にフラグを立てた配列をarray_B
配列のインデックスを利用しているため、実際の値から-1されていることに注意しておく。
###準備
array_X=np.array([array_A,array_B])
array_Y=array_X.T
先ほど作成したデータを結合してから転置、そうしないとK-meansが行えない。
###実行
array_V=KMeans(n_clusters=4,n_jobs=-1).fit_predict(array_Y) #KMeansを使用して4つのクラスターに分けた結果をarray_Vに代入。
4つのクラスター( [FizzBuzz] / [Fizz] / [Buzz] / [Other] )に分かれる。
###出力
for temp in array_V:
if temp == array_V[2]: print('Fizz')
elif temp == array_V[4]: print('Buzz')
elif temp == array_V[14]: print('FizzBuzz')
else: print(0)
- 3(15の倍数を除く)
- 5の倍数(15の倍数を除く)
- 15の倍数
- それ以外
に事前に分かれているため、特に順番を気にする必要はない。
#リンク
###参考
scikit-learn でクラスタ分析 (K-means 法)
numpyの使い方
NumPy入門 サンプル集
Pythonの数値計算ライブラリ NumPy入門
###ソース
github