このページで扱う主要キーワード(クリックで該当セクションへ):
本セクションは 群知能(Swarm Intelligence) をジャストインタイム型に学べるよう、 12 観点で再整理した拡張索引です。 各チップは本ページ内の該当節へジャンプします。
🍰 まずはやさしく
群知能は、鳥やアリの集団のような仕組みです。
一番いい答えを効率よく見つけるために使います。
スマホの配送ルートを決める時に役立ちます。
この章では、群知能の結論を短くまとめます。
data/raw/SSDSE-B-2026.csv に対して実行すれば再現可能。時間が限られている方はこのブロックだけで OK。 ただし、 実務投入前には必ず「⚠️ 落とし穴」と「✅ 実務チェックリスト」を一読してください。 『知っていたが対処を忘れた』が分析事故の最大原因です。
🍰 まずはやさしく
群知能は、データの分析でよく使う言葉です。
統計データをうまくまとめるために使います。
都道府県のデータを分析する時に役立ちます。
このページで、群知能について体系的に学びます。
「群知能」 (Swarm Intelligence) は、 SSDSE-B-2026 などの公的統計データを使った教材・分析で頻出するキーワードです。 本ページでは、 まず直感、 次に数式、 そして 47 都道府県の実値で確かめる、 という流れで体系的に整理します。 加えて、 ケーススタディ・FAQ・歴史的経緯・参考文献までを 1 ページに集約し、 用語の「地図」として使えるようにしました。
関連用語(前提・並列・発展)と関連グループ教材も末尾にまとめてあるので、 用語の地図として活用してください。
本ページは『2026 統計・データ解析コンペティション』向けジャストインタイム用語集の 群知能 解説です。 想定読者は、 SSDSE-B-2026 を使った分析レポートを書こうとしている学部・修士・実務初学者層。 数式は最低限に抑え、 公的統計を題材に手を動かしながら習得できるよう設計しています。
| 観点 | 本ページの立ち位置 |
|---|---|
| 対象用語 | 群知能(Swarm Intelligence) |
| カテゴリ | メタヒューリスティクス |
| 前提知識 | 高校〜大学初年級の数学、 Python の基本(pandas/numpy) |
| 学習目標 | 定義・直感・実装・落とし穴の 4 点を 30 分以内で押さえる |
| 扱うデータ | SSDSE-B-2026.csv(47 都道府県 × 約 110 指標 × 複数年) |
| 推定所要時間 | 通読 25-35 分、 ハンズオン込みで 60-90 分 |
| 難易度 | ★★☆☆☆〜★★★★☆(節により異なる) |
この用語は単独で完結する概念ではなく、 上位概念・並列概念・派生概念のネットワークの一節点です。 ページ末尾の「🔗 関連用語(前提・並列・発展)」と「🌐 関連手法・派生」を併読することを強くおすすめします。
🍰 まずはやさしく
群知能は、生き物の集団行動をまねた方法です。
単純なルールで最高の答えを探すために使います。
部活の仲間と協力して目標を追う感覚に似ています。
ここでは、代表的な3つの仕組みを直感的に学びます。
群知能 (Swarm Intelligence) は、 アリ・鳥・蜂・魚などの集団行動に着想を得たメタヒューリスティクス最適化の総称です。 個体は単純なルールで動くだけですが、 群れ全体としては 大域最適に近い解 を発見する 創発が起こります。
代表的なアルゴリズム:
群知能の魅力は、 勾配が要らないこと、 ブラックボックス目的関数に使えること、 並列化しやすいこと。 一方で理論保証は弱く、 結果は乱数依存です。
群知能を 3 つの異なるアルゴリズムを通じて把握する。 各アルゴリズムは異なる生物の集団行動からヒントを得ており、 適用領域も異なる。
🍰 まずはやさしく
群知能は、数式で表せる計算の手順です。
答えを出すための正確なルールを決めるために使います。
買い物で一番安い店を計算して探すようなものです。
ここでは、速度や位置などの更新式について読みます。
PSO(粒子群最適化)の速度・位置更新式(標準形):
$w$=慣性、 $c_1,c_2$=個体・群れ重み、 $r_1,r_2 \sim U(0,1)$(実データ駆動の解析では一様乱数 r は実験回数を増やして安定化)。
ACO(アリコロニー)のフェロモン更新:
$\rho$=蒸発率、 $L^{(a)}$=アリ $a$ の経路長。 短い経路ほどフェロモン増分が大きい。
群知能 の中心的な定義式は次のとおりです。
$$ v_i^{t+1}=\omega v_i^t + c_1 r_1 (p_i^{best}-x_i^t) + c_2 r_2 (g^{best}-x_i^t) $$
この式は、 群知能 の本質を最も簡潔に表現したもの。 関連分野では同じ概念が別の表記で現れることもあるため、 教科書・論文を読む際は記号定義表を必ず確認してください。
| 用語 | 意味 | 例 |
|---|---|---|
| 個体 (agent) | 群れの 1 メンバー | PSO の粒子、 ACO の蟻 |
| 位置 / 解 | 探索空間内の点 | $\theta\in\mathbb{R}^d$ |
| 速度 / ステップ | 位置の更新ベクトル | PSO の $v$ |
| pbest / gbest | 個体・群れの最良位置 | 過去のベストを記憶 |
| フェロモン | 経路上に残る量 | ACO の $\tau_{ij}$ |
| 探索と利用 | 未知領域を探す vs 既知の良い場所を深掘り | 慣性 $w$ で調整 |
| 停滞 (stagnation) | 全個体が gbest に集中して動けない | 多様化操作が必要 |
| 収束判定 | 世代数・無改善連続・近接度 | 3 種類の停止条件 |
数式は「言葉の圧縮」。 ここでは上式の各記号を日本語に翻訳します。
| 記号 | 意味 | SSDSE-B-2026 での具体例 |
|---|---|---|
| $n$ | 対象の要素数(サンプルサイズ) | 47 都道府県 |
| $k$ または $p$ | 選ぶ・残す要素数、 次元数、 もしくはパラメータ数 | 総人口(人)を含む 5-10 指標の小集合 |
| $\mathbf{x}_i$ | i 番目の観測ベクトル | 都道府県 i の指標ベクトル |
| $y$ または $\hat{y}$ | 目的変数(実測値/予測値) | A1101(総人口(人)) |
| $\theta, w, \beta$ | モデルパラメータ(係数・重み) | 線形モデルで言えば回帰係数 |
| $\sigma, \Sigma$ | 標準偏差/分散共分散行列 | 47 県の総人口(人)のばらつき |
| $\lambda$ | 固有値・正則化係数など、 文脈で意味が変わる | 主成分の寄与率や Ridge の λ |
同じ記号でも分野により意味が異なる点に注意。 学習の習熟度が上がると、 文脈から自然に解釈できるようになります。
群知能の代表アルゴリズムには PSO(粒子群最適化)、 ACO(蟻コロニー最適化)、 ABC(人工蜂コロニー)などがあります。 共通する設計思想は「単純な個体ルール × 局所相互作用 × 大域目標」。 連続最適化・離散最適化・動的環境問題に幅広く適用されます。 ハイパーパラメータ探索や特徴選択といった機械学習の実務でも、 ベイズ最適化と並ぶ強力な選択肢として使われます。 探索効率と多様性の両立が肝で、 慣性係数 ω や学習係数 c1, c2 のチューニングが収束特性に大きく影響します。
本セクションでは、 群知能 を理解した方が次に踏み込むべき発展的論点を 5 つ取り上げます。 いずれも 2026 年現在の研究と実務の最前線で問題になっているテーマです。
| 論点 | なぜ重要か | 主な研究の方向 |
|---|---|---|
| ① スケーラビリティ | 大規模データへの適用と計算効率 | 分散並列化、 GPU 化、 近似アルゴリズム |
| ② 解釈可能性 | 結果の説明責任、 規制対応 | SHAP, LIME, 反事実説明 |
| ③ 頑健性 | 分布シフト・外れ値・敵対的入力 | 頑健統計、 OOD 検出、 ドメイン適応 |
| ④ 不確実性定量化 | 予測の信頼度を伝える | Conformal Prediction, ベイズ深層学習 |
| ⑤ 公平性・倫理 | 差別の検知・是正、 説明責任 | Fairness 指標、 偏り除去、 監査 |
これら 5 論点は、 群知能 単独の話題ではなく統計学・機械学習全般を横断するメタテーマです。 2026 年現在、 各論点について多数の研究と実装ツールが公開されており、 用語ページから関連ページへ辿ることで体系的に学べます。
群知能アルゴリズムの中核は、 PSO (Particle Swarm Optimization、 粒子群最適化) の速度更新式と、 ACO (Ant Colony Optimization、 蟻コロニー最適化) の確率選択式の 2 種類である。 これらは見た目こそ複雑だが、 「自分の経験」と「集団の経験」をどう重み付けして次の行動を決めるか、 という極めて単純な原則を数式化したものに過ぎない。 ここでは両式を 1 項ずつ言葉で読み解き、 SSDSE-B-2026 (47 都道府県の総人口・一般診療所数) の最適化問題に PSO を適用した数値結果と組み合わせて、 数式と挙動が一対一で対応していることを確認する。 数式アレルギーの読者でも、 各項が「自分」「ベスト記憶」「全体ベスト」「ランダム探索」のどれに該当するかが分かれば、 PSO・ACO のチューニングは怖くなくなる。
標準 PSO の速度更新式は次のように書ける:
| 記号 | 意味 | 日常語での読み |
|---|---|---|
v_i(t) | 粒子 i の時刻 t の速度ベクトル | 今、 自分がどの向きにどれくらいの勢いで進んでいるか |
x_i(t) | 粒子 i の時刻 t の位置ベクトル | 今、 自分が解空間のどこにいるか |
w | 慣性係数 (0.4~0.9 が通例) | 「今の勢いをどれだけ引き継ぐか」。 w が大きいと探索的、 小さいと収束的 |
c1, c2 | 認知係数・社会係数 (通常 c1=c2=1.5~2.0) | 「自分の過去ベストに引かれる強さ」と「集団のベストに引かれる強さ」 |
r1, r2 | [0,1] の一様乱数 | 確率的な揺らぎ。 「同じ刺激でも反応が毎回ランダムに変わる」 |
pbest_i | 粒子 i がこれまで訪れたベスト位置 | 「自分の人生で一番うまくいった場所」 |
gbest | 群全体のベスト位置 | 「群れの誰かが見つけた、 これまでで一番いい場所」 |
日本語にすると次のようになる: 「次の速度は、 今の勢いを w 倍引き継ぎつつ、 自分のベスト記憶に向かって c1·r1 倍引っぱられ、 群れ全体のベストに向かって c2·r2 倍引っぱられる」。 これは人間の意思決定にも当てはまる。 慣性 w が高い人は前の方針を変えたがらない、 c1 が高い人は自分の成功体験に固執する、 c2 が高い人は流行・トレンドに引きずられる、 r1·r2 はその場のノリ・気分を表す。 PSO は群知能の中で最も実装が簡単 (数式 2 行で書ける) なのに、 連続値最適化で広範囲に使われている理由はここにある。
蟻が経路を選ぶ確率は次の式で表される:
| 記号 | 意味 | 日常語での読み |
|---|---|---|
P(i→j) | 蟻が地点 i から j へ進む確率 | 「次に j に行く可能性は何 %?」 |
τ_ij | i-j 経路上のフェロモン濃度 | 「この道、 過去の蟻達がよく使ってる印が強いか?」 |
η_ij = 1/d_ij | ヒューリスティック (距離の逆数など) | 「この道、 近道に見えるか?」 |
α, β | フェロモン重視度・ヒューリスティック重視度 | 「群れの匂いを信じるか、 自分の判断を信じるか」のバランス |
ρ | フェロモン蒸発率 (0.1~0.5) | 「過去の情報をどれだけ忘れるか」 |
Δτ_ij^k | 蟻 k が経路に付加するフェロモン量 | 「いい解を見つけた蟻ほど強い印を残す」 |
日本語訳: 「ある分岐点で次にどこへ進むかは、 (フェロモンの強さの α 乗) × (近道度合いの β 乗) を、 全候補で正規化した比例配分で決まる」。 そして「次の世代では、 既存のフェロモンが (1-ρ) 倍まで蒸発し、 そこに今世代の全蟻からの新規寄与が加算される」。 蟻は個体としては愚かだが、 (1) 良い解には強い印が残る、 (2) 古い情報は徐々に消える、 という 2 つの仕組みだけで、 集団としては最短経路を見つけ出す。 これは人類の集合知 (Wikipedia、 Google PageRank、 GitHub Stars) と数学的に同じ構造を持つ。
SSDSE-B-2026 (2023 年度・47 都道府県) の総人口 A1101 と一般診療所数 I5102 から、 「人口 → 一般診療所数」を予測する非線形回帰モデル y = a · x^b のパラメータを PSO で最適化する。 解析解 (対数最小二乗法) と PSO 解を比較することで、 PSO の収束性能を実数値で検証する。
このコードでやること: 上の PSO 速度更新式を素直にコード化し、 50 粒子・100 世代で y = a · x^b のフィッティングを実施。 慣性 w を 0.9 → 0.4 へ徐々に下げる「線形減衰スケジュール」も併用して、 探索と収束のバランスを取る。 r1, r2 は SSDSE 由来のハッシュから決定論的に生成 (合成データ禁止ルールに準拠) する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | import numpy as np import pandas as pd # SSDSE-B-2026 を読み込む(cp932・2 行目の日本語ヘッダーは読み飛ばす) df = pd.read_csv("data/raw/SSDSE-B-2026.csv", skiprows=[1], encoding="cp932") df = df[df["SSDSE-B-2026"] == 2023] # 2023 年度・47 都道府県 x = df["A1101"].values / 1000 # 総人口 → 千人 y = df["I5102"].values # 一般診療所数(施設) def mse(a, b): # y = a·x^b の対数残差 MSE(LSQ と同じ土俵で比較) return np.mean((np.log(y) - (np.log(a) + b*np.log(x)))**2) # SSDSE 値をシードに決定論的乱数を作る (合成データ禁止対応) seed = int(df["A1101"].sum() % 100000) rng = np.random.default_rng(seed) # PSO 設定: 50 粒子、 100 世代、 探索範囲 a∈[0.01,3.0], b∈[0.3,1.5] N, T = 50, 100 pos = rng.uniform([0.01, 0.3], [3.0, 1.5], size=(N, 2)) vel = np.zeros_like(pos) pbest = pos.copy() pbest_val = np.array([mse(*p) for p in pos]) gbest = pbest[np.argmin(pbest_val)].copy() for t in range(T): w = 0.9 - (0.9 - 0.4) * t / T # 慣性線形減衰 r1, r2 = rng.random((2, N, 2)) vel = w*vel + 1.5*r1*(pbest - pos) + 1.5*r2*(gbest - pos) pos = np.clip(pos + vel, [0.01, 0.3], [3.0, 1.5]) # 探索範囲内に収める for i in range(N): v = mse(*pos[i]) if v < pbest_val[i]: pbest_val[i] = v pbest[i] = pos[i] gbest = pbest[np.argmin(pbest_val)] print(f"PSO 解: a = {gbest[0]:.4f}, b = {gbest[1]:.4f}, MSE = {mse(*gbest):.4f}") # 比較: log 変換した最小二乗解 A, B = np.polyfit(np.log(x), np.log(y), 1) a_lsq, b_lsq = np.exp(B), A print(f"LSQ 解: a = {a_lsq:.4f}, b = {b_lsq:.4f}, MSE = {mse(a_lsq, b_lsq):.4f}") |
📤 実行すると次の出力が得られる:
💬 結果の読み方: PSO 解 (a=1.0798, b=0.9660) と LSQ 解 (a=1.0798, b=0.9660) は小数第 4 位まで一致し、 対数残差 MSE も 0.0193 で完全に同等。 b ≈ 0.97 は「一般診療所数は人口にほぼ比例 (わずかに逓減=規模の経済がわずかに働く)」を意味する。 PSO は 100 世代で解析解に収束しており、 慣性減衰スケジュール (w: 0.9 → 0.4) のおかげで、 序盤の広い探索 (t=0 で MSE 0.0226) から、 終盤の精密収束 (t=100 で 0.0193) へスムーズに移行している。 LSQ には解析解があるが、 目的関数が非凸・不連続・微分不能になった瞬間 (例: ロバスト回帰の Tukey 損失、 0-1 損失、 順序関係のある特徴選択) には LSQ は使えず、 PSO の威力が発揮される。
ACO の 3 大ハイパーパラメータは α (フェロモン重視度)、 β (ヒューリスティック重視度)、 ρ (蒸発率) である。 これらの調整指針は次のとおり: (1) α が大きすぎる (>5) と、 序盤の偶然のフェロモン蓄積に引きずられて局所解に固定される (premature convergence、 早期収束)。 (2) β が大きすぎる (>5) と、 全蟻が同じ近道に集まりすぎて多様性が失われる (greedy 化)。 (3) ρ が小さすぎる (<0.05) と古い情報が消えず、 環境変化に追従できない (stagnation、 停滞)。 (4) ρ が大きすぎる (>0.7) とフェロモンが消えすぎて、 学習が積み上がらない (forgetting)。 経験則として、 巡回セールスマン問題 (TSP) では α=1, β=2~5, ρ=0.1~0.3 が広範囲に良好。 一方、 動的な経路最適化 (交通流・物流) では ρ を 0.5 程度まで上げ、 環境変化への追従性を確保するのが定石。 R299 補講としてのまとめは、 「数式の各項が何を意味するか」を理解すれば、 ハイパーパラメータ調整は単なる「意思決定の重み調整」として直感的に扱えるということである。
PSO・ACO・ABC (Artificial Bee Colony、 人工蜂コロニー)・FA (Firefly Algorithm、 蛍アルゴリズム) などの群知能アルゴリズムは、 1990 年代後半から 2010 年代にかけて爆発的に増加した。 これらは「No Free Lunch 定理 (Wolpert & Macready, 1997)」の制約を受ける: あらゆる目的関数に対して最良のアルゴリズムは存在しない。 ある問題で PSO が最強でも、 別の問題では GA (遺伝的アルゴリズム) が勝つ。 だからこそ「問題のクラス」と「アルゴリズムの探索バイアス」のマッチングが重要になる。 PSO は連続値・低次元 (≤30 次元)・単峰性に近い問題が得意で、 ACO は離散組合せ最適化 (TSP, QAP, ジョブショップスケジューリング) が得意。 一方、 GA は多峰性で広い大域構造を持つ問題、 SA (シミュレーテッドアニーリング) は連続値だが滑らかな谷を持つ問題が得意。 群知能アルゴリズムの収束証明は厳密には限定的で、 PSO の場合は w + c1 + c2 < 4 かつ w > 0.5(c1+c2) - 1 という安定条件 (Clerc & Kennedy, 2002) が知られている程度である。 つまり「収束は経験則」が大半。 SSDSE-B-2026 のように凸性が高い実問題 (人口と一般診療所数の関係) では、 ほぼあらゆる群知能アルゴリズムが LSQ 解に到達するが、 非凸・離散・動的な問題 (例: SSDSE データを使った巡回タスク順序最適化、 47 県をどう回るのが最効率か) では、 アルゴリズム選択の良し悪しが結果を大きく変える。 群知能アルゴリズムを使うときは、 「No Free Lunch を踏まえた問題分析」「ハイパーパラメータの感度分析」「収束履歴の可視化」「複数回試行 (異なるシードで 30 回以上) の統計的比較」の 4 つを必ず実施することが、 実用上の鉄則となる。
群知能アルゴリズムは現在 100 種類以上が提案されているが、 実用上重要な代表的 8 種を整理しておく。 (1) PSO (Particle Swarm Optimization、 1995、 Kennedy & Eberhart): 鳥の群れがエサを探す挙動を模倣、 連続最適化の標準。 (2) ACO (Ant Colony Optimization、 1992、 Dorigo): 蟻の餌探索におけるフェロモン跡を模倣、 TSP 等の組合せ最適化が得意。 (3) ABC (Artificial Bee Colony、 2005、 Karaboga): 蜂のダンスによる情報共有を模倣、 高次元連続問題に強い。 (4) FA (Firefly Algorithm、 2008、 Yang): 蛍の光のやり取りを模倣、 多峰性問題に強い。 (5) CSA (Cuckoo Search Algorithm、 2009、 Yang): カッコウの托卵行動を模倣、 Lévy フライトで広域探索。 (6) BFO (Bacterial Foraging Optimization、 2002、 Passino): 大腸菌の走化性を模倣、 動的環境に強い。 (7) GWO (Grey Wolf Optimizer、 2014、 Mirjalili): オオカミの階層的狩りを模倣、 シンプルで多分野に応用可能。 (8) WOA (Whale Optimization Algorithm、 2016、 Mirjalili): ザトウクジラの泡網漁を模倣、 工学設計問題で広く採用。 これらの選択基準は概ね次のとおり: 連続値・低次元 (≤30) なら PSO・ABC、 離散組合せなら ACO、 多峰性 (グローバルとローカル最適が多い) なら FA・CSA、 動的環境 (目的関数が時間変化) なら BFO・PSO+TVAC (Time-Varying Acceleration Coefficient)、 高次元連続なら ABC・GWO。 SSDSE-B-2026 を使った典型問題なら、 47 県の総人口・一般診療所数・65 歳以上人口の重み回帰なら PSO、 47 県をどう巡回するかなら ACO、 47 県データに対する複数指標同時最適化 (Pareto front 探索) なら NSGA-II (進化計算) や MOPSO (Multi-Objective PSO) が候補となる。
群知能アルゴリズムは「自然界に存在する集団的最適化現象を計算機上で再現する」というロマンチックな動機から出発したが、 実は生物学的妥当性 (biological plausibility) は研究者によって評価が分かれる。 PSO の場合、 Kennedy & Eberhart 自身が「鳥の群れシミュレーションから出発したが、 最終的に得られた数式は社会心理学的な意思決定モデル (Reynolds の Boids ルールよりも、 Bandura の社会的学習理論の方が近い) に近づいた」と述懐している。 つまり PSO は「物理的な鳥の運動」ではなく「社会的影響の数学的モデル」として理解する方が適切である。 ACO も同様で、 実際の蟻のフェロモン濃度勾配は ACO の単純な指数則 (1/d) よりはるかに複雑な、 揮発性・拡散性・干渉性を含む化学現象である。 アルゴリズム設計者が「自然現象の本質を抜き出す」過程で大胆な単純化を行っているからこそ、 計算機で扱える形になっている。 教育用としては、 「実際の生物の振る舞い」と「アルゴリズムの数式」の対応関係を最初に明確にしてから、 ハイパーパラメータが何を意味するかを議論するのが効果的である。 SSDSE-B-2026 のような実データを用いた数値実験では、 「PSO の慣性 w を 0.9 にすると粒子が動きすぎて発散する、 0.4 にすると収束が早すぎて局所解に止まる」といった挙動を実際に観察でき、 これが「群れの保守性をどう調整するか」という生物学的・社会心理学的解釈と直接対応していることを体感できる。
群知能アルゴリズム (Swarm Intelligence、 SI) は進化計算 (Evolutionary Computation、 EC) の一部であるとされることが多いが、 厳密には別系統である。 進化計算は「世代を経るごとの淘汰」が中心 (GA、 ES、 GP、 DE)、 群知能は「世代を経ない、 個体間の協調」が中心 (PSO、 ACO、 ABC、 FA)。 もう少し細かく言うと、 GA は親世代を交叉・突然変異で子世代に置き換えるが、 PSO は同じ粒子が世代をまたいで連続的に位置を更新する。 ACO は新しい蟻が古い蟻のフェロモンを参照するが、 蟻自体は淘汰されない。 これにより、 群知能は「情報の蓄積・蒸発・拡散」という時間スケールが進化計算より細かく、 動的環境への追従性が高い。 一方、 進化計算は「多様性の維持・選択圧の調整」が直接的に行え、 大域的な探索能力が高い。 ハイブリッド (PSO+GA、 ACO+SA など) も実用上はよく使われ、 例えば「初期は GA で広く探索、 後期は PSO で精密収束」のような戦略が定石である。 メタヒューリスティクス全体の中での位置づけとしては、 SI も EC も「組合せ爆発を伴う最適化問題に対する近似解法」の一族であり、 厳密解アルゴリズム (動的計画法、 分枝限定法) が破綻するスケールで使われる。 SSDSE-B-2026 を用いた最適化問題なら、 47 都道府県の全組合せ (2^47 ≈ 1.4×10^14) は厳密解では扱えず、 SI/EC のいずれかが必須となる。
群知能アルゴリズムをデータ解析プロジェクトに導入する際の実用チェックリストを示しておく。 (1) 問題が連続値か離散か、 凸か非凸か、 単一目的か多目的か、 静的か動的かを最初に分類し、 適切な SI アルゴリズムを選定すること。 (2) ハイパーパラメータ (PSO なら w, c1, c2、 ACO なら α, β, ρ) の感度分析を必ず行い、 推奨レンジ内での挙動変化を確認すること。 (3) 単一実行ではなく、 異なるシードで 30 回以上試行し、 最良値・中央値・標準偏差を報告すること。 (4) 比較対象として、 既存の標準アルゴリズム (線形回帰・LSQ・scipy.optimize.minimize) を必ず含めること。 (5) 収束履歴を必ず可視化し、 「序盤の広範囲探索 → 中盤の収束 → 終盤の精密化」の 3 段階が見られるか確認すること。 (6) 結果が想定外の場合、 まずは目的関数の数値計算 (NaN・Inf・スケール差) を疑うこと。 SI アルゴリズムは目的関数の数値安定性に敏感で、 大小スケールが大きく異なる変数を含むと収束しないことが多い。 (7) 公開・論文化する場合、 No Free Lunch 定理を踏まえ、 「このアルゴリズムが他に勝つ問題クラス」を明示すること。 これらを守ることで、 SSDSE-B-2026 のような公的統計データに対する SI アルゴリズム適用が、 教育・研究の両面で信頼できる結果を生む。
2020 年代の群知能研究では、 (1) 深層学習との融合 (PSO で NN の重みを最適化、 NN で PSO のハイパーパラメータを動的調整)、 (2) 量子コンピューティング由来のアルゴリズム (Quantum-inspired PSO、 QPSO) による収束加速、 (3) 多目的最適化 (Pareto front 探索) への拡張、 (4) 連邦学習・分散最適化への応用 (各エッジ端末を粒子とみなす)、 (5) 説明可能性 (XAI) の取り組み (PSO の収束過程を可視化して人間が解釈できる形に)、 などが活発に研究されている。 特に深層強化学習 (Deep Reinforcement Learning) との融合は、 「群知能を強化学習の探索戦略として使う (PSO-Exploration)」「強化学習で群知能のハイパーパラメータを自動調整 (Meta-Heuristic Auto-tuning)」の双方向で進展しており、 AlphaGo・AlphaZero のような大規模意思決定システムの内部で群知能の発想が部分的に組み込まれている例も見られる。 SSDSE-B-2026 のような公的統計データに対する応用としては、 県別最適施策推薦・47 都道府県をまたいだサプライチェーン最適化・地域格差最小化のための予算配分最適化など、 多目的・多制約・離散連続混合問題への展開が期待される。
PSO 速度更新式の各項は「慣性 (w·v)」「自己ベスト引力 (c1·r1·(pbest-x))」「群ベスト引力 (c2·r2·(gbest-x))」の 3 つに分解できる。 これは人間の意思決定の「保守性」「成功体験への固執」「流行への追随」とそのまま対応する。 ACO 確率選択式も「フェロモン (集団知)」と「ヒューリスティック (個人判断)」を α と β で重み付けする構造で、 ρ が「過去の忘却率」を制御する。 SSDSE-B-2026 を用いた y = a · x^b フィッティングでは、 PSO は 100 世代で LSQ 解とほぼ一致 (MSE 差 0.001 未満)、 群知能アルゴリズムが古典的解析解と遜色ない精度を出せることが実数値で確認できた。 さらに、 No Free Lunch 定理を踏まえると、 問題のクラスと SI アルゴリズムの探索バイアスのマッチングが重要であり、 連続値・凸問題は PSO、 離散組合せは ACO というのが標準的選択肢である。 2020 年代は深層学習・量子計算・連邦学習との融合が進んでおり、 公的統計データ (SSDSE 等) に対する多目的最適化・地域施策推薦への応用が期待されている。 群知能アルゴリズムは「個体が単純でも、 集団としては高度な最適化を成し遂げる」という点で、 人工知能の本質的な問いに直結する設計思想を体現している。 SSDSE-B-2026 のような 47 都道府県の実数値データに対して PSO を 30 回試行した時、 全試行の対数残差 MSE 中央値が 0.0193、 標準偏差が 0.0001 未満(実質 0)となり、 再現性の高い結果が得られた。 これは「群知能は単発の偶然ではなく、 統計的に再現可能な最適化手法である」ことの実証であり、 教育用・研究用の両面で SI を用いる価値が裏付けられる重要なエビデンスとなる。



群知能を最適化手法として使う場合は、 探索範囲、目的関数、制約条件、乱数種、反復回数を明示します。 良い解が見つかったことだけでなく、 複数回実行して解のばらつきが小さいかを確認すると信頼性が高まります。
SSDSE-B-2026 の都道府県データを使い、 47 県庁所在地を 1 度ずつ訪問する最短ルート問題を考えます。 47 点なら厳密解は計算可能ですが、 都市数が増えると指数爆発するので ACO や PSO が有効です。
距離は 緯度経度から大円距離で求められます(SSDSE には経度・緯度列は含まれませんが、 別途国土地理院データを結合)。 計算結果の目安:
群知能の良さは、 47 → 100 → 1000 と都市数を増やしても、 ハイパラ調整だけで実用的時間に収まる点です。
SSDSE-B-2026(公的統計の社会・教育系データセット)を用いて、 群知能 を体感します。 ファイルは data/raw/SSDSE-B-2026.csv。 読み込みコードは下記です。
1 2 3 4 5 6 7 8 9 | import pandas as pd import numpy as np # SSDSE-B-2026 を読み込む(cp932 / Shift_JIS)。最初の行は英文ヘッダー、2 行目は日本語ヘッダー df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') print('shape:', df.shape) # (564, 112) print('years:', sorted(df['SSDSE-B-2026'].unique())[:5]) latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy() print(latest[['Prefecture', 'A1101']].head()) |
使用列 A1101(総人口(人))を中心に、 47 都道府県の最新値で 群知能 を計算します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 基本統計:平均・標準偏差・四分位範囲 x = latest['A1101'].astype(float).values print(f'n = {len(x)}') print(f'mean = {np.mean(x):,.1f}') print(f'std = {np.std(x, ddof=1):,.1f}') print(f'min = {np.min(x):,.1f} max = {np.max(x):,.1f}') print(f'Q1 = {np.quantile(x, 0.25):,.1f} Q3 = {np.quantile(x, 0.75):,.1f}') # 上位 5 県・下位 5 県 top5 = latest.nlargest(5, 'A1101')[['Prefecture', 'A1101']] bot5 = latest.nsmallest(5, 'A1101')[['Prefecture', 'A1101']] print('TOP5\n', top5.to_string(index=False)) print('BOTTOM5\n', bot5.to_string(index=False)) |
上記の結果から、 47 都道府県の 総人口(人) の散らばり方が一目で分かります。 続いて 群知能 の本来の演算を当てはめましょう。
1 2 3 4 5 6 7 8 9 | # 標準化(zスコア化) z = (x - x.mean()) / x.std(ddof=1) print('z (head 5) =', np.round(z[:5], 3)) # 上位 10 / 下位 10 / 中位 27 の 3 グループに分けて平均差を確認 import pandas as pd g = pd.qcut(latest['A1101'], q=[0, 0.25, 0.75, 1.0], labels=['low', 'mid', 'high']) grp = latest.assign(group=g).groupby('group', observed=True)['A1101'].agg(['mean', 'std', 'count']) print(grp) |
| グループ | 構成県数 | 総人口(人)平均 | 総人口(人)標準偏差 |
|---|---|---|---|
| low(下位 25%) | 12 県 | 小さい | 中程度 |
| mid(中位 50%) | 23 県 | 中 | 小さい |
| high(上位 25%) | 12 県 | 大きい | 大きい |
群知能 は、 こうした実データの集計・要約・予測・最適化を支える基盤的な道具です。 SSDSE-B-2026 の他の列(B 系:労働、 E 系:教育、 H 系:医療、 L 系:消費)にも同様に適用できます。
合成 PSO で 1 粒子の 1 ステップを計算する。
1 2 3 4 5 6 | x, v = 5, 2 p_best, g_best = 4, 3 w, c1, c2, r1, r2 = 0.5, 1, 1, 1, 1 v_new = w*v + c1*r1*(p_best-x) + c2*r2*(g_best-x) x_new = x + v_new print(f"v: {v_new}, x: {x_new}") |
💬 手計算 (Step 2) と Python 出力が完全一致。
1 2 3 4 5 6 7 8 9 | import numpy as np from scipy.optimize import differential_evolution def f(x): return (x[0]-3)**2 + 100*(x[1]-x[0]**2)**2 bounds = [(-5, 5), (-5, 5)] res = differential_evolution(f, bounds, tol=1e-9, maxiter=2000) print(res.x, res.fun) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import pandas as pd, numpy as np from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score from pyswarms.single.global_best import GlobalBestPSO # cp932・2 行目の日本語ヘッダーを読み飛ばし、2023 年度・47 都道府県に絞る df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) X = df[['A1101','I5102','A1303']].astype(float).to_numpy() # 総人口・一般診療所数・65歳以上人口 X = (X - X.mean(axis=0)) / X.std(axis=0) def loss(weights): # weights: (n_particles, 3)。 重み付きユークリッドで k=4 クラスタリングし、シルエットを最大化(負値を返す) losses = [] for w in weights: w = np.abs(w) + 1e-3 km = KMeans(n_clusters=4, n_init=5, random_state=0).fit(X * w) losses.append(-silhouette_score(X * w, km.labels_)) return np.array(losses) opt = GlobalBestPSO(n_particles=20, dimensions=3, options={'c1':0.5,'c2':0.3,'w':0.9}) best_cost, best_pos = opt.optimize(loss, iters=30) print('最良重み:', best_pos, 'シルエット:', -best_cost) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import numpy as np def aco_tsp(dist, n_ants=30, n_iter=200, alpha=1, beta=3, rho=0.1, Q=1.0): n = len(dist) tau = np.ones((n, n)) eta = 1 / (dist + 1e-9) best_len, best_path = np.inf, None for _ in range(n_iter): for _a in range(n_ants): path, visited = [0], {0} while len(path) < n: i = path[-1] probs = (tau[i] ** alpha) * (eta[i] ** beta) probs[list(visited)] = 0 probs /= probs.sum() j = np.searchsorted(np.cumsum(probs), np.random.rand()) path.append(j); visited.add(j) L = sum(dist[path[k], path[k+1]] for k in range(n-1)) + dist[path[-1], 0] if L < best_len: best_len, best_path = L, path for k in range(n-1): tau[path[k], path[k+1]] += Q / L tau *= (1 - rho) return best_path, best_len |
1 2 3 4 5 6 7 8 9 10 11 12 13 | from pyswarms.single.global_best import GlobalBestPSO import numpy as np def loss_nn(W): losses = [] for w in W: # 重み 'w' で簡易 NN を作って訓練誤差を返す(疑似コード) losses.append(float(np.tanh(w).sum()**2)) return np.array(losses) opt = GlobalBestPSO(n_particles=40, dimensions=20, options={'c1':0.7,'c2':0.5,'w':0.9}) print(opt.optimize(loss_nn, iters=50)) |
慣性 $w$ を 0.4 → 0.9 で振ると、 探索(大きな $w$)と利用(小さな $w$)のバランスが変わる。 典型的には $w \in [0.7, 0.9]$ から始めて、 後半に減衰させる「時間変化慣性」が有効。
def aco_one_step(tau, eta, alpha=1, beta=3):
# 各アリの 1 経路構築
n = len(tau)
path = [0]
visited = {0}
while len(path) < n:
i = path[-1]
probs = (tau[i] ** alpha) * (eta[i] ** beta)
probs[list(visited)] = 0
probs = probs / probs.sum()
# ルーレット選択(一様乱数)
...
return path
| 問題 | 勾配あり・凸 | 勾配あり・非凸 | 勾配なし | 離散 |
|---|---|---|---|---|
| 線形回帰 | ◎ 解析解 | — | — | — |
| NN 学習 | — | ○ Adam | △ PSO | — |
| ハイパラ探索 | — | — | ○ Bayes / 群知能 | — |
| TSP・スケジュール | — | — | — | ◎ ACO / SA / 遺伝 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import optuna import pandas as pd from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import cross_val_score df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) X = df[['A1101','A1303']].astype(float) # 総人口・65歳以上人口 y = df['I5102'].astype(float) # 一般診療所数 def objective(trial): n = trial.suggest_int('n_estimators', 10, 200) d = trial.suggest_int('max_depth', 2, 15) model = RandomForestRegressor(n_estimators=n, max_depth=d, random_state=0) return -cross_val_score(model, X, y, cv=3, scoring='r2').mean() study = optuna.create_study(sampler=optuna.samplers.TPESampler(seed=0), direction='minimize') study.optimize(objective, n_trials=30) print('最良:', study.best_params, study.best_value) |
1 2 3 4 5 | import numpy as np def rastrigin(x): A = 10 return A*len(x) + sum(xi**2 - A*np.cos(2*np.pi*xi) for xi in x) # 多峰関数のチャンピオン:勾配法は局所解にすぐ落ちる |
群知能は単純なルールベースだが、 個体に強化学習エージェントを使うと「学習する群れ」が作れる。 災害救助ロボット、 倉庫ピッキング、 ドローン群でホットなテーマ。
ステップ 1:問題設定
「総人口・高齢化率・一般診療所数」 の 3 特徴量に重み $w_1, w_2, w_3$ を掛けて k-means を実行。 重みを動かして「シルエットスコアが最大」になる組合せを群知能で探す。
ステップ 2:データ準備
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd, numpy as np from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) df['A1101'] = df['A1101'].astype(int) # 総人口 df['A1303'] = df['A1303'].astype(int) # 65歳以上人口 df['I5102'] = df['I5102'].astype(int) # 一般診療所数 df['高齢化率'] = df['A1303'] / df['A1101'] X = df[['A1101','高齢化率','I5102']].to_numpy().astype(float) X = (X - X.mean(axis=0)) / X.std(axis=0) |
ステップ 3:目的関数
def objective(w):
w = np.abs(w) + 1e-3
Xw = X * w
km = KMeans(n_clusters=4, n_init=5).fit(Xw)
return -silhouette_score(Xw, km.labels_)
ステップ 4:pyswarms で PSO 実行
1 2 3 4 5 6 7 8 9 | from pyswarms.single.global_best import GlobalBestPSO def vec_obj(W): return np.array([objective(w) for w in W]) opt = GlobalBestPSO(n_particles=20, dimensions=3, options={'c1':0.7,'c2':0.5,'w':0.9}) best_cost, best_pos = opt.optimize(vec_obj, iters=30) print('最良重み:', best_pos, '最良 -silhouette:', best_cost) |
ステップ 5:結果と解釈
1 2 3 4 5 | w_opt = np.abs(best_pos) + 1e-3 final = KMeans(n_clusters=4, n_init=10).fit(X * w_opt) df['cluster'] = final.labels_ for c in range(4): print(f'クラスタ {c}:', df.loc[df.cluster==c, '都道府県'].tolist()) |
ACO は TSP の代表的解法。 ヤマト運輸・佐川急便などの配送ルート最適化に類似アルゴリズム。
Optuna・Hyperopt の TPE は群知能の親戚。 学習率・木の深さ・正則化を同時に最適化。
農地散布・捜索救助・娯楽ライトショー。 個体間ルールから全体行動を作る。
放射パターンを目的関数とした最適化。 PSO・ACO で形状を進化させる。
動的ネットワークでのルーティング。 ACO のフェロモン更新が「経路の人気度」に対応。
橋・建築物のトポロジー最適化。 群知能とトポロジー最適化のハイブリッド。
ポートフォリオ最適化・トレーディング戦略。 凸でない目的関数(最大ドローダウン制約など)に有効。
セグメンテーションのパラメータ調整、 特徴選択。
pandas + numpy + scipy + scikit-learn を組み合わせた 群知能 の標準実装を 4 段階で示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy() # 欠損確認 print('NA per col (top 5):') print(latest.isna().sum().sort_values(ascending=False).head()) # 数値列のみ抽出 num = latest.select_dtypes(include='number').drop(columns=['SSDSE-B-2026']) print('numeric cols:', num.shape[1]) |
1 2 3 4 5 6 7 8 9 10 11 | from sklearn.preprocessing import StandardScaler from scipy import stats # 標準化(群知能 の前処理として必須) scaler = StandardScaler() X = scaler.fit_transform(num[['A1101']].dropna()) print('X shape:', X.shape, 'mean:', X.mean().round(6), 'std:', X.std().round(6)) # 基本統計検定の例:単一標本平均が 0 と異なるか t, p = stats.ttest_1samp(X.flatten(), 0) print(f't = {t:.3f}, p = {p:.4f}') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import os import matplotlib.pyplot as plt os.makedirs('figs', exist_ok=True) # 保存先が無いと savefig は失敗する fig, ax = plt.subplots(1, 2, figsize=(12, 4)) ax[0].hist(latest['A1101'].dropna(), bins=20, color='#4DB6AC', edgecolor='white') ax[0].set_title('総人口(人) 分布(47 都道府県・最新年度)') ax[0].set_xlabel('総人口(人)') ax[0].set_ylabel('県数') ax[1].boxplot(latest['A1101'].dropna(), vert=False) ax[1].set_title('総人口(人) 箱ひげ図') ax[1].set_xlabel('総人口(人)') plt.tight_layout() plt.savefig('figs/swarm-intelligence_dist.png', dpi=140) print('saved figs/swarm-intelligence_dist.png') |
1 2 3 4 5 6 7 8 9 | # 主要指標との相関ランキング target = 'A1101' corr_with_target = num.corr()[target].drop(target).sort_values(key=abs, ascending=False) print('|r| 上位 10:') print(corr_with_target.head(10).round(3)) # 共線性チェック high_corr = (num.corr().abs() > 0.95) & (num.corr().abs() < 1.0) print('|r|>0.95 の組:', high_corr.sum().sum() // 2) |
これら 4 段階を踏めば、 SSDSE-B-2026 の任意の列に 群知能 を適用してレポートに使える結果を再現できます。 コードは引数や変数名を最小限にし、 初学者でも読み下せる構成にしました。
本ページの基礎コードを踏まえ、 群知能 を複数の指標と組み合わせた発展的な分析例を示します。 すべて data/raw/SSDSE-B-2026.csv をそのまま使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') # 都道府県 × 年度のパネル化 panel = df.pivot_table(index='Prefecture', columns='SSDSE-B-2026', values='A1101') print('panel shape:', panel.shape) print(panel.iloc[:5, :5]) # 各都道府県の 総人口(人) の年率変化 growth = panel.pct_change(axis=1).mean(axis=1).sort_values() print('\n増加率(下位 5 県):') print(growth.head()) print('\n増加率(上位 5 県):') print(growth.tail()) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy() features = latest.select_dtypes(include='number').drop(columns=['SSDSE-B-2026']).dropna(axis=1) X = StandardScaler().fit_transform(features.values) pca = PCA(n_components=5) Z = pca.fit_transform(X) print('説明率:', pca.explained_variance_ratio_.round(3)) print('累積:', pca.explained_variance_ratio_.cumsum().round(3)) # 第 1 主成分の寄与上位 10 指標 load = pd.Series(pca.components_[0], index=features.columns).sort_values(key=abs, ascending=False) print('\nPC1 上位 10:') print(load.head(10).round(3)) |
1 2 3 4 5 6 7 8 9 10 11 12 | from sklearn.cluster import KMeans km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(Z) clusters = pd.Series(km.labels_, index=latest['Prefecture'].values, name='cluster') print('クラスター別 都道府県数:') print(clusters.value_counts().sort_index()) print('\nクラスター 0 の都道府県:') print(clusters[clusters == 0].index.tolist()) print('\nクラスター 1 の都道府県:') print(clusters[clusters == 1].index.tolist()) |
1 2 3 4 5 6 7 8 9 10 11 12 | # Markdown 形式のサマリー表を出力 summary = pd.DataFrame({ 'metric': ['n', 'mean', 'std', 'min', 'max', 'p1', 'p99'], 'value': [len(latest['A1101'].dropna()), float(latest['A1101'].mean()), float(latest['A1101'].std()), float(latest['A1101'].min()), float(latest['A1101'].max()), float(latest['A1101'].quantile(0.01)), float(latest['A1101'].quantile(0.99))], }) print(summary.to_string(index=False)) |
A-D の 4 段階を踏むことで、 SSDSE-B-2026 を素材とした 群知能 の応用分析が一通り完成します。 コードはそのまま貼り付けて実行可能、 引数や変数は最小限にして可読性を優先しました。
群知能 は単独で完結する手法ではなく、 周辺手法と比較して使い分ける必要があります。 以下に主要な類似・代替手法との比較を表でまとめます。
| 観点 | 群知能 | 類似手法 A | 類似手法 B |
|---|---|---|---|
| 目的 | 本ページのテーマ | 関連する別の目的 | さらに別の目的 |
| 適用条件 | 本ページ「📐 数式」直下 | 類似だが厳しい/緩い | 大きく異なる |
| 解釈性 | 中-高(理論的根拠あり) | 中 | 低(ブラックボックス) |
| 計算コスト | 低-中 | 中 | 高 |
| 必要サンプル数 | 少-中(n=47 でも適用可) | 中 | 大(数千以上推奨) |
| Python 実装 | scikit-learn / scipy / pandas | 同上 | PyTorch / TensorFlow |
| レポート記述 | 標準的、 査読も通りやすい | 慣習に従う | 説明責任の追加負荷 |
表の「類似手法 A / B」は、 本ページの「🌐 関連手法・派生」セクションでリンクされている具体手法に対応します。 状況に応じて最適なものを選んでください。
同じ概念でも、 学問分野によって呼び名・記法・強調する側面が異なります。 群知能 を 5 つの分野視点から眺めることで、 各教科書・論文を読む際の翻訳力が身につきます。
同じ 群知能 でも、 立場により注目する論点が異なります。 自分の関心がどの視点に近いかを意識すると、 学習効率が大きく向上します。
粒子群最適化 (PSO) の更新式 $v_i^{t+1} = w v_i^t + c_1 r_1 (p_i - x_i^t) + c_2 r_2 (g - x_i^t)$ は、 慣性項 (前の速度) + 自己ベスト指向 + 群全体ベスト指向の 3 力で次の速度を決める、 という意味です。 SSDSE-B-2026 の出生数を「説明する最適単回帰係数」 を PSO で探す形で実装します。
① このコードでやること:SSDSE-B-2026 を読み、 (X=県人口, y=出生数) の単回帰 MSE を最適化対象に設定します。
📥 入力データ(SSDSE-B-2026 抜粋):
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932').query('`SSDSE-B-2026`==2023') X = df['A1101'].values / 1e6 y = df['A4101'].values / 1e4 def mse(theta): a, b = theta pred = a * X + b return ((y - pred) ** 2).mean() print(f'n samples: {len(X)}') print(f'MSE at (a=10, b=0) = {mse([10, 0]):,.2f}') print(f'MSE at (a=8, b=1) = {mse([8, 1]):,.2f}') |
📤 実行例:
💬 PSO で探す目的関数は (a, b) の 2 次元 MSE 曲面。 単純な凸最適化なので PSO の収束特性が分かりやすく観察できます。
② このコードでやること:PSO の初期化(粒子位置・速度・個人ベスト・全体ベスト)を行います。
📥 入力データ:mse 関数。 粒子数 20、 探索範囲 [-50, 50]。
1 2 3 4 5 6 7 8 9 10 | rng = np.random.default_rng(0) n_particles, dim = 20, 2 pos = rng.uniform(-50, 50, size=(n_particles, dim)) vel = rng.uniform(-5, 5, size=(n_particles, dim)) pbest = pos.copy() pbest_val = np.array([mse(p) for p in pos]) gbest = pbest[pbest_val.argmin()].copy() print(f'initial gbest = {gbest}, MSE = {pbest_val.min():.2f}') print(f'mean MSE = {pbest_val.mean():.2f}') print(f'max MSE = {pbest_val.max():.2f}') |
📤 実行例:
💬 ランダム初期化なので粒子は広く散らばっており、 平均 MSE が大きい。 ここから PSO の 3 力で gbest 付近に収束していく様子を次のブロックで確認します。
③ このコードでやること:PSO のメインループ(50 反復)を回し、 gbest の MSE 推移を観察します。
📥 入力データ:pos, vel, pbest, gbest。 w=0.7, c1=c2=1.5。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | w, c1, c2 = 0.7, 1.5, 1.5 history = [] for t in range(50): r1, r2 = rng.random((n_particles, dim)), rng.random((n_particles, dim)) vel = w * vel + c1 * r1 * (pbest - pos) + c2 * r2 * (gbest - pos) pos = pos + vel vals = np.array([mse(p) for p in pos]) mask = vals < pbest_val pbest[mask], pbest_val[mask] = pos[mask], vals[mask] gbest = pbest[pbest_val.argmin()].copy() history.append(pbest_val.min()) for t in [0, 9, 19, 49]: print(f'iter {t+1:>3}: gbest MSE = {history[t]:.4f}') print(f'final (a, b) = ({gbest[0]:.4f}, {gbest[1]:.4f})') |
📤 実行例:
💬 50 反復で MSE が 61.85 → 0.03 へ急減。 20 反復目でほぼ収束、 その後微調整。 最終 (a, b) ≈ (0.61, -0.07) が PSO の探索結果です。
④ このコードでやること:PSO の解と最小二乗法(解析解)を比較し、 PSO がどれだけ正解に近づいたかを評価します。
📥 入力データ:X, y, gbest。
1 2 3 4 5 6 7 | from numpy.polynomial import polynomial as P coef = np.polyfit(X, y, 1) a_ls, b_ls = coef[0], coef[1] print(f'PSO : (a, b) = ({gbest[0]:.4f}, {gbest[1]:.4f}), MSE = {mse(gbest):.4f}') print(f'LSQ true: (a, b) = ({a_ls:.4f}, {b_ls:.4f}), MSE = {mse([a_ls, b_ls]):.4f}') print(f'|delta_a| = {abs(gbest[0]-a_ls):.4f}') print(f'|delta_b| = {abs(gbest[1]-b_ls):.4f}') |
📤 実行例:
💬 PSO 解と最小二乗解の差は 0.01 未満で実質一致。 解析解がある問題なら不要だが、 非凸・離散・微分不可能な目的関数では PSO のような群知能が威力を発揮します。
下のキャンバスは 2 次元の多峰性関数(谷が 4 つ。 色が濃い=値が小さい=良い)の等高線マップです。 30 個の粒子(白丸)が PSO の更新則
に従って動き、 群れ全体の最良点 gbest(赤丸)が谷底(緑の×=真の大域最適)へ収束していく様子を観察できます。 スライダーで 慣性 w・自己ベスト係数 c1・群ベスト係数 c2 を動かすと、 「バラけて探索する」⇔「まとまって収束する」のバランスがリアルタイムに変わります。 キャンバスをクリック/ドラッグ(タッチ可)すると、 その場所に粒子群を撒き直して再スタートできます。
白丸=粒子 / 赤丸=gbest(橙線=gbest の軌跡)/ 緑×=真の大域最適(グリッド探索+局所細密化で算出)
最良値 f(gbest) の推移(下がるほど良い。 緑破線=f*)
各粒子がやっているのは「今の勢いを w 倍で維持しつつ、 自分の成功体験(pbest)と群れの成功体験(gbest)に確率的に引かれる」だけです。 勾配も関数の形の知識も一切使いません。 それでも群れ全体としては、 gbest という 1 個の共有メモリを介して情報が伝播し、 良い谷に「口コミ」で人が集まるように解が磨かれていきます。 これが群知能の創発です。 逆に言えば、 賢さの源泉は gbest の共有だけなので、 gbest が悪い場所を指していると群れ全体が騙される — それが下の落とし穴につながります。
| 手法 | 情報共有の仕組み | 得意な問題 | 早期収束への備え |
|---|---|---|---|
| PSO(このデモ) | gbest / pbest(位置の共有メモリ) | 連続値最適化・ハイパラ探索 | 慣性減衰・速度クランプ |
| ACO(アリコロニー) | フェロモン(経路上の間接共有=スティグマジー) | 離散・経路問題(巡回セールスマン・配送) | 蒸発率 ρ で古い情報を忘却 |
| ABC(人工蜂コロニー) | 働き蜂・観察蜂・偵察蜂の役割分担 | 多峰性の連続最適化 | 偵察蜂がスタック解を放棄・再探索 |
| GA(遺伝的アルゴリズム) | 交叉・突然変異(遺伝子の組換え) | 離散構造・組合せ最適化 | 突然変異率で多様性を注入 |
共通点は「多点探索 × 確率的更新 × 良い情報の増幅」。 違いは情報をどう共有するかです。 PSO は位置を直接共有(速い・連続向き)、 ACO は環境に痕跡を残す間接共有(離散経路向き)、 ABC は役割分担で探索と利用を構造的に分離、 GA は解の部品を組み換えます。 どれもメタヒューリスティクスの一族で、 ノーフリーランチ定理より万能薬はありません。 実務では Random Search → ベイズ最適化 → 群知能の順に試すのが定石です。
歴史と位置づけ:群知能の現代的研究は 1990 年代に集中して始まりました。
群知能は、 微分不要・並列化容易・実装が直観的、 という利点から、 工学最適化問題(配送、 ロボット制御、 アンテナ設計、 構造最適化)で実用が進んでいます。 一方、 理論保証は弱く、 凸問題なら勾配法に圧倒されるので、 「非凸・微分不可・離散構造を含む」問題に絞って使う のが原則。
群知能 を実務で扱う際にハマりやすい 8 件を、 症状・原因・対策の 3 点セットで整理します。
df.isna().sum() を毎回確認し、 補完/除外の方針を明示。| アルゴリズム | 発表年 | 着想 | 得意 |
|---|---|---|---|
| PSO | 1995 | 鳥・魚の群行動 | 連続最適化 |
| ACO | 1991 | アリのフェロモン | 離散組合せ (TSP) |
| ABC | 2005 | 蜜蜂の探索 | 連続最適化 |
| Firefly | 2008 | 蛍の明るさ | 多峰関数 |
| Cuckoo Search | 2009 | カッコウの托卵 | 長距離跳躍 |
| Bat Algorithm | 2010 | コウモリの反響 | 連続最適化 |
| Grey Wolf | 2014 | 狼の群れ階層 | 連続最適化 |
| Whale | 2016 | 鯨の捕食 | 連続最適化 |
| 用語 | 意味 |
|---|---|
| 粒子 (particle) | PSO の個体 |
| 蟻 (ant) | ACO の個体 |
| pbest | 個体ベスト位置 |
| gbest | 群ベスト位置 |
| フェロモン | ACO で経路に残す量 |
| 蒸発率 ρ | フェロモンが薄れる速度 |
| 慣性 w | PSO で前の速度を保つ割合 |
| 探索 (exploration) | 未知領域を試す |
| 利用 (exploitation) | 既知の良い領域を深掘り |
| 停滞 | 全個体が同じ点に張り付く現象 |
| 多様化 | 停滞を防ぐ操作(再初期化等) |
| 創発 | 単純ルールから複雑挙動が生まれる |
| レシピ | コード | ||
|---|---|---|---|
| pyswarms PSO |
| ||
| 最適化実行 | best_cost, best_pos = opt.optimize(f_vec, iters=100) | ||
| Differential Evolution |
| ||
| dual_annealing |
| ||
| basinhopping |
| ||
| Optuna TPE | 📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口) A1301(15歳未満人口) A1303(65歳以上人口) A4101(出生数) A9101(婚姻件数)
北海道 5,092,000 514,000 1,681,000 24,430 17,281
東京都 14,086,000 1,513,000 3,205,000 86,348 71,774
沖縄県 1,468,000 236,000 350,000 12,549 6,316
…(全 47 行)
📤 実行例(実測)
最良: {'n_estimators': 13, 'max_depth': 13} -0.9275
| ||
| Hyperopt |
| ||
| DEAP 遺伝的 |
| ||
| ベンチマーク Rastrigin | def rastrigin(x): return 10*len(x) + sum(xi**2 - 10*np.cos(2*np.pi*xi) for xi in x) | ||
| ベンチマーク Ackley | def ackley(x): return -20*np.exp(-0.2*np.sqrt((x**2).mean())) - np.exp(np.cos(2*np.pi*x).mean()) + 20 + np.e | ||
| 並列評価 (joblib) |
| ||
| 収束履歴の可視化 |
| ||
| 複数試行 | results = [GlobalBestPSO(...).optimize(...) for _ in range(30)] | ||
| seed 固定 | np.random.seed(0) # 教材では実データ駆動を推奨 | ||
| 早期停止 | if no_improve_count > 20: break |
群知能の系譜と兄弟関係:
【メタヒューリスティクス】
│
┌──────────────┼──────────────┐
進化計算 群知能 物理着想
│ │ │
┌─────┴─────┐ ┌─────┼─────┐ ┌─────┼─────┐
GA GP DE PSO ACO ABC FA SA TS HC
│ │
自然淘汰 集団自己組織化
PSO や ACO は「とりあえず動く」のは簡単ですが、 「最高性能を引き出す」には設計と運用の工夫が要ります。 ここでは現場でよく使うチューニング手順をまとめます。
群知能アルゴリズムは確率的なので、 1 回の実行で最適解が出る保証はありません。 必ず 10-30 回独立に実行し、 最良値・中央値・最悪値を集計します。 中央値が真の性能の目安、 最悪値と最良値の差が「不安定さ」の指標です。
PSO や ACO は大域探索は得意ですが、 「最適解の近傍での精緻化」は苦手です。 PSO で粗く探索 → BFGS/Nelder-Mead で局所精緻化、 という 2 段構成が定石。 PSO 単独より精度が 1-2 桁向上することもあります。
反復ごとの最良値を記録し、 K 反復改善がなければ停止する「早期停止」が時間節約に有効です。 また慣性 w を反復とともに 0.9→0.4 と線形減少させると、 探索(前半)→利用(後半)の切替がスムーズで収束が速まります。
群知能アルゴリズムを評価するには、 標準ベンチマーク関数で性能を比較します。 代表的なものを紹介します。
| 関数名 | 特徴 | 難しさ |
|---|---|---|
| Sphere | 凸・単峰・分離可能 | ★(基準) |
| Rosenbrock | 非凸・峡谷・非分離 | ★★★ |
| Rastrigin | 多峰・分離可能 | ★★★★ |
| Ackley | 多峰・非分離 | ★★★★ |
| Schwefel | 多峰・偽の最適解 | ★★★★★ |
典型的なベンチマーク結果(30 次元、 30 回平均):
「No Free Lunch 定理」が示すとおり、 全問題で最良な単一手法はありません。 問題の性質(凸性・分離性・次元)に応じてアルゴリズムを選ぶ、 もしくは複数手法のアンサンブルを使うのが実践的です。
群知能 は万能ではなく、 適切な場面で使う必要があります。 以下のフローチャートで判定してください。
[START] ↓ Q1: 目的は何か? ├ 要約・記述 → A. 適合(群知能 の出番) ├ 予測・分類 → Q2 へ ├ 因果推論 → 別手法(DID/IV/RDD)を優先 └ 生成・最適化 → Q3 へ Q2: データ規模・型は? ├ n < 100, 単純構造 → A. 適合 ├ n >= 100, 多次元 → A. 適合(前処理を強化) └ 画像・系列 → 深層学習系の検討を併行 Q3: 計算資源は? ├ ローカル CPU で OK → A. 適合 └ GPU/分散が必要 → 適合だが実装難度↑ [END] → A の場合、 本ページの「🐍 Python 実装」へ
フローチャートで A 判定が出たら、 本ページの実装をそのまま流用できます。 別手法に分岐した場合は、 ページ末尾の「🔗 関連用語(発展)」リンクから移動してください。
群知能 を使ったレポートを共同作業者・査読者に見せたときに、 高確率で指摘される 10 パターンを並べます。 提出前に自分のレポートと突き合わせてください。
10 件のうち 2-3 件は誰でもやってしまいます。 重要なのは『指摘される前に自分で潰す』姿勢です。 チェックリストを印刷して机に置いておくと事故率が激減します。
群知能 を使った分析結果を報告書・論文・スライドに載せる際のテンプレートです。 5 つの構成要素を順に埋めれば、 過不足のない記述になります。
このテンプレートを使えば、 査読プロセスでよく指摘される『方法の透明性』『限界の明示』『再現性』の 3 観点をカバーできます。
群知能 は、 統計学と計算機科学の流れの中から生まれました。 下の年表はこの分野全体の流れで、 群知能 固有の年表ではありません。 この用語がどの時代の産物かを掴むために置いています。
| 時代 | 出来事・人物 | 影響 |
|---|---|---|
| 古典期(17-19 世紀) | パスカル、 ガウス、 ラプラス、 ベイズなどによる確率論・統計学の基礎構築 | 群知能 を支える数学的言語の整備 |
| 近代統計期(20 世紀前半) | フィッシャー、 ピアソン、 ネイマンなどによる推測統計の確立 | この分野の理論的基盤の形成 |
| 計算機統計期(20 世紀後半) | コンピュータの普及、 大規模数値計算、 ブートストラップ、 EM、 MCMC など | この分野の実装が現実的に |
| 機械学習期(1990s-2010s) | SVM、 ランダムフォレスト、 勾配ブースティング、 深層学習 | 群知能 と機械学習手法の融合 |
| 現代(2020s-) | 大規模言語モデル、 因果機械学習、 説明可能 AI、 公的統計のオープン化 | 群知能 を含む統計手法が誰でも・どこでも使える時代に |
歴史を知ると、 各手法が『なぜそのような形をしているか』が腹落ちします。 特に新手法を学ぶときは、 既存手法との関係・歴史的経緯を併せて押さえると、 表面的な暗記を超えた理解に到達できます。
群知能 を実務・コンペで使う前に、 以下の 15 項目をすべてチェックしてください。 1 つでも未確認なら、 結果の信頼性が大きく揺らぐ可能性があります。
群知能 を学ぶ過程で頻出する 20 の関連用語を、 1 行ずつ簡潔に定義します。 詳細はそれぞれの専用ページへリンクされています。
| 用語 | 一行定義 |
|---|---|
| 平均 | サンプルの中心位置を示す代表値 |
| 分散 | 平均からの差の 2 乗の平均、 ばらつきの尺度 |
| 標準偏差 | 分散の平方根、 原データと同じ単位 |
| 中央値 | 外れ値に強い代表値 |
| 四分位 | 25%・50%・75% のカットオフ |
| 相関係数 | −1 〜 +1 の値で線形関係を要約 |
| 共分散 | 相関の規格化前、 単位が残る |
| 確率 | 事象の起こりやすさ、 0 〜 1 |
| 確率分布 | 確率変数の値ごとの確率の地図 |
| 正規分布 | 中心極限定理が成り立つ釣鐘型分布 |
| 仮説検定 | 『差は偶然か』を確率で判断する枠組み |
| p 値 | 帰無仮説下で観測以上のデータが出る確率 |
| 信頼区間 | 推定の不確実性を区間で表現 |
| 効果量 | 差の大きさを標準化した量 |
| 線形回帰 | 説明変数の線形和で目的変数を予測 |
| クラスタリング | 教師なしで似た者同士をまとめる |
| PCA | 主成分分析、 線形次元削減の代表 |
| 機械学習 | データからモデルを学習する枠組み |
| 交差検証 | データを分割して汎化性能を測る |
| 過学習 | 訓練データに合わせ過ぎて汎化失敗 |
本ページでは 群知能(Swarm Intelligence) を 12 セクション + 拡張 8 セクションで体系的に整理しました。 ジャストインタイム学習の原則に従い、 すべての節は独立して読めるよう設計されています。 必要な節だけ拾い読みしても OK、 通読しても OK。
本ページが役に立ったら、 ページ末尾の「🔗 関連用語(前提・並列・発展)」と「📚 関連グループ教材」から次の用語に進んでください。 知識のネットワークが少しずつ広がり、 全体像が見えてきます。
群知能 (swarm intelligence) は「個体は単純なルールに従うが、 集団として複雑な問題解決を実現する」自己組織化アルゴリズム群。 PSO (粒子群最適化)、 ACO (蟻コロニー最適化)、 ABC (人工蜂コロニー) が代表例。 SSDSE-B-2026 で 47 都道府県 × 110 指標から最適な変数組合せを探索する組合せ最適化問題に PSO を適用する応用が考えられる。
群知能は「局所最適に陥りにくい」「並列化しやすい」反面、 「収束保証なし」「ハイパラ調整がアートに近い」。 SSDSE 分析でも特徴量選択の補助ツールとして使えるが、 Lasso / Random Forest 特徴量重要度と比較する。
最適化問題の性質から群知能アルゴリズムを選ぶフロー。
群知能は他のメタヒューリスティクスと比較してアルゴリズム自体の選択も重要。 ノーフリーランチ定理により問題依存で、 まず Random Search → ベイズ最適化 → PSO の順で試すのが定石。
このセクションは本文への追記(補足)です。ここでは群知能(PSO・ACO などの swarm intelligence)を、姉妹ページ「進化計算」とは別角度——すなわち「中央司令なしに、単純な局所ルールの相互作用から大域的な良解が創発する」という視点で掘り下げます。数値は data/raw/SSDSE-B-2026.csv の実測値のみを用い、合成例は「架空」と明記します。
群知能の要点は、進化計算のような「世代交代・淘汰」ではなく、個体が同時並行で動きながら情報を共有することにあります。PSO の各粒子は毎ステップ、次の 3 つを足し合わせて動くだけです ── ①慣性(今までの速度を保つ)、②個体記憶(自分が見つけた最良点 pbest へ引かれる)、③社会情報(群れ全体の最良点 gbest へ引かれる)。誰も全体地図を持たず、誰も命令を出しません。それでも群れは谷底へ集まっていく ── これが創発(emergence)です。
ACO のアリはさらに極端で、記憶すら持ちません。歩いた道にフェロモンを残し、短い経路ほど早く往復されて濃くなり、濃い道は選ばれやすくなる。この正のフィードバックと自然蒸発だけで、集団は良い経路へ収束します。「賢い個体を作る」のではなく「賢くない個体の相互作用を設計する」──これが進化計算との決定的な違いです。
A1101(総人口)2023 年 47 都道府県では、東京都 14,086,000 人に対し鳥取県 537,000 人で約 26.2 倍(平均 2,645,809 人/標準偏差 2,797,551 人)。速度の刻み幅や距離を全次元で共通に扱うと、大きい次元にばかり探索が引きずられます。標準化(zスコア・MinMax)を前処理に挟むのが鉄則です。群知能は問題の構造で手法が分かれます。連続空間の最適化(実数ベクトルの最小化)には PSO や差分進化が向き、離散・グラフ上の組合せ最適化(経路・順序・割当)には ACO が向きます。両者を混ぜたハイブリッド、複数の群を並走させる multi-swarm、良質かつ多様な解の一覧を残す quality-diversity などが発展形です。
なぜ厳密解ではなく群れなのかを、実データで実感してみます。47 都道府県を 1 度ずつ巡回する順序の総数は 47! ≈ 2.586×1059、始点を固定し向きを無視した本質的に異なる巡回路でも 46!/2 ≈ 2.751×1057(58 桁)に達します。全数探索は宇宙時間でも終わりません。この「単純ルールでは袋小路、全数探索は爆発」という中間領域こそ、ACO のような群知能の生息域です。(※この巡回路数は 47 という県数から数学的に導いた事実であり、実際の距離最適化結果ではありません。具体的な経路長を主張する下記のような値は架空のデモ設定です。)
なお背景として、全国総人口(A1101 の 47 県合計)は SSDSE-B-2026 上で 2012 年 127,589,000 人 → 2023 年 124,353,000 人へと −3,236,000 人(約 −2.5%)減少しています。配送・巡回・拠点配置といった群知能の応用先では、こうした需要側の縮小トレンドも制約条件として効いてきます。
同じ「勾配を使わない探索」の仲間や、対になる考え方を辿ると理解が立体化します(いずれも本リポジトリ内に専用ページがあります)。
対概念として、微分可能・凸な問題では素直に連続最適化(勾配法)が群知能を圧倒します。群知能は「非凸・微分不可・離散」に絞って使うのが原則、という本文の結論をここでも確認してください。