論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
連続最適化
Continuous Optimization
数理最適化

🔖 キーワード索引

このページで扱う主要キーワード(クリックで該当セクションへ):

凸関数 勾配降下法 ニュートン法 KKT 条件 ラグランジュ乗数 二次計画 QP 線形計画 LP 制約あり最適化 微分可能性 局所最適 収束判定 SSDSE 都道府県回帰

💡 30秒で分かる結論

📍 あなたが今見ているもの

連続最適化」 (Continuous Optimization) は、 SSDSE-B-2026 などの公的統計データを使った教材・分析で頻出するキーワードです。 本ページでは、 まず直感、 次に数式、 そして 47 都道府県の実値で確かめる、 という流れで体系的に整理します。 加えて、 ケーススタディ・FAQ・歴史的経緯・参考文献までを 1 ページに集約し、 用語の「地図」として使えるようにしました。

関連用語(前提・並列・発展)と関連グループ教材も末尾にまとめてあるので、 用語の地図として活用してください。

🎨 直感で掴む

連続最適化は、 決定変数が 連続実数 である最適化問題を扱う分野です。 「最小二乗で回帰係数を決める」「最尤推定でパラメータを当てはめる」「ニューラルネットの重みを学習する」のは、 すべて連続最適化問題です。

対比として 組合せ最適化は決定変数が 0/1 や順列などの離散値、 たとえば「都道府県をどの 3 クラスタに分けるか」のような問題を扱います。 連続最適化は微分・凸性という強力な道具立てが使えるため、 数値解法は概して洗練されています。

SSDSE の例で言えば、 「県内総生産を 人口就業者数大学数で説明する線形回帰」は、 47 個の県データに対する 4 個の連続パラメータの最適化問題です。

📐 数式・定義

もっとも基本的な連続最適化問題は、 制約なし最小化:

【無制約最適化】
$$\min_{\theta\in\mathbb{R}^d}\; f(\theta)$$

$f$ が微分可能なら、 最適性条件 $\nabla f(\theta^\star) = 0$ の解を探す。

【制約付き最適化(一般形)】
$$\min_{\theta}\; f(\theta) \quad\text{s.t.}\quad g_i(\theta)\le 0,\;h_j(\theta)=0$$

解の必要条件は KKT (Karush-Kuhn-Tucker) 条件

$$\nabla f(\theta^\star)+\sum_i \lambda_i^\star \nabla g_i(\theta^\star)+\sum_j \mu_j^\star \nabla h_j(\theta^\star)=0,\;\; \lambda_i^\star \ge 0,\;\; \lambda_i^\star g_i(\theta^\star)=0$$

代表的な数値解法:

【勾配降下法】
$$\theta^{k+1} = \theta^k - \eta\,\nabla f(\theta^k)$$
【ニュートン法】
$$\theta^{k+1} = \theta^k - \bigl[\nabla^2 f(\theta^k)\bigr]^{-1}\nabla f(\theta^k)$$

🔬 数式・概念を言葉で読み解く

連続最適化を支える概念を整理します。

概念意味
目的関数 $f$最小化/最大化する量残差二乗和、 負対数尤度、 損失関数
決定変数 $\theta$最適化される連続パラメータ回帰係数、 NN の重み
制約$\theta$ が満たすべき式$\theta\ge 0$、 $\|\theta\|\le 1$
勾配 $\nabla f$1 次の変化方向各偏微分のベクトル
ヘッセ $\nabla^2 f$2 次の曲率正定値なら凸
凸性$f(\alpha x+(1-\alpha)y)\le \alpha f(x)+(1-\alpha)f(y)$凸なら局所最適=大域最適
ラグランジュ乗数制約の影付き価格制約緩和の感度
双対問題主問題の下界を与えるSVM の双対形は内積で書ける

🧮 実値で計算してみる(SSDSE-B-2026)

実値計算:SSDSE で「人口 → 県内総生産」の最小二乗回帰

SSDSE-B-2026 の 2023 年、 47 都道府県を使って $y$ = 県内総生産(C3301、 B 表に集約)、 $x$ = 総人口とする 1 次式 $y = a + b x$ の係数を最小二乗で求めます。 これは凸 2 次計画なので解析解があり、

$$b = rac{\sum (x_i-ar x)(y_i-ar y)}{\sum (x_i-ar x)^2},\quad a = ar y - b\,ar x$$

実 SSDSE データでは、 $ar x pprox 264.6$ 万人、 $ar y pprox 11.7$ 兆円、 相関 r ≈ 0.97 で、 おおむね

  • 傾き $b pprox 4.6$(単位:兆円 / 100 万人)
  • 切片 $a pprox -0.5$ 兆円
  • つまり「人口 100 万人増えれば県内総生産 4.6 兆円分」 という強い線形関係。 R² ≈ 0.94。

この回帰問題は形式上、 凸 2 次計画 (QP) です。 制約を $b\ge 0$ と加えても閉形式は崩れますが、 KKT で解けます。

🐍 Python 実装

例 1:scipy.optimize.minimize で非凸関数を解く

import numpy as np
from scipy.optimize import minimize

def rosenbrock(x):
    return (1 - x[0])**2 + 100*(x[1] - x[0]**2)**2

res = minimize(rosenbrock, x0=[-1.2, 1.0], method='BFGS')
print(res.x, res.fun)

例 2:cvxpy で制約付き凸最適化(凸 QP)— SSDSE の制約付き回帰

import pandas as pd, numpy as np
import cvxpy as cp

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis')
df.columns = df.iloc[0]
df = df.iloc[1:].reset_index(drop=True)
df = df[df['年度']=='2023'].reset_index(drop=True)

x = df['総人口'].astype(float).to_numpy()/1e6
y = df['県内総生産'].astype(float).to_numpy()/1e12  # 兆円
n = len(x)
X = np.column_stack([np.ones(n), x])

beta = cp.Variable(2)
obj = cp.Minimize(cp.sum_squares(X @ beta - y))
cons = [beta[1] >= 0]                # 「傾きは非負」という制約
prob = cp.Problem(obj, cons)
prob.solve()
print('係数:', beta.value, '残差^2:', prob.value)

例 3:scikit-learn で正則化付き回帰(連続凸最適化の代表)

from sklearn.linear_model import Ridge

X_full = df[['総人口','15歳未満人口','15〜64歳人口','65歳以上人口']].astype(float).to_numpy()
model = Ridge(alpha=1.0)
model.fit(X_full, df['県内総生産'].astype(float))
print('回帰係数:', model.coef_)
print('切片:', model.intercept_)

例 4:勾配降下を手書きで(線形回帰)

import numpy as np
x = df['総人口'].astype(float).to_numpy()/1e6
y = df['県内総生産'].astype(float).to_numpy()/1e12
X = np.column_stack([np.ones_like(x), x])
theta = np.zeros(2)
eta = 1e-3
for k in range(2000):
    grad = X.T @ (X @ theta - y) / len(y)
    theta -= eta * grad
print('GD 解:', theta)

📂 ケーススタディ・追加実装例

ケース 1:線形回帰 = 凸 2 次計画

最小二乗問題:

$$\min_\beta \|y - X\beta\|^2 \quad\Leftrightarrow\quad \beta^\star = (X^\top X)^{-1} X^\top y$$

これは凸 2 次計画 (QP) で、 解析解が存在します。

ケース 2:ロジスティック回帰 = 凸最尤

負の対数尤度を最小化:

$$\min_\beta \sum_i \log(1 + e^{-y_i X_i \beta})$$

勾配は閉形ではないが凸なので、 Newton-Raphson や IRLS で大域最適に収束。

ケース 3:SVM = 凸 QP(双対形)

$$\max_\alpha \sum_i \alpha_i - \tfrac{1}{2}\sum_{ij} \alpha_i \alpha_j y_i y_j K(x_i, x_j),\;\;\text{s.t.}\;\sum_i \alpha_i y_i = 0,\;0\le\alpha_i\le C$$

ケース 4:LASSO = 凸非滑らか最適化

$$\min_\beta \tfrac{1}{2}\|y-X\beta\|^2 + \lambda \|\beta\|_1$$

$\|\cdot\|_1$ が非滑らかなので、 座標降下法・近接勾配法 (ISTA/FISTA) を使う。

ケース 5:ニューラルネット = 非凸連続最適化

重み $W$ について損失 $L(W)$ が高度に非凸。 Adam・AdamW・SGD with momentum が標準。 局所最適より サドル点が問題 という研究もある。

ケース 6:実 SSDSE で勾配降下を試す

import pandas as pd, numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis')
df.columns = df.iloc[0]
df = df.iloc[1:].reset_index(drop=True)
df = df[df['年度']=='2023'].reset_index(drop=True)
X = df[['総人口']].astype(float).to_numpy() / 1e6
y = df['県内総生産'].astype(float).to_numpy() / 1e12
X = np.hstack([np.ones_like(X), X])
theta = np.zeros(2)
for k in range(5000):
    grad = X.T @ (X @ theta - y) / len(y)
    theta -= 0.005 * grad
    if k % 1000 == 0:
        loss = ((X @ theta - y) ** 2).mean()
        print(f'iter {k}: loss={loss:.4f}, theta={theta}')

🪜 ステップバイステップ チュートリアル

チュートリアル:SSDSE で「制約付き回帰」を凸最適化として解く

ステップ 1:問題設定

$y$ = 県内総生産(兆円)、 $x_1$ = 総人口(百万人)、 $x_2$ = 65歳以上人口割合(%)。 回帰モデル $y = \beta_0 + \beta_1 x_1 + \beta_2 x_2$。 「$\beta_1$(人口係数)は非負」 という業務制約を加える。

ステップ 2:cvxpy で定式化

import pandas as pd, numpy as np
import cvxpy as cp

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis')
df.columns = df.iloc[0]
df = df.iloc[1:].reset_index(drop=True)
df = df[df['年度']=='2023'].reset_index(drop=True)
df['総人口'] = df['総人口'].astype(int)
df['65歳以上人口'] = df['65歳以上人口'].astype(int)
df['県内総生産'] = df['県内総生産'].astype(int)
df['65歳以上比率'] = df['65歳以上人口'] / df['総人口'] * 100

n = len(df)
X = np.column_stack([np.ones(n),
                     df['総人口'].to_numpy()/1e6,
                     df['65歳以上比率'].to_numpy()])
y = df['県内総生産'].to_numpy()/1e12

beta = cp.Variable(3)
obj = cp.Minimize(cp.sum_squares(X @ beta - y))
cons = [beta[1] >= 0, beta[1] <= 10]    # 業務知識からの制約
prob = cp.Problem(obj, cons)
prob.solve()
print('係数:', beta.value)
print('残差二乗和:', prob.value)

ステップ 3:KKT 条件の確認

grad = 2 * X.T @ (X @ beta.value - y)
# beta[1] が制約境界に当たっていれば、 対応するラグランジュ乗数 > 0
for i, c in enumerate(cons):
    print(f'制約 {i} 双対変数:', c.dual_value)

ステップ 4:制約あり vs なし比較

unc, *_ = np.linalg.lstsq(X, y, rcond=None)
print('無制約解:', unc)
print('制約解:', beta.value)
# 残差・予測精度・解釈を比較

ステップ 5:感度分析

各係数を ±10% 動かしたときの残差変化を計算。 ラグランジュ乗数は「制約を 1 単位緩めたときの目的改善」を示す。

🚀 現場での応用シナリオ(8 例)

応用 1:機械学習の学習

$\min_\theta L(\theta)$ — 損失 $L$ を連続パラメータ $\theta$ について最小化。 線形回帰・ロジスティック・SVM・NN すべて。

応用 2:ポートフォリオ最適化

Markowitz の平均-分散最適化。 凸 QP。 制約付き SSDSE 県別投資配分にも応用可。

応用 3:最尤推定

$\hat\theta = \arg\max \log p(D|\theta)$ — 統計推定の中核は連続最適化。

応用 4:強化学習の方策勾配

REINFORCE、 PPO、 SAC — 報酬期待値を最大化する連続パラメータ最適化。

応用 5:ニューラルアーキテクチャ探索 (NAS)

勾配ベース NAS(DARTS)は連続最適化として定式化。

応用 6:制御工学

LQR・MPC — 二次形コスト最小化の連続制御。 自動運転・ロボット制御。

応用 7:構造最適化

建築・機械部品の質量最小化、 強度制約付き。 SQP / 内点法。

応用 8:エネルギーグリッド

発電配分の凸最適化。 LP / QP / 確率計画。

🏋️ 演習問題(8 題)

  1. SSDSE-B-2026 で「総人口 → 県内総生産」 の線形回帰を、 numpy.linalg.lstsq で解け。
  2. 同じ問題を scipy.optimize.minimize(BFGS)で解き、 解析解と比較せよ。
  3. 切片を 0 に固定した「制約付き回帰」 を cvxpy で解け。
  4. 勾配降下法を手書きで実装し、 学習率を 0.001, 0.01, 0.1 で振った結果を比較せよ。
  5. Adam optimizer を numpy で実装し、 同じ問題に適用せよ。
  6. Rosenbrock 関数 (1-x)² + 100(y-x²)² を 5 種類の手法で最小化し、 反復数を比較せよ。
  7. LASSO 回帰 (L1 正則化) を ISTA で実装せよ。 sklearn の Lasso と比較。
  8. Ridge 回帰の閉形式解 $(X^TX + \lambda I)^{-1}X^T y$ を numpy で書け。

🗺 学習ロードマップ

  1. レベル 1 — 関数の最小値・最大値、 1 次微分による停留点。
  2. レベル 2 — 多変数の偏微分、 勾配ベクトル、 ヘッセ行列。
  3. レベル 3 — 凸性の判定、 KKT 条件、 ラグランジュ乗数。
  4. レベル 4 — 勾配降下、 Newton 法、 BFGS。 SciPy/CVXPY の API。
  5. レベル 5 — 確率的勾配降下 (SGD)、 Adam、 学習率スケジュール、 NN の学習。
  6. レベル 6 — 双対性、 内点法、 SDP、 ADMM、 Frank-Wolfe、 鞍点問題、 ミニマックス最適化。

📊 比較表(兄弟手法・選択肢)

主要解法の比較

手法必要情報収束適用
勾配降下1 次勾配線形NN, 大規模 SGD
Newton-Raphson1+2 次2 次低次元、 凸
BFGS / L-BFGS1 次のみ準 2 次中次元、 凸
共役勾配1 次準 2 次巨大スパース
内点法1+2 次多項式時間LP / QP / SDP
シンプレックス線形構造有限LP
Adam1 次 + 履歴準 1 次NN
SGD with momentum1 次 + 慣性確率的NN, 大規模
近接勾配 (ISTA)1 次 + 近接線形LASSO

📖 用語ミニ辞典

用語意味
目的関数最小化/最大化する関数
決定変数最適化する変数
制約変数が満たすべき条件
勾配関数の 1 階偏微分ベクトル
ヘッセ2 階偏微分行列
凸関数局所最適 = 大域最適となる関数
KKT 条件制約付き最適性の必要条件
ラグランジュ乗数制約の影付き価格
双対問題主問題の下界を与える別問題
Newton 法2 次情報を使う反復法
勾配降下1 次情報のみで進む反復法
Adamモメンタム + 適応学習率の SGD 系

🍳 コードレシピ(コピペ用 15 連発)

レシピコード
scipy.optimize.minimize
from scipy.optimize import minimize
res = minimize(f, x0, method='BFGS')
勾配を渡す
minimize(f, x0, jac=grad_f, method='Newton-CG')
ヘッセを渡す
minimize(f, x0, jac=grad_f, hess=hess_f, method='trust-ncg')
制約付き
minimize(f, x0, constraints=[{'type':'ineq', 'fun': g}])
境界付き
minimize(f, x0, bounds=[(0,1),(0,5)], method='L-BFGS-B')
cvxpy 凸最適化
import cvxpy as cp
x = cp.Variable(); prob = cp.Problem(cp.Minimize(cp.square(x-3))); prob.solve()
最小二乗解析解
beta, *_ = np.linalg.lstsq(X, y, rcond=None)
Ridge
from sklearn.linear_model import Ridge
Ridge(alpha=1.0).fit(X, y)
Lasso
from sklearn.linear_model import Lasso
Lasso(alpha=0.1).fit(X, y)
LogisticRegression
from sklearn.linear_model import LogisticRegression
LogisticRegression().fit(X, y)
ロス関数勾配の自動微分
import jax; grad_f = jax.grad(f)
PyTorch Adam
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
SciPy linprog (LP)
from scipy.optimize import linprog
res = linprog(c, A_ub=A, b_ub=b)
基底ニュートン法
for k in range(N):
    x -= np.linalg.solve(hess_f(x), grad_f(x))
収束判定
if np.linalg.norm(grad) < tol: break

⚠️ よくある落とし穴

❌ 局所最適への収束
目的関数が非凸(NN・混合モデル)だと、 初期値次第で局所解に落ちる。 異なる初期値で複数試行し、 最良値を採用、 もしくはグローバル法(差分進化・群知能)を併用。
❌ 勾配の数値不安定性
数値微分で勾配を求めると桁落ちで誤差が大きい。 自動微分(PyTorch・JAX)か解析勾配を使う。
❌ ステップ幅 η の選び方
η が大きすぎると発散、 小さすぎると停止。 Backtracking line search や Adam のような適応学習率が実務的。
❌ 制約の表現ミス
等式 $h=0$ と不等式 $g\le 0$ の符号を間違えると、 解空間そのものがズレる。 数学的に書いてからコードに落とす。
❌ スケーリング
変数のスケールが大きく違うと条件数が悪化し、 1 次法は遅く、 ニュートン法は不安定。 標準化(平均 0・分散 1)してから解く。

❓ よくある質問(FAQ)

Q: 凸とは具体的に何が嬉しい?
A: 局所最適 = 大域最適 が保証される。 つまり「どこから始めても正解に着く」ので、 解法選択も結果解釈もシンプルになる。
Q: 微分不可能な目的関数はどうする?
A: 準勾配 (subgradient)、 近接演算子 (proximal operator)、 座標降下、 ADMM などの分解的手法。 LASSO・Total Variation 正則化はその代表例。
Q: ニュートン法と勾配降下、 どちらが速い?
A: 2 次収束のニュートンが理論的に速いが、 ヘッセ計算とその逆行列が高コスト。 大規模では BFGS・L-BFGS・Adam が現実解。
Q: 学習率はどう決めれば?
A: 損失曲線を見てチューニング。 自動化したいなら Adam・AdamW、 さらに学習率スケジューラ(cosine, step decay)と組合せ。
Q: 最適化と最尤推定の関係は?
A: 最尤推定 = 「対数尤度の最大化」 = 「負対数尤度の最小化」。 つまり統計的推定の中身はほぼすべて連続最適化問題。

📜 歴史と背景

歴史と位置づけ:連続最適化は 17 世紀の微積分(Newton, Leibniz)にまで遡りますが、 現代的な体系化は 20 世紀。 主な節目:

機械学習・統計の 学習は事実上すべて連続最適化問題で、 損失関数の最小化として定式化されます。 凸最適化(Boyd & Vandenberghe, 2004)は本分野の標準教科書。

🗺 概念マップ

連続最適化を中心とした「学習=最適化」の構図:

  [損失/負尤度]─ 最小化 ─► [パラメータ]
        ▲                         │
        │                         ▼
   [データ]──────────► [勾配/ヘッセ]
                                  │
                                  ▼
              (勾配降下/ニュートン/BFGS/SGD/Adam)

   凸 ←─ 線形回帰・ロジスティック・SVM(線形)・LASSO・Ridge ─→ 大域最適
   非凸 ←─ NN・混合モデル・EM・GAN ─→ 局所最適 + 複数初期値

📚 参考文献・出典