Keplearn: 数秒でデータから方程式を抽出
Keplearn: Extract Equations from Data in Seconds (github.com)
要約
Keplearnは、表形式のデータから数秒で閉形式の方程式を抽出する、決定論的なシンボリック回帰エンジンです。Rustで書かれており、依存関係が少なく、ミリ秒単位で正確な法則を特定できます。
全文翻訳
Keplearn
数秒でシンボリック回帰。
Keplearnは、ティコ・ブラーエが収集した天文観測データ表を研究することで惑星運動の法則を導き出したヨハネス・ケプラーにちなんで名付けられました。このプログラムが目指すのは、測定値の列が与えられた場合に、それらを関連付けるコンパクトな法則を見つけることです。
m1 | m2 | r | force
------+-------+------+-------
1.0 | 2.0 | 1.0 | 2.00
2.0 | 2.0 | 2.0 | 1.00 ┌──────────┐
1.5 | 3.0 | 3.0 | 0.50 ──► │ keplearn │ ──► force = m1 * m2 / r**2
2.5 | 1.0 | 0.5 | 10.00 └──────────┘
3.0 | 4.0 | 2.0 | 3.00
より正式には、これは決定論的なシンボリック回帰エンジン(Rustで記述)であり、ベストファースト再帰的削減によって表形式データから閉形式の方程式を復元します。
- 標準入力からTSVまたはCSVを読み込み、候補となる方程式をJSONとして出力します。
- 単一バイナリ、依存関係ゼロ(muslターゲットで完全に静的)
- 数秒での応答を目指して設計されています。正確な法則は通常ミリ秒単位で解決され、
--timeoutは困難なケースの上限を設定します。 - 決定論的です。同じ入力はバイト単位で同じ出力を生成します。
- 報告される
r2は、内部のフィッティングステージからではなく、出力される方程式自体から計算されます。 - フィットされた定数は、有理数、pi、e、sqrt(2)の倍数にスナップされ、保持されるたびに検証されます。
ダウンロード
macOS (ユニバーサル: Apple SiliconおよびIntel)
curl -L -o keplearn https://github.com/owls-on-wires/keplearn/releases/latest/download/keplearn-macos-universal
chmod +x keplearn
./keplearn --help
Windows (PowerShell)
curl.exe -L -o keplearn.exe https://github.com/owls-on-wires/keplearn/releases/latest/download/keplearn-windows-x86_64.exe
.
ieklearn.exe --help
Linux (x86_64, 完全静的)
curl -L -o keplearn https://github.com/owls-on-wires/keplearn/releases/latest/download/keplearn-linux-x86_64
chmod +x keplearn
./keplearn --help
使用方法
予測したい列を--targetで指定します(デフォルトはtargetという名前の列)。ヘッダー行を含むTSVまたはCSVをパイプで渡します。区切り文字はヘッダーから取得されます。タブが存在しない場合はカンマです。
$ ./keplearn --target force --top-k 1 --pretty --out laws.json < gravity.tsv
$ cat laws.json
{
"results": [
{
"expr": "((x1**(1))*(x2**(1))*(x3**(-2)))",
"r2": 1.0000000000,
"search_r2": 1.0000000000,
"holdout_r2": 0.9999999999998754,
"scale": 0.9999984680738088,
"offset": 0.000011830325937959667,
"columns": [
0,
1,
2
],
"factor": "direct",
"model": "((x1*x2)*((x3)**(-2)))"
}
],
"time_ms": 0,
"n_expressions": 0,
"n_evaluated": 0,
"stopped_by": "exact_exit"
}
x1..xNはファイル順の特徴量列で、ターゲットは除外されます。ここではx1=m1、x2=m2、x3=rなので、復元された法則はm1*m2/r**2と読めます。候補はベストファーストで到着します。results[0].modelが答えであり、そのr2は提供されたデータでスコアリングされます。診断情報は標準エラー出力に表示されるため、標準出力は常に1つのJSONオブジェクトになります。
便利なフラグ:
./keplearn --target Tc --timeout 60000 < superconductors.csv # 検索を60秒に制限
./keplearn --top-k 3 < data.tsv # 最も良い3つの候補を出力
./keplearn --target y --sample 1000 < big.tsv # より多くの行でスクリーニング
./keplearn --help # 完全なフラグリストと出力スキーマ
方法
エンジンは、ターゲット列に適用される可逆的な削減の連鎖を探索します。これは、フィットされた係数を割り出し、log、sqrt、またはarcsinのような変換を反転させ、内部アフィンノードをフィットさせ、固定深度まで繰り返します。各ノードで、対数線形回帰からの指数を持つアフィン単項式、スパースk項単項式、または少数の複合形式(L2ノルム、有理数、三角関数)のいずれかでの終端フィットを試みます。候補は、MDL複雑性ペナルティ付きの内部25%ホールドアウトでランク付けされます。
フィットされた定数は、近くの有理数およびpi、e、sqrt(2)の倍数にスナップされます。スナップは、検証パスがモデルがホールドアウトおよびフルデータで引き続き良好なスコアを示す場合にのみ保持されます。その後、勝った式は代数的に単純化され、フルデータセットに対してスケールとオフセットのために再フィットされ、再スコアリングされます。出力のr2は、表示されたモデル文字列を評価した結果であり、内部のフィッティングステージから引き継がれたものではありません。
ベンチマーク
Keplearnは、標準的なシンボリック回帰ベンチマークであるSRBenchのメソッドであり、cavalab/srbench#223で追加されました。
これらの数値は、SRBench独自のコンテナ化されたパイプラインから取得され、そのsympy同等性チェックによって採点され、データセットごとに1回の試行と1フィットあたり60秒の予算が設定されています。ノイズに対する正解シンボリック解率:
| suite | noise 0 | 0.001 | 0.01 | 0.1 |
|---|---|---|---|---|
| Feynman (116) | 75 (64.7%) | 65 (56.0%) | 51 (44.0%) | 10 (8.6%) |
| Strogatz (14) | 6 (42.9%) | 6 (42.9%) | 3 (21.4%) | 1 (7.1%) |
SRBenchでの最高公開Feynmanシンボリック率はAIFeynmanの55.8%であり、次のグループは約27%です。Keplearnは、その計算予算のわずかな割合で64.7%に達します。
138のブラックボックスデータセット(閉形式の正解がない)では、中央値テストR2はゼロ近く(約-0.003)です。Keplearnは一般的な曲線フィッティングではなく、正確な解析法則をターゲットとしており、その結果はそのトレードオフを反映しています。
同じ60秒のキャップ下でのフィット時間、1フィットあたり1コア:
| suite | median | mean | max | 1秒未満のフィット |
|---|---|---|---|---|
| Feynman, noise 0 | 1.3 s | 13.3 s | 60.7 s | 55/116 |
| Feynman, noise 0.001-0.1 | 11-14 s | 15-23 s | 60.7 s | 0/348 |
| Strogatz, 全ノイズレベル | 1.3 s | 1.5 s | 3.6 s | 8/56 |
| Black-box | 60.0 s | 39.1 s | 65.8 s | 15/138 |
解決されたケースは早期に終了します。ノイズ0では、Feynmanスイートの半分が1秒未満で完了します。ノイズ下では、正確終了パスが機能しないため、それらのフィットはキャップまで実行されます。
ライセンス
KeplearnはMITライセンスの下でリリースされています。
Chandler Freeman chandler@mnty.sh (https://github.com/owls-on-wires) によって作成されました。