YouTubeのゲーム実況などを見てると「このモンスターはあのモンスターと似てますね」という発言を聞くことがあるが、そのたびに、よく頭に入ってるなぁと感心する。ドラクエウォークはモンスターを倒すと稀に「こころ」を入手でき、身につけるとHPが高くなるなど効果があるが、この8つのパラメータをk-meansでクラスタリングすると、似たようなことができるんじゃないだろうか。
まず、こんなCSVファイルを用意する。(別に作ったやつの流用なので、ちょっと古い)
name,cost,color,hp,mp,power,defense,attack,recover,speed,skill
フレイザードA,99,紫,90,85,15,26,64,25,47,69
暴嵐天バリゲーンA,99,黄,110,44,51,79,29,29,28,44
アカイライS,99,青,79,47,55,52,25,23,72,72
ホロコーストS,99,紫,74,87,14,46,72,29,54,63
ガーゴイルA,98,赤,73,31,68,41,11,11,60,53
これをpandasで読み込みscikit-learnのKMeansでクラスタリングする。とりあえず10個に分類してみた。
import pandas as pd
import pprint
from sklearn.cluster import KMeans
n_cluster = 10
monsters = pd.read_csv("monster.txt", sep=',', na_values=".")
df = monsters.drop('name',axis=1).drop('color',axis=1)
kmeans_model = KMeans(n_clusters=n_cluster).fit(df.iloc[:, 1:])
labels = kmeans_model.labels_
monster_type = []
for i in range(n_cluster):
monster_type.append([])
n = 0
for i in labels.tolist():
name = names.iloc[n]['name']
monster_type[i].append(name)
n = n + 1
pprint.pprint(monster_type)
これを見やすく整形してみたのがこちら。ちょっとクラスタ数が10だと大雑把すぎるかもしれない。
参考にした記事で色分けして表示していたので、同じように表示してみた。
https://qiita.com/maskot1977/items/34158d044711231c4292
# https://www.color-site.com/separate_hues
color_codes = {
0:'#BA7836',
1:'#ADBA36',
2:'#5EBA36',
3:'#36BA5E',
4:'#36BAAD',
5:'#3678BA',
6:'#4336BA',
7:'#9236BA',
8:'#BA3692',
9:'#BA3643',
}
colors = [color_codes[x] for x in labels]
import matplotlib.pyplot as plt
from pandas import plotting
plotting.scatter_matrix(
df[df.columns[1:]],
figsize=(6,6),
color=colors,
alpha=0.8,
diagonal='kde'
)
plt.show()
データ一式は下記に置いているので試したかったらgit cloneしていただければ。