Tunny Icon
TunnyDocs

The next-gen Grasshopper optimization tool.

エントロピー重み法

概要

エントロピー重み法は、情報理論のシャノンエントロピー(Shannon Entropy)を用いて、データの分散度合いから各目的関数の重みを客観的に算出する手法です。 評価基準間のばらつきが大きいほど重要度が高いという前提のもと、意思決定者の主観に依らない重みを導出します。

Tunny Dashboard では、TOPSIS / VIKOR といった MCDM 手法の重みとして使用できます。 エントロピー重みモードを選択すると、手動スライダーによる設定を置き換え、データ自体が重みを決定します。

Tunny Dashboard では、各目的関数について次の情報が得られます:

出力 説明
重み 各目的関数の重み(0〜1、合計が 1)
エントロピー 各目的関数の情報エントロピー eje_j(0〜1)
多様度 各目的関数の多様度 dj=1ejd_j = 1 - e_j(0〜1)
正規化行列 比例正規化後の行列(行: トライアル、列: 目的関数)

理論背景

直感

情報理論では、エントロピーは「不確かさ」または「情報量」を表します。 均一に分布している変数はエントロピーが高く(識別力が低い)、偏りがある変数はエントロピーが低くなります(識別力が高い)。

  • 全トライアルで同じ値 → エントロピー = 1.0 → 多様度 = 0 → 重み = 0 (この目的関数はトライアル間の差異を生まないので情報がありません)
  • トライアル間で大きくばらつく → エントロピー < 1 → 多様度 > 0 → 重みが大きい

アルゴリズムの概要

Step 1: 負値処理(必要な場合のみ Min-Max 正規化)
Step 2: 比例正規化(列和が 1 になるよう正規化)
Step 3: 情報エントロピーの計算
Step 4: 多様度の計算
Step 5: 重みの正規化

Step 1: 負値の前処理

エントロピー計算では対数を用いるため、全値が非負である必要があります。 負値を含む目的関数列には Min-Max 正規化を適用します。

jj に負値が含まれる場合:

xij=xijmini(xij)maxi(xij)mini(xij)x_{ij}' = \frac{x_{ij} - \min_i(x_{ij})}{\max_i(x_{ij}) - \min_i(x_{ij})}

負値を含まない列はそのままの値 xij=xijx_{ij}' = x_{ij} を使用します。

ゼロ除算ガード(定数列): 列内の全値が同一($\max = \min$、range = 0)の場合、$x_{ij}' = 1.0$ とします(0.0 ではありません)。 0.0 にすると Step 2 の比例正規化で全行が pij=0p_{ij} = 0 となり、Step 3 で ej=0e_j = 0(多様度 dj=1d_j = 1)と計算されてしまい、情報量ゼロのはずの定数列が最大重みを獲得するという逆転が起きます。 全行を 1.0 とすれば比例正規化で pij=1/mp_{ij} = 1/m(一様分布)となり、$e_j = 1.0$、$d_j = 0$、$w_j = 0$ という正しい結果になります(正の定数列を Min-Max 正規化しない場合と同じ挙動)。


Step 2: 比例正規化

各列を列和で割ることで、確率的解釈が可能な行列 PP を構築します。

pij=xiji=1mxijp_{ij} = \frac{x_{ij}'}{\sum_{i=1}^{m} x_{ij}'}

各列の和は 1 になります( ipij=1\sum_i p_{ij} = 1)。

ゼロ除算ガード: 列和が 0 の場合(全値が 0)、$p_{ij} = 0$ とします。 この場合、後続のエントロピー計算でも plnpp \ln p の項は 0 として扱われます($\lim_{p \to 0} p \ln p = 0$)。


Step 3: 情報エントロピーの計算

目的関数 jj のシャノンエントロピー:

ej=1lnmi=1mpijln(pij)e_j = -\frac{1}{\ln m} \sum_{i=1}^{m} p_{ij} \ln(p_{ij}) 1lnm\frac{1}{\ln m} で除算することで ej[0,1]e_j \in [0, 1] に正規化します。

特殊ケース:

  • pij=0p_{ij} = 0 の項は pijln(pij)=0p_{ij} \ln(p_{ij}) = 0 として扱います(情報論的に標準的な定義)
  • m=1m = 1(単一トライアル)の場合、$\ln m = 0$ なので ej=0e_j = 0 とします

Step 4: 多様度の計算

dj=1ejd_j = 1 - e_j

エントロピーが高い(= 情報が少ない)目的関数ほど多様度が低くなります。


Step 5: 重みの正規化

wj=djk=1ndkw_j = \frac{d_j}{\sum_{k=1}^{n} d_k}

均一フォールバック: kdk=0\sum_k d_k = 0(全目的関数が定数)の場合、全目的関数に均等重み wj=1/nw_j = 1/n を割り当てます。


挙動の詳細

NaN トライアルの扱い

いずれかの目的関数値が NaN のトライアルは、有効トライアルから除外されます。 全トライアルが NaN の場合はエラーを返します。

負値処理の詳細

負値チェックと処理は、列(目的関数)ごとに独立して行われます。 一部の列のみ負値を含む場合、その列だけ Min-Max 正規化が適用され、他の列は元の値を維持します。

これにより、正値の目的関数の絶対的なスケール情報(どのトライアルが大きく違うか)を保持したまま、負値列のみを補正できます。

MCDM との連携

MCDM Ranking ウィジェットで Entropy 重みモードを選択すると、バックグラウンドでエントロピー重みを計算し、その結果を TOPSIS / VIKOR の重みとして使用します。 計算中も UI はブロックされません。


数値例

問題設定

3 トライアル × 2 目的関数(両方非負)

トライアル 目的1 目的2
0 5 1
1 5 2
2 5 3

目的1は全トライアルで同値(= 5)、目的2はばらつきがあります。

Step 1: 負値なし → 処理なし

Step 2: 比例正規化

列和: 目的1 = 15, 目的2 = 6

P=(5/151/65/152/65/153/6)=(1/31/61/31/31/31/2)P = \begin{pmatrix} 5/15 & 1/6 \ 5/15 & 2/6 \ 5/15 & 3/6 \end{pmatrix} = \begin{pmatrix} 1/3 & 1/6 \ 1/3 & 1/3 \ 1/3 & 1/2 \end{pmatrix}

Step 3: エントロピー(m = 3, ln 3 ≈ 1.0986)

目的1(全均等):

e1=1ln3(3×13ln13)=1ln3ln13=1.0e_1 = -\frac{1}{\ln 3} \left( 3 \times \frac{1}{3} \ln \frac{1}{3} \right) = -\frac{1}{\ln 3} \cdot \ln \frac{1}{3} = 1.0

目的2(不均等):

e2=1ln3(16ln16+13ln13+12ln12)0.982e_2 = -\frac{1}{\ln 3} \left( \frac{1}{6} \ln \frac{1}{6} + \frac{1}{3} \ln \frac{1}{3} + \frac{1}{2} \ln \frac{1}{2} \right) \approx 0.982

Step 4: 多様度

d1=11.0=0.0,d2=10.982=0.018d_1 = 1 - 1.0 = 0.0, \quad d_2 = 1 - 0.982 = 0.018

Step 5: 重み

w1=0.00.018=0.0,w2=0.0180.018=1.0w_1 = \frac{0.0}{0.018} = 0.0, \quad w_2 = \frac{0.018}{0.018} = 1.0

目的1は識別力ゼロのため重みが 0 となり、目的2が全重みを持ちます。 これがエントロピー重み法の本質です。


計算量

ステップ 計算量
負値チェック・処理 O(m × n)
比例正規化 O(m × n)
エントロピー計算 O(m × n)
重み正規化 O(n)
合計 O(m × n)

50,000 トライアル × 4 目的関数で 100ms 未満です(実測)。


特性・限界

強み:

  • 主観的な重み設定が不要で、データから自動的に重みを決定します
  • 分析者の偏りを排除した、客観的な多基準評価ができます
  • 計算量が O(m × n) と軽量で、大規模データにも対応します

弱み:

  • データのばらつきが「重要度」と等価であるという仮定が前提です(常に正しいとは限りません)
  • 全目的関数がほぼ均一なデータでは、微小なノイズが重みを支配する可能性があります
  • ドメイン知識(「この目的関数を重視したい」)を反映できません

手動重みとの使い分け:

各目的関数の重要度に関するドメイン知識がある
  → 手動スライダーで重みを設定

データが語る重要度を客観的に反映したい
  → エントロピー重みモードを使用

両者を比較して感度を確認する
  → 手動 ↔ エントロピーをモード切替で比較

参考文献