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}