多変数関数とは?複数の要素で決まる値の関係をわかりやすく解説

「今日の気温は何度?」と聞かれたら、答えは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で実際に計算したり、グラフを描いたりして、感覚をつかんでいきましょう!

コメント

タイトルとURLをコピーしました