RustのstatrsのBeta分布の分布関数の逆関数の精度

前回出てきた、Rustのstatrsの精度はどうなのか問題について、ちょっと詳しく書こう。

どんな話だったかというと、Beta分布の分布関数の逆関数 (Inverse of CDF; InvCDF) の精度がよろしくない気がする、というもの。

当方、環境はWindows 10。

この記事の自分的プロジェクト名はtest06。

ソースなどはこちら (Github)

今回は、ブログでは計算結果だけを示す。。

何をしたか

今回やったのは、Beta分布の分布関数の逆関数を、次の4つのライブラリで算出する、というもの。

  • Rustの"statrs"
  • Rustの"probability"
  • C++のBoost
  • R(の標準ライブラリ)

分布のパラメータとして alpha と beta が必要だが、これらにはそれぞれ { 0.5, 1, 2} から1つを与えていって、9パターンを試した。逆関数に与える確率pとしては { 0.01, 0.02, ... , 0.98, 0.99} を用いた。

結果

どの算出方法を基準にしようか。。

憶測で、C++/Boostの結果がいい精度を出しているのではないかと考えて、これを基準にしてみた。C++/Boostが「真値」を返しているとして、他の3つの算出方法の結果との差分を示したのが、次の図。

Beta分布のInvCDFの、C++/Boostとの差分

実はこのグラフ上でRustの"statrs"以外は完全に重なって見えている。つまり返す値がほとんど同じ。

なので重なってしまう算出方法の1つであるC++/Boostを基準としてよかろうて。あとは、"statrs"がどれぐらいズレているかが焦点だ。

(というか上図の真ん中のパネルは、見るからに規則的な模様になっていて、statrsで算出アルゴリズムによる系統的な誤差が生じていそうな感じがアリアリだが。。)

statrsの相対誤差

ではstatrsのInvCDFの相対誤差(のlog10)を示す(C++/Boostの返す値を「真値」としている)。それが次の図。

statrsのBeta分布のInvCDFの相対誤差

この図から、statrsの返す値には、4桁ぐらいの精度しか期待できなくて、例外的な状況だとそれも期待できない、という感じかなと。。

厳密な計算をするならstatrsはちょっとやめた方がよさそう。今後のライブラリの進化に期待。

でも用途次第か

まあでも、例えばBetaのInvCDFを簡単に図示するだけなら、精度は4桁もなくてもいいのかも。

上記の4つの算出方法による、Beta分布のInvCDFを、確率pに対してプロットしたのが、下図。

Beta分布のInvCDFをライブラリ別に示す

これを見る限り、statrsも含めて全部重なってる。

こんな図をつくる用途ならstatrsで十分そう。

現場からは以上です。