Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】A Curve Fitter That Refuses to Answer

2026年09月26日に「Dev.to」が公開したITニュース「A Curve Fitter That Refuses to Answer」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

`undetermined`は、プログラムの性能など測定が難しい定数の値を、誤差情報や「未決定」の理由と共に報告するライブラリだ。値が安定しない測定結果を「自信を持って間違っている」と明確に伝えることで、誤った確信を防ぐ。確定的な測定の誤差評価を改善し、信頼性を高めた。

出典: A Curve Fitter That Refuses to Answer | Dev.to公開日:

ITニュース解説

「undetermined」というこの新しいライブラリは、従来のデータ分析ツールが単なる測定結果の数値を返すだけでなく、その数値の信頼性や限界についても正直に伝えることを目指している。一般的なツールが測定値から曲線をフィッティングして一つの数値を返すのに対し、undeterminedは、その数値がどの程度正確であるかを示す「エラーバー」と、もし分析の結果「この数値は決定できなかった」と判断した場合、その「明確な理由」をリスト形式で返す点が特徴だ。

例えば、プログラムが持つ「1レコードあたりのバイト数」や「1要素あたりの処理操作数」といった、本来は定数であると信じられているが、実際に測定しなければ分からない値を求めたい場面を想像してみてほしい。undeterminedライブラリの利用者は、対象のプログラムを様々な入力サイズで実行できる「アダプター」と呼ばれるコードを提供する。ライブラリ自体は、そのアダグラムが具体的に何をするプログラムなのかを知る必要はなく、ただアダプターを通して得られる測定結果を分析する。

記事では、仮想的なコイン投げのデモが紹介されている。このデモには「heads」と「flat」という二つの観測量がある。headsは公正なコインの係数(真実の確率は0.5なので係数2)を測定するもので、様々な入力サイズ(8, 32, 128, 512)での試行を繰り返すと、最終的に「1.9978 ± 0.0032」という、真実の2に近い値とその誤差範囲を返す。これは、測定値が安定した「プラトー(高原)」に達したと判断されたことを意味する。一方、flatは、真実とは無関係な値を返すように設計されており、「UNDETERMINED(決定不能)」と報告され、「3つの連続する測定段階が一致せず、値がまだ変動しているため」という明確な理由が添えられる。このように、数値が決定できなかった場合でも、その「理由」を明示することがこのライブラリの最も重要なポイントであり、その判断が正しかったかどうかを検証できる、ライブラリの核心部分と言える。

undeterminedライブラリの設計思想は、「自信を持って間違える」ことを断固として拒否することにある。この哲学は、具体的な三つのケースで明確に表れる。

一つ目は、測定方法が不適切で、乱数の種(シード)を無視するような観測量を提供した場合、ライブラリはすぐにエラーを発生させる。ライブラリは異なるシードでの測定結果を平均して分析するため、シードを無視すると正確な誤差評価ができなくなる。その結果、「誤っているにも関わらず、まるで正しいかのように自信満々な答え」を出してしまう危険があるため、このような不適切な入力は受け付けない。

二つ目は、何度測定を繰り返しても安定した値に収束しない定数の場合、ライブラリは「UNDETERMINED」と報告し、その理由を明示する。測定結果が安定したプラトーに達したと判断されるには、連続する三つの測定段階で得られた値が、それぞれの誤差範囲を考慮しても十分に一致している必要がある。もし値が変動し続けているなら、無理に定数と判断しようとせず、その事実を正直に伝える。

三つ目は、複数の観測量が存在するが、その中からどれか一つを選ぶだけの十分な根拠がない場合も、ライブラリは選択を拒否する。ある観測量が「情報量を持つ」と見なされるには、その値が自身の測定誤差の少なくとも三倍以上、異なる状況下で変動している必要がある。さらに、複数の候補の中から一つが選ばれるためには、その観測量が次点の候補を同じ要因で上回っている必要がある。これにより、根拠なく特定の観測量を選んでしまうことを防ぐ。

このライブラリの根底にあるルールは、「測定結果のばらつき(ノイズ)に対して常に比較する」というものだ。単に「値が大きいから重要だ」と判断するのではなく、その値のばらつき、つまり測定の不確かさの範囲内でどれだけ意味があるのかを評価する。大きな数値をそれだけで真実と捉える誤解を防ぐための、極めて重要な原則である。

実は、このライブラリもリリース当初、この原則の一部で誤っていた点が判明した。バージョン0.2.0での重要な修正は、その反省から生まれたものだ。以前のバージョンでは、誤差バーは「タイプA」と呼ばれる、測定を繰り返した際のばらつき(標準偏差を測定回数の平方根で割ったもの)のみを考慮していた。しかし、常に同じ値を返すような決定論的な測定の場合、ばらつきが全くないため、標準誤差はゼロになってしまう。この場合、ライブラリは「測定回数が少ないため、定数は決定できません」と誤って報告してしまっていた。これは、プログラムが正確に測定できたはずの量に対して、「決定不能」という、本来は存在しない定数に使うのと同じ言葉を使ってしまったことになる。この問題は、シミュレーションのような確率的なデータでのみテストされていたため見過ごされ、実システムで決定論的な操作回数を測定する兄弟パッケージが利用された際に初めて顕在化した。

この問題の解決策として、測量学で用いられる「結合標準不確かさ」の考え方が導入された。これは、タイプAの不確かさに加えて、「タイプB」の不確かさ、つまり測定装置の分解能などによる不確かさを組み合わせる方法だ。具体的には、u = sqrt(u_A² + u_B²)という計算式を用いる。ここでu_Bは「granule(粒度)をsqrt(12)で割ったもの」と定義される。granuleとは、観測値が報告される最小単位、つまり分解能のことだ。重要なのは、u_Bを測定回数Nの平方根で割らないことだ。なぜなら、決定論的な測定を何度繰り返しても、その測定の分解能自体は向上しないからである。もしu_Bもsqrt(N)で割ってしまうと、測定回数を増やすだけで、どんな小さな定数でも「有意である」と無理やり結論づけられてしまう危険がある。このgranuleの導入により、誤差バーが適切に広げられ、たとえ決定論的な測定であっても、その結果が本当に安定しているのか、それとも分解能の限界で安定しているように見えているだけなのかを正しく判断できるようになる。

このライブラリは、PythonのPyPIとJavaScriptのnpmという異なるプログラミングエコシステム向けに、全く同じコードツリー、同じバージョンで提供されている。そのため、分析のしきい値や、最終的に報告される説明文字列まで、すべてが完全に一致するように厳格に管理されている。例えば、数値の丸め処理においても、異なる言語や環境で挙動が異なる場合があるため、特定の整数は完全な形で表示し、半端な数値はゼロから遠ざかる方向に丸める、といった共通のルールが定められている。これにより、どちらのプラットフォームで利用しても、一貫した信頼性の高い結果が得られるようになっている。

依存関係の管理においても、堅実な選択がなされている。例えば、プログラムの再現性を保証するために「nondet」という外部ライブラリの利用が検討されたが、最終的には採用されなかった。これは、nondetがファイルパスと関数名に基づいて関数を識別するのに対し、undeterminedの観測量はファイルパスを持たないクロージャであるため、無理に組み込んでも正しく機能しないか、あるいは形だけの保証になってしまうと判断されたからだ。単に「保証してくれそうに見える」だけの外部依存関係は、かえってシステムの複雑性を増し、信頼性を損なう可能性がある。そのため、必要な再現性チェックは、ライブラリ内部で独自に、かつ両方の言語で実装されることになった。

undeterminedライブラリは、単に数値を計算して返すだけでなく、その数値がどの程度信頼できるのか、あるいはそもそも測定自体が不確かであるのかを、明確な理由とともに伝えることを重視している。システムエンジニアがプログラムの性能特性や定数を測定する際、このライブラリは、データが語る真実を正確に理解し、誤った結論に飛びつくことを防ぐための強力な味方となるだろう。

関連コンテンツ

関連IT用語