0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python+scipyによるフィッテイングで非線形関数とグラフを出力させた

Last updated at Posted at 2024-05-24

1. ミッション

はじめに

従量課金制サービスに溢れる世の中。。
AWS、Azure、OCIなどのメトリクスで累計は確認できるだろうけど...
累計使用量を表す式、グラフ、できれば知りたいですよね??

(いや、、Qiita記事のネタになるなと思っただけで
日頃から私もそうは思ってないけど...笑)

お題

  • 今回は、7日間で累積28(GB)と想定
  • それぞれの使用量は[3, 3, 5, 2, 8, 4, 2]と設定

期間(日)を入れると以下の値(GB)が返ってくる関数を探す旅に出る
🐎🐎🐎

F(1)=3
F(7)=28

2. 数学のお話

これは非線形だな、少なくとも線形グラフではないと分かった時は、
指数関数をうまく利用すると大体うまくいく

非線形関数モデルにおけるフィッテングは機械に任せる!

🚀🚀🚀

  • パラメータ定数(A,k)の具体的な値をフィッティングで探索
※前提条件: A,k\in\mathbb{R}
  • F(t):日々の使用量を表すf(t)の積分=累計使用量(GB)
F(t)=A⋅e^{kt}−A 
  • f(t):累計使用量を表すF(t)の微分=日々の使用量(GB)

f(t)=A⋅k・e^{kt}

3.実装

import numpy as np
from scipy.optimize import curve_fit

# 日数
days = np.array([1, 2, 3, 4, 5, 6, 7])
# 日々の使用量
daily_usage = np.array([3, 3, 5, 2, 8, 4, 2])
# 累計使用量
cumulative_usage = np.cumsum(daily_usage)

# 累計使用量のモデル
def cumulative_model(t, A, k):
    return A * np.exp(k * t) - A

# フィッティング
params, covariance = curve_fit(cumulative_model, days, cumulative_usage, p0=[1, 0.1])
A, k = params
print(f"A: {A}, k: {k}")

# グラフの描画
plt.figure(figsize=(10, 6))
plt.plot(days, cumulative_usage, 'o', label='累計使用量(実測値)')
plt.plot(days, cumulative_model(days, A, k), '-', label='累計使用量(モデル)')
plt.xlabel('日数')
plt.ylabel('累計使用量 (GB)')
plt.legend()
plt.title(f'累計使用量のモデル: A={A:.2f}, k={k:.2f}')
plt.grid(True)
plt.show()

4.結果

指数関数のパラメータ(A,k)

  • A=56.14
  • 𝑘=0.0584

👩‍💻👩‍💻👩‍💻

累計使用量(GB):F(t)=56.14⋅e ^{0.0584t}−56.14
日々の使用量(GB): f(t)=56.14⋅0.0584⋅e ^{0.0584t}

グラフにするとこんな感じ

※データの母数が少ないからか線形っぽく見えるけど、非線形関数です
🧑‍💻🧑‍💻🧑‍💻
スクリーンショット 2024-05-24 22.56.03.png

0
2
1

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?