Help us understand the problem. What is going on with this article?

PythonとK-meansを使ったFizzbuzz

More than 1 year has passed since last update.

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

環境

  • 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

Polaris1080
UE4使いの渡り鳥。 MediaFrameworkとAudioEngineが非常に得意。 ゲームでもWEBでも、幅広い分野でそれなりに出来る。 愛機はInspiron 7568 2-in-1。
https://polaris1080.tumblr.com/
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