LoginSignup
2
2

More than 5 years have passed since last update.

PythonとK-meansを使ったFizzbuzz

Posted at

誰かがやっていそうだと思っていたら、意外にもやっていなかったので、やってみる。

環境

  • 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

2
2
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
2
2