HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Keplearn: 数秒でデータから方程式を抽出

Keplearn: Extract Equations from Data in Seconds (github.com)

16 pointsby owls-on-wires1 コメント

要約

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用 Windows用 Linux用

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秒の予算が設定されています。ノイズに対する正解シンボリック解率:

suitenoise 00.0010.010.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コア:

suitemedianmeanmax1秒未満のフィット
Feynman, noise 01.3 s13.3 s60.7 s55/116
Feynman, noise 0.001-0.111-14 s15-23 s60.7 s0/348
Strogatz, 全ノイズレベル1.3 s1.5 s3.6 s8/56
Black-box60.0 s39.1 s65.8 s15/138

解決されたケースは早期に終了します。ノイズ0では、Feynmanスイートの半分が1秒未満で完了します。ノイズ下では、正確終了パスが機能しないため、それらのフィットはキャップまで実行されます。

ライセンス

KeplearnはMITライセンスの下でリリースされています。

Chandler Freeman chandler@mnty.sh (https://github.com/owls-on-wires) によって作成されました。