まえがき
カルバック・ライブラー情報量(KLダイバージェンス)とは
\DeclareMathOperator{\KL}{KL}
\KL[p \parallel q ]:=\int p(x)\log\frac{p(x)}{q(x)}\;\mathrm{d} x
と定義される,2つの確率分布 $p$, $q$ の"距離"を測る指標である.
$p$, $q$ に対して非対称であり,数学的な「距離」の定義を満たさないのだが,$p$ が $q$に近いほど小さくなるため統計などの分野でよく用いられる.
この非対称性など,「普通とは違う」感を表すためか,$p$, $q$ の間は $\parallel$ という記号で区切って表記する場合が多い.
本記事はこのダブルバーティカルバー1 $\parallel$ という記号をLaTeX上でどう表記するのが適切なのかという話題である.
結論
先に結論を述べると,一般的には \parallel
,分数式を使うときなどカッコの \left
,\right
と合わせて縦幅を変えたい場合は \;\middle\|\;
のように手動でアキを調整するか,\mathrel{}\middle\|\mathrel{}
のようにゴーストを挿入するのが良いと思われる.
何度も使うならばKLダイバージェンスを示す2引数のコマンドを作ったほうが良いだろう.
\DeclareMathOperator{\KL}{KL}
\DeclarePairedDelimiterX{\divbrace}[2]{[}{]}{%
#1\;\delimsize\|\;#2%
}
\newcommand{\KLdiv}{%
\KL\divbrace%
}
と定義しておけば \KLdiv{p}{q}
で呼び出せて意味もわかりやすくなるし,縦幅の伸縮を切り替えることもできるようになる.
\mid に対応するコマンド
集合の内包的表記( $\{ x\in\mathbb{R}\mid |x|<1\}$ )や条件付き確率( $\Pr(X\mid Y)$ )など,中置記号として $|$ (バーティカルバー)を使う場合は \mid
を用いるのが良い.
これは単に |
と入力した場合,LaTeX上では数学記号ではなくただの文字として扱われ,前後のアキが不適切となるなど不都合は生じるからである.
一方,$\parallel$ をLaTeXで出力するために使われる \|
は \delimiter "026B30D
のように括弧類として定義されている.
ノルムなどカッコとして用いるには適切だが,KLダイバージェンスのように中置記号として用いる際はTeXにそのように認識されないため, $|$ と同様にアキがおかしくなってしまう.
また,もちろん ||
や \mid\mid
と入力するのも避けたほうが良い.これは $|$ 記号2つ分という意味であり, $\parallel$ とは意味が異なる2し,出力も棒の間の広さが異なる.
そこで「中置記号のバーティカルバー」である \mid
と対応した「中置記号のダブルバーティカルバー」は何かという問題になるが,この答えは \parallel
である.
平行記号とはちょっと意味が違うんじゃないかと感じるが,\mid=\mathchar"326A
3であるのに対し \parallel=\mathchar"326B
となっており,ちゃんとバーティカルバーとダブルバーティカルバーで対応している.
意味の上で気になるならば \newcommand{\doublemid}{\parallel}
などのように名前を付けるといいだろう.
入力を色々と変えた際の出力結果は以下のようになる.
(※ \DeclareMathOperator{\KL}{KL}
で \KL
を定義している.)
中身に合わせて縦幅を変えたい場合
LaTeXでは\left
,\right
を使うことで括弧類を中身に合わせて伸ばす機能がある.
\{\frac{a}{b}\} \rightarrow \left\{\frac{a}{b}\right\}
\{\frac{a}{b}\} \rightarrow \left\{\frac{a}{b}\right\}
\left
,\right
は有名だが,実は \middle
で真ん中の記号も伸ばすことができる
\{\frac{a}{b}\mid\frac{c}{d}\} \rightarrow \left\{\frac{a}{b}\middle|\frac{c}{d}\right\}
\{\frac{a}{b}\mid\frac{c}{d}\} \rightarrow \left\{\frac{a}{b}\middle|\frac{c}{d}\right\}
しかし,\middle
は(\left
,\right
もだが)引数に「括弧類」しか取ることができない.
せっかく前後のアキを意識して \mid
を使っていたのに,これは数学記号なので \middle
を適用させようとするとエラーとなってしまう.
そのため,この場合は記号 |
を使って前後のアキは対処療法的に手動で空白を入れることが多いのだが,自動で調整させるためには「"無"を関係演算子扱させたモノを両側に挿入する」という解決方法がある.
参考:\middle であり \mid であるもの - マクロツイーター
\left\{\frac{a}{b}\mathrel{}\middle|\mathrel{}\frac{c}{d}\right\}
これを使えば,$\parallel$ の場合も同様に伸縮させることができる.
\middle
を適用した上で関係演算子とするコマンド \relmiddle
を定義し,各出力結果を比較した.
\usepackage{mathtools}
\DeclarePairedDelimiter{\Bracket}{[}{]}
\DeclareMathOperator{\KL}{KL}
\newcommand{\relmiddle}[1]{\mathrel{}\middle#1\mathrel{}}
\newcommand{\ab}{\dfrac{a}{b}}
\newcommand{\cd}{\dfrac{c}{d}}
余談だが,\left
,\right
を適用するとカッコの扱いが変わってしまう(Pr とカッコ始めとの間にアキが入ってしまう)ため,伸縮するカッコを扱う際は DeclarePairedDelimiter
を使って定義しておくと良い. *
をつけて呼び出すと自動で伸縮するようになる.
参考:https://tex.stackexchange.com/questions/151984/double-vertical-bar-notation ではダイバージェンスを表す2引数のコマンドを作ってしまって \infdiv{P}{Q}
のように呼び出すようにしている.
\DeclarePairedDelimiterX
の中では \middle
は使えないようで,代わりに \delimsize
で大きさの調整をする.
また,ここにゴースト \mathrel{}
を挿入すると演算子2つ分と扱われてしまうようで4またアキが狂ってしまうため, \;
でスペースを挿入することとした.
\usepackage{mathtools}
\DeclareMathOperator{\KL}{KL}
\DeclarePairedDelimiterX{\divbrace}[2]{[}{]}{%
#1\;\delimsize\|\;#2%
}
\newcommand{\KLdiv}{%
\KL\divbrace%
}
この場合,*
をつけることで自動で伸縮させたり,手動で大きさを指定したりできるようになる.