LoginSignup
7
4

More than 1 year has passed since last update.

KLダイバージェンスの || をLaTeXで"正しく"書きたい話

Last updated at Posted at 2022-08-01

まえがき

カルバック・ライブラー情報量(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上では数学記号ではなくただの文字として扱われ,前後のアキが不適切となるなど不都合は生じるからである.

image.png
(画像に示すように, $|$ の前後の空白に違いがある)

一方,$\parallel$ をLaTeXで出力するために使われる \|\delimiter "026B30D のように括弧類として定義されている.
ノルムなどカッコとして用いるには適切だが,KLダイバージェンスのように中置記号として用いる際はTeXにそのように認識されないため, $|$ と同様にアキがおかしくなってしまう.

また,もちろん ||\mid\mid と入力するのも避けたほうが良い.これは $|$ 記号2つ分という意味であり, $\parallel$ とは意味が異なる2し,出力も棒の間の広さが異なる.

そこで「中置記号のバーティカルバー」である \mid と対応した「中置記号のダブルバーティカルバー」は何かという問題になるが,この答えは \parallel である.
平行記号とはちょっと意味が違うんじゃないかと感じるが,\mid=\mathchar"326A 3であるのに対し \parallel=\mathchar"326B となっており,ちゃんとバーティカルバーとダブルバーティカルバーで対応している.
意味の上で気になるならば \newcommand{\doublemid}{\parallel} などのように名前を付けるといいだろう.

入力を色々と変えた際の出力結果は以下のようになる.

image.png
(※ \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\}

image.png
(※MathJaxでは正しくレンダリングされない)

これを使えば,$\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}}

image.png

余談だが,\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%
}

この場合,* をつけることで自動で伸縮させたり,手動で大きさを指定したりできるようになる.

image.png

  1. なお,ダブルバーティカルバーは日本語では「双柱」と呼ぶらしい

  2. これを許すと $|x||y|$ が $|x|\times|y|$ なのか $ x \parallel y$ の絶対値(?)なのか判別がつかなくなってしまう.

  3. 「クラス3,ファミリー2の文字コード6Aの文字」という意味

  4. \middle であり \mid であるもの - マクロツイーター でも言及されているが,元々 \mathrel{}\middle|\mathrel{} が1つの関係演算子として扱われる時点で結構な謎挙動をしている.TeX言語の話になってくるので深入りは避ける.

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4