科学技術計算や機械学習の分野では、ネイピア数 $e$(自然対数の底、約2.718)を底とする指数関数 $y = e^x$ が頻繁に登場します。
Pythonの標準ライブラリ math モジュールには、この計算を高速かつ高精度に行うための関数 math.exp() が用意されています。
この記事では、math.exp() の基本的な使い方と、機械学習でよく使われる「シグモイド関数」の実装例を通じてその活用方法を解説します。
math.exp() の基本的な使い方
math.exp(x) は、$e$ の $x$ 乗($e^x$)を計算して返します。
構文:
import math
値 = math.exp(数値)
具体的な使用例:放射性物質の減衰
指数関数的な減少(減衰)を計算する例です。ある物質の量が時間とともに $e^{-t}$ に比例して減少していく様子をシミュレーションします。
import math
def calculate_decay(initial_amount, rate, time):
"""
指数関数的減衰を計算する関数
N(t) = N0 * e^(-λt)
"""
# -rate * time の部分を指数として計算
decay_factor = math.exp(-rate * time)
return initial_amount * decay_factor
# 初期量: 100, 減衰率: 0.5, 時間: 2
amount_at_t2 = calculate_decay(100, 0.5, 2)
# 時間: 5
amount_at_t5 = calculate_decay(100, 0.5, 5)
print(f"時間0: 100.0")
print(f"時間2: {amount_at_t2:.4f}")
print(f"時間5: {amount_at_t5:.4f}")
実行結果:
時間0: 100.0
時間2: 36.7879
時間5: 8.2085
math.exp(-rate * time) を使うことで、自然な減衰カーブを簡単に計算できます。
実践例:シグモイド関数の実装
math.exp() が最もよく使われる場面の一つに、AI(ニューラルネットワーク)における活性化関数「シグモイド関数」の実装があります。
数式は以下の通りです。
$$\sigma(x) = \frac{1}{1 + e^{-x}}$$
これをPythonコードに落とし込みます。
import math
def sigmoid(x):
"""シグモイド関数"""
return 1 / (1 + math.exp(-x))
# --- 動作確認 ---
values = [-5, 0, 5]
print("--- シグモイド関数の計算結果 ---")
for v in values:
result = sigmoid(v)
print(f"x={v:>2} : {result:.4f}")
実行結果:
--- シグモイド関数の計算結果 ---
x=-5 : 0.0067
x= 0 : 0.5000
x= 5 : 0.9933
入力値が 0 のときに 0.5 となり、大きな正の値なら 1 に、小さな負の値なら 0 に近づくシグモイド関数の特性が確認できます。
math.e ** x との違い
math.exp(x) は、math.e ** x (定数 e のべき乗)と同じ計算をしているように見えますが、以下の点で math.exp(x) の使用が推奨されます。
- 精度:
math.exp(x)は、指数関数専用のアルゴリズムで実装されており、通常のべき乗計算よりも精度が高い場合があります。 - 可読性: 数式における $\exp(x)$ という表記と対応しており、コードの意味が伝わりやすくなります。
x = 10
# どちらもほぼ同じ結果になるが、math.exp の方が専用関数として好ましい
print(math.e ** x)
print(math.exp(x))
まとめ
math.exp(x): ネイピア数 $e$ の $x$ 乗($e^x$)を計算します。- 物理現象のシミュレーション(減衰、成長)や、統計・機械学習(シグモイド関数、正規分布)など幅広い分野で利用されます。
- 単純な
math.e ** xよりも、専用関数であるmath.exp(x)を使うことが一般的です。
