折りたたみを展開する

おぼえ書き、まとめ、発表など

Numptyのiscloseのrelative toleranceについて

大体同じだったら一緒ってことで良いよ

f:id:Rlan:20170629200656p:plain

Numptyiscloseを使った時、よくわからない部分が出た。デフォルトだと値が設定されているのだけど、 relative tolerance というパラメターである。

numpy.isclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)

この isclose は単純に2点の距離を測って基準であるtoleranceよりも小さかったら True を返すというわけではなさそうである。実際には2つの評価方法を組み合わせているようだ。

Numpyのドキュメント には以下のような説明が書かれている。

For finite values, isclose uses the following equation to test whether two floating point values are equivalent.

absolute(a - b) <= (atol + rtol * absolute(b))

ということだそうだ。

少し分かりづらかったので、自分なりにまとめてみた。以下は2つのスカラーを比べる時に限定して議論する。

2つの誤差基準

誤差の基準には2つの考え方がある、絶対的なものと相対的なものの2つである。単純なのは絶対基準だろう。

絶対基準

絶対なのでどのような値であっても、2つの誤差に対して適応する基準は変わらない。その誤差を \epsilon とすれば、

 \displaystyle
\left\Vert a-b\right\Vert \leq\epsilon

である。しかし、絶対基準で考える場合、aとbの2つの値の大きさは無視していることになる。例えば、 \epsilon = 0.001 のとき10億ケタオーダーの値同士の誤差と100ケタオーダーの値同士の誤差に対して同じ基準で考えることが適切であるかどうか議論が別れるだろう。

相対基準

そこで、比べる値同士の大きさを考慮した基準で誤差を判定することを考える。それが、相対基準である。例えば以下のような基準で考える。相対基準を \delta として、

 \displaystyle
\frac{\left\Vert a-b\right\Vert }{\left\Vert b\right\Vert }\leq\delta

のようにする。 ほかの表し方として、

 \displaystyle
\left\Vert a-b\right\Vert \leq\delta\left\Vert b\right\Vert

という表しかたもできる。

相対基準の方が、絶対基準よりも柔軟に見えるが問題もある。分母が0に近いと左辺が大きな値を取ってしまうという問題だ。

Numpyのiscloseでは

Bumpyのdiscloseでは、相対基準と絶対基準を組合させた評価方法が考えられている。つまり、絶対基準と相対基準 の説明で記載した不等式の両辺を足し合わせて、

 \displaystyle
\left\Vert a-b\right\Vert \leq2\left\Vert a-b\right\Vert \leq\delta\left\Vert b\right\Vert +\epsilon

となっている。ここで注意すべきなのはbに入る値とaに入る値を入れ替えると結果が変わってしまう可能性があるということだ。実際、ドキュメントには注意書きがある。