「今日の気温は何度?」と聞かれたら、答えは1つの数字で済みますよね。
でも実際には、気温は場所と時間の両方によって決まります。
「東京の午前10時は15度、大阪の午後3時は18度」——このように、複数の要素によって決まる値を扱うのが多変数関数です。
「数学の授業で習ったけど、何に使うの?」
「機械学習と関係があるって聞いたけど…」
実は、多変数関数は私たちの身の回りにあふれていて、データサイエンスや機械学習でも欠かせない概念なんです。
今回は、多変数関数の基本から、実生活での例、プログラミングでの扱い方、そして機械学習への応用まで、分かりやすく解説していきますね。
多変数関数とは?基本を理解しよう

複数の入力で1つの出力が決まる関数
多変数関数とは、複数の変数(入力)によって1つの値(出力)が決まる関数のことです。
数学的な表記:
z = f(x, y)
- x と y が入力変数(独立変数)
- z が出力(従属変数)
- f が関数の名前
読み方は「zはxとyの関数」または「fはxとyの多変数関数」です。
1変数関数との違い
まずは、おさらいから始めましょう。
1変数関数:
y = f(x)
y = 2x + 3
- 入力が1つ(x)
- 出力が1つ(y)
- 直線や曲線で表せる
多変数関数:
z = f(x, y)
z = 2x + 3y + 5
- 入力が複数(x, y)
- 出力が1つ(z)
- 立体的な面(曲面)で表される
さらに多くの変数:
w = f(x, y, z)
w = 2x + 3y + 4z + 5
- 入力が3つ以上でも多変数関数
- 4次元以上は図では描けないが、数式で扱える
身近な多変数関数の例
例1:気温
気温 = f(緯度, 経度, 時刻, 高度)
気温は、以下の複数の要素で決まります:
- 緯度:北に行くほど寒い
- 経度:場所によって気候が違う
- 時刻:昼は暖かく、夜は涼しい
- 高度:標高が高いほど気温が下がる
これらすべてを考慮した関数が、気温を予測する多変数関数です。
例2:家の価格
価格 = f(広さ, 駅からの距離, 築年数, 階数)
不動産の価格は、様々な要素で決まります:
- 広さ:広いほど高い
- 駅からの距離:近いほど高い
- 築年数:新しいほど高い
- 階数:高層階ほど高い(一般的に)
不動産の査定は、まさに多変数関数の計算です。
例3:商品の売上
売上 = f(価格, 広告費, 季節, 在庫数)
ビジネスでも多変数関数が活躍します:
- 価格:安いほど売れる(ただし利益率は下がる)
- 広告費:多いほど認知度が上がる
- 季節:商品によって季節性がある
- 在庫数:在庫切れでは売れない
売上予測は、複雑な多変数関数で表されます。
例4:画像のピクセル
明るさ = f(x座標, y座標)
デジタル画像も多変数関数です:
- x座標:横の位置
- y座標:縦の位置
- 明るさ:その位置のピクセルの値
カラー画像なら、さらにRGB(赤・緑・青)の3つの値があります。
例5:体調の良さ
体調 = f(睡眠時間, 運動量, 栄養, ストレス)
健康も多変数関数で考えられます:
- 睡眠時間:長すぎても短すぎてもダメ
- 運動量:適度が良い
- 栄養:バランスが重要
- ストレス:少ないほど良い
最適な体調を保つには、複数の要素をバランスよく保つ必要があります。
多変数関数のグラフ表現
2変数関数の3次元グラフ
例:z = x² + y²
この関数は、お椀をひっくり返したような曲面を描きます。
特徴:
- 原点(x=0, y=0)で最小値 z=0
- 原点から離れるほど、zの値が大きくなる
- 円形の対称性を持つ
視覚化のイメージ:
- x軸:左右方向
- y軸:前後方向
- z軸:上下方向
- 曲面が立体的に浮かび上がる
等高線で表現する
3次元が描きにくい場合、等高線(コンターライン)を使います。
等高線とは:
- 地図の標高と同じ概念
- 同じ高さ(z値)の点を結んだ線
- 2次元の紙に3次元情報を表現できる
例:z = x² + y² の等高線
- z = 1:半径1の円
- z = 4:半径2の円
- z = 9:半径3の円
等高線が密集している場所は、傾きが急です。
ヒートマップで表現する
ヒートマップは、値の大きさを色で表現します。
特徴:
- 赤:値が大きい
- 青:値が小さい
- 緑・黄色:中間
データ分析や機械学習でよく使われます。
多変数関数の計算例
簡単な計算問題
例題1:z = 2x + 3y
x = 1, y = 2 のとき、zの値は?
解答:
z = 2(1) + 3(2)
z = 2 + 6
z = 8
実用的な計算
例題2:家賃の計算
家賃モデル:
家賃 = 5 × 広さ + (-1) × 駅距離 + (-0.5) × 築年数 + 50
- 広さ:30㎡
- 駅距離:5分
- 築年数:10年
計算:
家賃 = 5 × 30 + (-1) × 5 + (-0.5) × 10 + 50
家賃 = 150 - 5 - 5 + 50
家賃 = 190(万円)
このように、多変数関数を使うと、複雑な計算も式1つで表現できます。
偏微分:1つの変数だけを変化させる
偏微分とは何か
偏微分とは、他の変数を固定したまま、1つの変数だけを変化させたときの変化率です。
1変数関数の微分(復習):
y = x²
dy/dx = 2x
xが少し変化したとき、yがどれくらい変化するか。
多変数関数の偏微分:
z = x² + y²
∂z/∂x = 2x(yを固定してxだけ変化)
∂z/∂y = 2y(xを固定してyだけ変化)
記号は「∂」(ラウンドディー、ラウンドデルタ)を使います。
偏微分の意味
例:山登り
標高 = f(東西の位置, 南北の位置)
∂標高/∂東西:
- 南北の位置を固定
- 東西に1メートル進んだとき、標高がどれくらい変わるか
- 「東向きの傾き」
∂標高/∂南北:
- 東西の位置を固定
- 南北に1メートル進んだとき、標高がどれくらい変わるか
- 「北向きの傾き」
偏微分は、各方向の傾きを表しています。
偏微分の計算例
例:z = 3x² + 2xy + y²
xで偏微分(yは定数として扱う):
∂z/∂x = 6x + 2y
yで偏微分(xは定数として扱う):
∂z/∂y = 2x + 2y
具体的な点での値:
x = 1, y = 2 のとき
∂z/∂x = 6(1) + 2(2) = 10
∂z/∂y = 2(1) + 2(2) = 6
この点では、x方向の傾きが10、y方向の傾きが6です。
機械学習での多変数関数
機械学習モデルは多変数関数
線形回帰モデル:
予測値 = w₁x₁ + w₂x₂ + w₃x₃ + ... + b
- x₁, x₂, x₃…:入力特徴量(年齢、身長、体重など)
- w₁, w₂, w₃…:重み(パラメータ)
- b:バイアス(定数項)
これは多変数関数そのものです。
損失関数も多変数関数
損失関数:
Loss = f(w₁, w₂, w₃, ..., b)
- 入力:モデルのパラメータ
- 出力:予測の誤差
機械学習の「学習」とは、この損失関数を最小化するパラメータを見つけることです。
勾配降下法と偏微分
機械学習の最適化では、勾配降下法が使われます。
勾配(gradient):
勾配 = (∂Loss/∂w₁, ∂Loss/∂w₂, ∂Loss/∂w₃, ...)
- 各パラメータでの偏微分を並べたもの
- 「どの方向に進めば損失が減るか」を示す
更新式:
新しいw₁ = 古いw₁ - 学習率 × ∂Loss/∂w₁
新しいw₂ = 古いw₂ - 学習率 × ∂Loss/∂w₂
...
偏微分の逆方向に少しずつ進むことで、最適解に近づきます。
Pythonでの実装
多変数関数の定義と計算
import numpy as np
# 多変数関数の定義
def f(x, y):
"""z = x^2 + y^2"""
return x**2 + y**2
# 計算例
x = 3
y = 4
z = f(x, y)
print(f"f({x}, {y}) = {z}") # f(3, 4) = 25
# 複数の点で計算
x_values = np.array([1, 2, 3])
y_values = np.array([2, 3, 4])
z_values = f(x_values, y_values)
print(z_values) # [5, 13, 25]
3次元グラフの描画
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# x, yの範囲を作成
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
# 多変数関数を計算
Z = X**2 + Y**2
# 3次元グラフを描画
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('z = x² + y²')
plt.show()
等高線プロットの作成
import numpy as np
import matplotlib.pyplot as plt
# x, yの範囲を作成
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
# 多変数関数を計算
Z = X**2 + Y**2
# 等高線プロット
plt.figure(figsize=(8, 6))
contour = plt.contour(X, Y, Z, levels=20, cmap='viridis')
plt.colorbar(contour, label='z value')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Contour plot: z = x² + y²')
plt.grid(True)
plt.show()
ヒートマップの作成
import numpy as np
import matplotlib.pyplot as plt
# x, yの範囲を作成
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
# 多変数関数を計算
Z = np.sin(X) * np.cos(Y)
# ヒートマップ
plt.figure(figsize=(8, 6))
heatmap = plt.imshow(Z, extent=[-5, 5, -5, 5], origin='lower', cmap='coolwarm', aspect='auto')
plt.colorbar(heatmap, label='z value')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Heatmap: z = sin(x) × cos(y)')
plt.show()
偏微分の数値計算
import numpy as np
def f(x, y):
"""z = x^2 + 2xy + y^2"""
return x**2 + 2*x*y + y**2
def partial_derivative_x(x, y, h=1e-5):
"""xでの偏微分(数値微分)"""
return (f(x + h, y) - f(x - h, y)) / (2 * h)
def partial_derivative_y(x, y, h=1e-5):
"""yでの偏微分(数値微分)"""
return (f(x, y + h) - f(x, y - h)) / (2 * h)
# 計算例
x, y = 1, 2
dz_dx = partial_derivative_x(x, y)
dz_dy = partial_derivative_y(x, y)
print(f"∂z/∂x at ({x}, {y}) = {dz_dx:.4f}") # 約6.0
print(f"∂z/∂y at ({x}, {y}) = {dz_dy:.4f}") # 約6.0
# 解析的な解(正確な値)
analytical_dx = 2*x + 2*y # 2(1) + 2(2) = 6
analytical_dy = 2*x + 2*y # 2(1) + 2(2) = 6
print(f"解析的な ∂z/∂x = {analytical_dx}")
print(f"解析的な ∂z/∂y = {analytical_dy}")
データサイエンスでの応用
重回帰分析
複数の説明変数で目的変数を予測:
from sklearn.linear_model import LinearRegression
import numpy as np
# サンプルデータ
# 広さ、駅距離、築年数から家賃を予測
X = np.array([
[30, 5, 10], # 30㎡、駅5分、築10年
[50, 10, 5], # 50㎡、駅10分、築5年
[40, 3, 15], # 40㎡、駅3分、築15年
[60, 15, 20], # 60㎡、駅15分、築20年
])
y = np.array([10, 15, 12, 13]) # 家賃(万円)
# モデルの学習
model = LinearRegression()
model.fit(X, y)
# 学習された多変数関数のパラメータ
print("係数:", model.coef_)
print("切片:", model.intercept_)
# 予測
new_house = np.array([[45, 7, 8]]) # 45㎡、駅7分、築8年
predicted_rent = model.predict(new_house)
print(f"予測家賃: {predicted_rent[0]:.2f}万円")
画像処理
画像は2変数関数の集まり:
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 画像を読み込む
img = Image.open('sample.jpg').convert('L') # グレースケール
img_array = np.array(img)
# 画像は多変数関数:明るさ = f(x, y)
print(f"画像サイズ: {img_array.shape}")
# 特定のピクセルの値
x, y = 100, 150
brightness = img_array[y, x]
print(f"位置({x}, {y})の明るさ: {brightness}")
# ヒートマップとして表示
plt.imshow(img_array, cmap='gray')
plt.colorbar(label='Brightness')
plt.title('Image as a 2-variable function')
plt.show()
最適化問題
多変数関数の最小値を見つける:
from scipy.optimize import minimize
import numpy as np
# 最小化したい多変数関数
def objective(params):
x, y = params
return (x - 3)**2 + (y + 2)**2 + 10
# 初期値
initial_guess = [0, 0]
# 最適化
result = minimize(objective, initial_guess, method='BFGS')
print("最適解:")
print(f"x = {result.x[0]:.4f}")
print(f"y = {result.x[1]:.4f}")
print(f"最小値 = {result.fun:.4f}")
# 理論値:x=3, y=-2, 最小値=10
実務での活用例
ビジネス分析
売上予測モデル:
売上 = f(価格, 広告費, 季節性, 競合数)
活用:
- どの要素が売上に最も影響するか分析(偏微分の大きさ)
- 最適な価格と広告費の組み合わせを見つける
- シナリオ分析(価格を10%下げたら売上はどうなる?)
工学・製造業
製品の品質:
品質 = f(温度, 圧力, 時間, 材料の配合)
活用:
- 最適な製造条件を見つける
- 各パラメータの許容範囲を決定
- 不良品を減らす
医療・健康
健康スコア:
健康度 = f(BMI, 血圧, 血糖値, 運動量, 睡眠時間)
活用:
- 総合的な健康状態の評価
- どの要素を改善すべきか提案
- 予防医療の計画立案
金融
リスク評価:
リスク = f(株価, 為替, 金利, ボラティリティ)
活用:
- ポートフォリオの最適化
- リスクヘッジ戦略
- 価格予測モデル
多変数関数を扱う際の注意点
次元の呪い
問題:
変数が増えると、計算量が爆発的に増加します。
例:
- 2変数:100×100 = 10,000点
- 3変数:100×100×100 = 1,000,000点
- 10変数:100¹⁰ = 10²⁰点(計算不可能)
対策:
- 重要な変数だけを選ぶ(特徴選択)
- 次元削減(主成分分析など)
- サンプリングで代表点だけ計算
可視化の限界
問題:
3変数以上は、直接的に描画できません。
対策:
- 2つの変数だけを変化させて断面を見る
- 複数のグラフを組み合わせる
- 色や大きさで追加の次元を表現
局所最適解
問題:
複雑な多変数関数は、複数の谷(極小値)を持つことがあります。
対策:
- 異なる初期値から複数回最適化
- グローバル最適化アルゴリズムを使用
- 勾配降下法にランダム性を加える
相互作用の複雑さ
問題:
変数同士が影響し合うと、解釈が難しくなります。
例:
- 広告費の効果は、価格によって変わる
- 運動の効果は、栄養状態によって変わる
対策:
- 相互作用項を明示的に追加
- 可視化で関係性を確認
- ドメイン知識を活用
よくある質問と回答
Q1:何変数まで扱えますか?
A:数学的には無限ですが、実用的には制限があります。
実務での目安:
- 手計算:2〜3変数
- 可視化:2〜3変数(追加で色や大きさで4〜5変数)
- 機械学習:数百〜数千変数も可能
- ただし、変数が多いほどデータ量も必要
Q2:偏微分と普通の微分の違いは?
A:他の変数を固定するかどうかの違いです。
1変数関数の微分:
- 変数は1つだけ
- その変数を変化させたときの変化率
多変数関数の偏微分:
- 変数が複数ある
- 1つの変数だけを変化させ、他は固定
- 各変数について偏微分がある
Q3:等高線の間隔が意味することは?
A:傾きの急さを表しています。
等高線が密集:
- 傾きが急
- わずかに移動すると、値が大きく変わる
等高線が疎:
- 傾きが緩やか
- 移動しても、値はあまり変わらない
地図の等高線と同じイメージです。
Q4:機械学習を学ぶのに、多変数関数の理解は必須ですか?
A:深く理解するなら必須、使うだけなら基礎でOKです。
最低限必要な知識:
- 多変数関数の概念
- 偏微分の直感的な意味
深く学ぶなら:
- 偏微分の計算
- 勾配、ヘッセ行列
- 多変数の最適化理論
ライブラリを使えば、数学的な詳細を知らなくても実装できます。
まとめ:多変数関数は現実世界を表現する道具
多変数関数は、複雑な現実世界を数式で表現するための強力なツールです。
この記事のポイント:
- 多変数関数は複数の入力で1つの出力が決まる関数
- 気温、家賃、健康状態など、身の回りに多変数関数があふれている
- グラフは3次元曲面、等高線、ヒートマップで表現できる
- 偏微分は各変数方向の傾きを表す(他の変数は固定)
- 機械学習モデルは多変数関数そのもの
- 勾配降下法は偏微分を使った最適化手法
- Pythonで簡単に計算・可視化できる
- データサイエンス、ビジネス、工学など幅広い分野で活用
- 変数が増えすぎると「次元の呪い」に注意
- 実務では2〜3変数の理解から始めればOK
「複数の要素を考慮して判断する」——これは私たちが日常的にやっていることです。
多変数関数は、その直感を数学的に表現したものに過ぎません。
機械学習やデータサイエンスを学ぶなら、多変数関数の基礎を押さえておくと、アルゴリズムの理解が格段に深まりますよ。
まずは2変数の簡単な関数から、Pythonで実際に計算したり、グラフを描いたりして、感覚をつかんでいきましょう!

コメント