2
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

PythonとK-meansを使ったFizzbuzz

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

環境

  • 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?