> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ionworks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 正則化

> iws.priors と iws.stats の分布でガウス事前分布によりパラメータフィットを安定化します

`iws.DataFit` における正則化は、フィット対象パラメータへの **事前分布** として表現します。各事前分布は、パラメータ名と `iws.stats` の分布を組み合わせて指定します。正則化が必要な理由や事前強度の選び方は、[正則化 (英語ガイド)](/guide/data-fitting/regularization) を参照してください。

## 分布

| スキーマ                                     | 用途                       |
| ---------------------------------------- | ------------------------ |
| `iws.stats.Normal(mean=..., std=...)`    | ガウス事前分布、加算的スケール          |
| `iws.stats.LogNormal(mean=..., std=...)` | 桁にまたがる正値パラメータ(例: 固相拡散係数) |
| `iws.stats.Uniform(lb=..., ub=...)`      | ハードサポート。一様密度の境界と等価       |
| `iws.stats.MultivariateNormal(...)`      | 複数パラメータにまたがる相関事前分布       |

## 正則化されたフィット

```python theme={null}
import pybamm
import ionworks_schema as iws
from ionworks import Ionworks

parameters = {
    "Positive particle diffusivity [m2.s-1]": iws.Parameter(
        "Positive particle diffusivity [m2.s-1]",
        initial_value=1e-14,
        bounds=(1e-16, 1e-12),
    ),
    "Negative particle diffusivity [m2.s-1]": iws.Parameter(
        "Negative particle diffusivity [m2.s-1]",
        initial_value=3e-14,
        bounds=(1e-16, 1e-12),
    ),
}

priors = {
    "Positive particle diffusivity [m2.s-1]": iws.priors.Prior(
        "Positive particle diffusivity [m2.s-1]",
        iws.stats.LogNormal(mean=-32.2, std=1.0),  # 対数空間の平均と標準偏差
    ),
    "Negative particle diffusivity [m2.s-1]": iws.priors.Prior(
        "Negative particle diffusivity [m2.s-1]",
        iws.stats.LogNormal(mean=-31.1, std=1.0),
    ),
}

fit = iws.DataFit(
    objectives={
        "1C": iws.objectives.CurrentDriven(
            data_input="file:.../1C.csv",
            options={"model": pybamm.lithium_ion.SPMe()},
        ),
    },
    parameters=parameters,
    priors=priors,
    optimizer=iws.optimizers.ScipyLeastSquares(),
)

pipeline = iws.Pipeline({"fit": fit})

client = Ionworks()
submission = client.pipeline.create(pipeline)
```

`priors` を渡すと、事前分布の平均からの偏差が(逆分散に比例して)コスト関数に正則化項として加わります。

## `Parameter` への事前分布の付与

事前分布が当該パラメータに固有のものである場合は、別の dict ではなく `Parameter` に直接付けることもできます。

```python theme={null}
diffusivity = iws.Parameter(
    "Positive particle diffusivity [m2.s-1]",
    initial_value=1e-14,
    bounds=(1e-16, 1e-12),
    prior=iws.stats.LogNormal(mean=-32.2, std=1.0),
)
```

## dict 形式の事前分布

スキーマの設定は、プレーンな dict としても書けます。JSON や YAML から設定を読み込むときに便利です。`priors` マッピングでは、次の 2 つの等価な形式を受け付けます。

```python theme={null}
# フラット形式: 分布名を文字列で指定し、パラメータをインラインに並べる
priors = {
    "Positive particle diffusivity [m2.s-1]": {
        "distribution": "LogNormal",
        "mean": -32.2,
        "std": 1.0,
    },
}

# ネスト形式: 分布を独立した dict として指定
priors = {
    "Positive particle diffusivity [m2.s-1]": {
        "distribution": {"distribution": "LogNormal", "mean": -32.2, "std": 1.0},
        "regularizer_weight": 2.0,
    },
}
```

マッピングのキーがパラメータ名として優先されます。dict の中に埋め込まれた `name` は無視されます — パラメータ名が文字どおり `"distribution"` の場合でも同様です。

## 厳格なバリデーション

事前分布・分布・サンプラーは送信時に識別ユニオン(discriminated union)で検証されます。これにより、タイプミスや古い設定をランタイムの不明瞭なクラッシュにする前に、提出時点で検出できます。

次のような誤りは `ValidationError` として明示的に拒否されます。

* 未知の分布名(例: `{"distribution": "Guassian", ...}`)。
* 分布・事前分布・サンプラー設定の不明なキーやタイプミス。
* フィールドと一致しない `type` 識別子(例: `priors` の下に `{"type": "Penalty", ...}`)。
* 事前分布・分布・サンプラーが期待される位置に渡されたスカラーやリスト。

レガシーの `type` エイリアスは、**分布設定の内部**でのみ `distribution` 識別子の代わりに引き続き受け付けられます。たとえばネスト形式の内側の dict `{"type": "Normal", "mean": 3.0, "std": 0.2}` は `Normal` に解決されるため、既存のシリアライズ済み設定はそのままラウンドトリップします。ただし `type` が `distribution` のエイリアスになるのは分布レベルだけです。事前分布マッピングの最上位では `type` は事前分布の識別子(必ず `"Prior"`)として扱われるため、フラット形式の事前分布は分布を `type` ではなく `distribution` で指定する必要があります。

## なぜ拡散係数に `LogNormal` か

固相拡散係数は桁にまたがる範囲(しばしば $10^{-16}$ \~ $10^{-10}$ m²/s)に分布します。生の値への `Normal` 事前分布では、平均 ± 標準偏差で桁オーダの不確かさを表現しづらいです。`LogNormal` 事前分布はパラメータを対数スケールで扱うため、「平均 ± 1 標準偏差」が係数 $e$ に相当し、より自然です。上記の例の `mean=-32.2` は $\sim 10^{-14}$ の自然対数なので、典型的な粒子内拡散係数を中心とする事前分布になっています。

<CardGroup cols={2}>
  <Card title="正則化 (理論)" icon="scale-balanced" href="/guide/data-fitting/regularization">
    リッジ回帰、MAP 推定、バイアス・分散トレードオフ (英語ガイド)。
  </Card>

  <Card title="データフィッティング概要" icon="chart-line" href="/ja/pipelines/data-fitting/overview">
    事前分布を目的関数・オプティマイザと組み合わせる方法。
  </Card>
</CardGroup>
