2014年9月7日日曜日

JISの最近接偶数への丸め(JIS Z8401-1999)について

今日はちょっと専門的な話ですが、数値の丸め処理についての記事です。

数値の丸めといいますと、12.34を小数点以下第1位まで丸めて12.3にするような操作で、四捨五入がおなじみですが、実はJISに規定があり、四捨五入は最善の方法とはされていません

JISの決まりでは、偶数丸めといわれる、あまりなじみのない丸め方法を使うことになっています。

偶数丸めは、有効桁の一つ下の、丸めたい桁以下が50000…であるときの挙動以外は、四捨五入と同じです。有効桁より下が50000…であった場合は、その上の桁が偶数であれば切り上げられ、奇数であれば切り下げられます。

たとえば、小数点以下を丸める場合、以下のようになります。

1.5 -> 2
2.5 -> 2
3.5 -> 4
4.5 -> 4
5.5 -> 6

JISの規格では、この偶数丸めを「規則A」、おなじみの四捨五入を「規則B」としており、「規則Aが一般的には望ましい。」としています。なぜなら、「一連の測定値をこの方法で処理すると丸めによる誤差が最小になるという特別な利点がある。」だそうです。

なるほど、と納得しかけますが、何か腑に落ちません。確かに、四捨五入は大きな数値へかたよる方向への丸めですが、偶数に丸めるなどという恣意的な手段が本当に最適なのでしょうか





----

そもそも、数値を丸めるということの目的は何でしょうか。

まずは、紙面等のスペースの都合でしょう。計測等で得られた値をずらずらと何十桁もレポートに印字しても、場所をとるだけで見にくいだけです。また、電子機器のディスプレイに表示する際にも、表示できる桁数に制限があります。

次に考えられるのは、計測値の信頼度を表すということです。計測の精度が得られない桁の数値を省くことで、表示されている数字はある程度信頼できると思えます。



第2の目的をもう少し詳しく考えてみると、計測値には何らかの理由で誤差が乗るため、その分の真の値に対するずれが、ある幅を持って値の信頼性を低くしているという背景があります。

この誤差とはどんなものでしょうか。誤差の真の姿は知りようもありませんが、何らかの分布を持っているという「モデル」を立てて考えてみます。ここでは統計でよく使うガウス分布だと仮定してみます。

ガウス分布の確率密度分布は下記のようになります。

$$p(x)=\frac{1}{\sqrt{2\pi\sigma^2}}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$$

例として、 \(\mu=1.5, \sigma^2=0.5\) のガウス分布をプロットしてみると下図のようになります。


ここで、1.5の値ちょうどを取る確率は、連続変数の場合は0なので、JISの偶数丸めでも、四捨五入でも、違いはないということになってしまいます!

実際には、丸める前の数値にも解像度の制限があり、1.5のような値をとる確率は有限になります。つまり、与えられた値自体が、とびとびの離散値を持つ分布だということです。

確率密度関数で表すと、下図のようになります。実際には、幅がゼロで高さが無限大のデルタ関数がある間隔で並んだようなものになりますが、ここでは高さを1に規格化して表示しています。


なお、丸めによって失われる情報の分の誤差を考えると、

$$ p(x) =
\begin{cases}
1 & (-0.5<x<0.5)  \\
0 & \mathrm{otherwise}
\end{cases}
$$

という一様分布の分だけ誤差が拡張され、元のモデルで仮定した確率分布との畳み込みを行うことで、下図のResultような分布になります(見やすさのため最大値が1になるように正規化しています)。


Rawが元のモデルで仮定した誤差ですが、Resultとの差が大きくないことから、測定値のばらつきと同程度の桁を丸めることによる、値の信頼性への影響はそれほどないということがわかります。



結局のところ、偶数丸めが適しているかどうかは、与えられた数値自体が、どれだけの解像度を持っているかに依存します。12.23のような値と、12.23215131235のような値を丸めるのでは、結果の有効桁が同じだったとしても、丸めの偏り方が異なるということです。

さらに言うと、与えられた値が、計測対象の現象から、どのような経路を経てきたかにも依存します。

例えば、単純なデジタル温度計を考えてみましょう。



デジタル温度計は、サーミスタや熱電対という、温度を電圧に変換する素子を使っています。電圧はアナログ値ですが、ADCという回路でデジタル値に変換されます。まずここで、得られた値が離散型の確率分布に変換されます。

次に、ADCで得られた値は、そのままでは温度にはなりませんので、校正係数を掛けて温度に変換します。ここでは、浮動小数点や固定小数点の演算が行われますが、コンピュータで扱える数値には有限のビット深度がありますので、ここでも離散的な分布の変換が行われます。

最後に、デジタル表示するディスプレイの桁数に合わせるため、丸めを行います。


(温度計に関するこの説明は、簡単のため非常に単純化していますが、ご容赦ください。)


このように、離散化したり掛け算などの演算を行ったりと、生の計測値から値の操作をしていくと、元の確率分布は様々な変換を受けます。最終的にどのような丸め方法が適しているのかは、この確率分布(=誤差構造)を理解しない限り判断できないことです。

たとえば、偶数+0.5と、奇数+0.5で確率が異なるような分布の場合、偶数丸めでも偏りは生じてしまいます。(このような数値の存在はそれほど異常なことではありません。例えばFAT32ファイルシステムの更新タイムスタンプの最小分解能は2秒です。)

極端な話、一連の測定値の平均値の偏りは減るかもしれませんが、ヒストグラムやフーリエ変換を掛けたら、偶数に偽ピークが生じる原因にもなりかねません。


まとめると、「丸めの適性を判断する際には、与えられた値の性質と誤差構造を理解するべき。それによって適切な丸め方法は異なる。」ということです。

なんだ、あたりまえのことじゃないか、という気もしますが、JIS規格上の「規則Aが一般的には望ましい。一連の測定値をこの方法で処理すると丸めによる誤差が最小になるという特別な利点がある。」という説明は、あまりにも途中の説明をすっぽかしすぎ、結論に飛びつきすぎな気がするのは、私の気にしすぎでしょうか。

(なお、元々ISOの規格に偶数丸めがあり、JISはそれに合わせただけという背景があるため、JISだけ見て批評するのはアンフェアですが、ISOの原文は簡単には見つかりませんでした。)


-----

いまどきの計測値は、コンピュータが処理するようにデジタル化されているのが普通ですから、表示スペースの問題を除けば、コンピュータの計算や統計処理で丸めを行うメリットはありません。コンピュータは2進法ですし、浮動小数点はゼロからの距離によって解像度が変わる性質を持っており、単純な十進数の丸めとはまるで異なる確率分布と誤差構造を持っているでしょう。その点では、単純な四捨五入もそれほど悪い方法ではないと思えます。

偶数丸めが役に立つのは、人間が手書きで計測値を記録していくようなときの紙面の都合上で桁数を落とさざるを得ないようなときで、そのようなケースはどんどんレアになっていくことでしょう。


0 件のコメント:

コメントを投稿