1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DQウォークのレベルアップに必要な経験値の数式モデルを求める(2)

Last updated at Posted at 2020-01-31

#概要(TL;DR)

前回、データの確認を終えたので、次は数式モデルを算出する。
(現在 勉強中なので間違い等をどんどん指摘してもらえたら嬉しいです。)

DQウォークのレベルアップに必要な経験値の数式モデルを求める(1)

回帰分析

##まずは必要なライブラリ郡を取り込む

import pandas as pd
import numpy as np
import scipy as sp

import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import linear_model
sns.set()

%matplotlib inline
%precision 3

データをread_csv()で取り込む。

df = pd.read_csv('data.csv',names=['EXP'])
df['CUMSUM_EXP'] = df['EXP'].cumsum()
df.index = df.index + 1
df.head()
Screen Shot 2020-01-31 at 21.49.26.png

sklearnのlinear_modelにデータを食わせる

まずは次のレベルまでに必要な経験値

reg = linear_model.LinearRegression()
 
X = df.index
Y = df['EXP']
# 予測モデルを作成
reg.fit(X, Y)
# 回帰係数
print(reg.coef_)
# 切片 
print(reg.intercept_)
# R2(決定係数)
print(reg.score(X, Y))

jupyterの実行結果にいてつくエラーがほとばしる!!

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-54-69fa63dab1be> in <module>
      6 Y = df['EXP']
      7 # 予測モデルを作成
----> 8 reg.fit(X, Y)
      9 # 回帰係数
     10 print(reg.coef_)

/usr/local/lib/python3.7/site-packages/sklearn/linear_model/base.py in fit(self, X, y, sample_weight)
    461         n_jobs_ = self.n_jobs
    462         X, y = check_X_y(X, y, accept_sparse=['csr', 'csc', 'coo'],
--> 463                          y_numeric=True, multi_output=True)
    464 
    465         if sample_weight is not None and np.atleast_1d(sample_weight).ndim > 1:

/usr/local/lib/python3.7/site-packages/sklearn/utils/validation.py in check_X_y(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
    717                     ensure_min_features=ensure_min_features,
    718                     warn_on_dtype=warn_on_dtype,
--> 719                     estimator=estimator)
    720     if multi_output:
    721         y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,

/usr/local/lib/python3.7/site-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    519                     "Reshape your data either using array.reshape(-1, 1) if "
    520                     "your data has a single feature or array.reshape(1, -1) "
--> 521                     "if it contains a single sample.".format(array))
    522 
    523         # in the future np.flexible dtypes will be handled like object dtypes

ValueError: Expected 2D array, got 1D array instead:
array=[ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
 49 50 51 52 53 54 55].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

どうやら、Xは2DのArrayを求めているらしい。確かにsklearnのリファレンスにも下記の様に書いてある。
Screen Shot 2020-01-31 at 21.57.12.png

ということで、若干乱暴ではあるが、二次元のArrayを用意する。

X = []
for i in range(1,56):
    X.append([i])

いざ

reg = linear_model.LinearRegression()
 
Y = df['EXP']
# 予測モデルを作成
reg.fit(X, Y)
# 回帰係数
print(reg.coef_)
# 切片 
print(reg.intercept_)
# R2(決定係数)
print(reg.score(X, Y))
Screen Shot 2020-01-31 at 22.04.06.png

よしたかは、回帰分析に成功した!
(数式はjupyterのMarkdownで別に書いてます。)

息をするように可視化する。

plt.plot(df.index,df['EXP'],label="EXP")
plt.plot(X,reg.predict(X),label="LinearRegression")
plt.xlabel('LEVEL')
plt.ylabel('EXP')
plt.grid(True)

image.png

これは全然ダメだ・・・・。確かにR2が0.377なので全く意味をなしていない。
(別に良いんです、これはあくまでも勉強なんです。)

次はあるレベルまでに必要な累積経験値

reg2 = linear_model.LinearRegression()
 
Y2 = df['CUMSUM_EXP']
# 予測モデルを作成
reg2.fit(X, Y2)
# 回帰係数
print(reg2.coef_)
# 切片 (誤差)
print(reg2.intercept_)
# R2(決定係数)
print(reg2.score(X, Y2))
Screen Shot 2020-01-31 at 22.03.36.png

息をするように可視化

image.png

こちらも全然ダメだ・・・・。確かにR2が0.575なので、先ほどよりはましとは言え全く意味をなしていない。
(別に良いんです、これはあくまでも勉強なんです。)

多次元化

流石に1次式ではダメなのは明らかなので多次元化してみる

二次元化

まずは説明変数を作る

D1 = []
D2 = []
for i in range(1,56):
    D1.append(i)
    D2.append(i**2)
df_x = pd.DataFrame({"D1":D1,"D2":D2})
df_x.head()
Screen Shot 2020-01-31 at 22.22.33.png

##sklearnのlinear_modelにデータを食わせる

まずは次のレベルまでに必要な経験値

reg3 = linear_model.LinearRegression()
X3 =df_x
Y3 = df['EXP']
# 予測モデルを作成
reg3.fit(X3, Y3)
# 回帰係数
print(reg3.coef_)
# 切片 (誤差)
print(reg3.intercept_)
# R2(決定係数)
print(reg3.score(X3, Y3))
Screen Shot 2020-01-31 at 22.25.28.png

###息をするように可視化

plt.plot(df.index,df['EXP'],label="EXP")
plt.plot(X,reg3.predict(X3),label="LinearRegression")
plt.xlabel('LEVEL')
plt.ylabel('EXP')
plt.grid(True)

image.png

R2が0.644っと、さっきよりはマシとはいえ、まだまだFitしているとは言い難い。

次はあるレベルまでに必要な累積経験値

reg4 = linear_model.LinearRegression()
X4 =df_x
Y4 = df['CUMSUM_EXP']
# 予測モデルを作成
reg4.fit(X4, Y4)
# 回帰係数
print(reg4.coef_)
# 切片 (誤差)
print(reg4.intercept_)
# R2(決定係数)
print(reg4.score(X4, Y4))
Screen Shot 2020-01-31 at 22.28.27.png

###息をするように可視化

plt.plot(df.index,df['CUMSUM_EXP'],label="CUMSUM_EXP")
plt.plot(X,reg4.predict(X4),label="LinearRegression")
plt.xlabel('LEVEL')
plt.ylabel('EXP')
plt.grid(True)

image.png

R2が0.860だし、見た目にも結構良いんじゃないでしょうか?

三次元化以降

プログラムは同じなので、グラフの結果だけ。

###3次元
image.png

4次元

image.png

累積の方はかなりFitしてきました。R2も0.9733まででてます。

5次元

image.png

どちらもほぼFitしたといってもいいのではないでしょうか?
R2は次のレベルまでに必要な経験値が0.961、累積経験値が0.987です。

# そして伝説へ

もし、現在の最大レベル55が原作同様に99まで上がるとした場合に必要な累積経験値を試算してみましょう。

算出したモデル式はこちらです
Screen Shot 2020-01-31 at 23.10.47.png

これを可視化すると

image.png

**レベル99に到達するには1億4千万近い経験値(1,392,549,526)が必要になります。(予想ですよ、予想。)**ちなみにレベル55までに必要な経験値が3,441,626(約350万)なので、404回レベル55にする必要があります・・・・・。

メタルホイミンなら66,311匹、はぐれメタルなら132,623匹、メタルスライムなら904,252匹。もぅ、WWFが動き出しそうな数を乱獲する必要がありまね。

Game Over

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?