#回归 #命令行工具 #标准误差 #线性回归 #命令行 #曲线拟合

bin+lib fitme

CLI 曲线拟合工具。从 CSV 数据集中参数化一个方程。

5 个版本 (2 个稳定版本)

1.1.0 2023 年 9 月 30 日
1.0.0 2023 年 9 月 29 日
0.1.2 2023 年 1 月 23 日
0.1.1 2023 年 1 月 22 日
0.1.0 2023 年 1 月 18 日

#161 in 数学

MIT 许可证

40KB
775

fitme

CLI 曲线拟合工具。从 CSV 数据集中参数化一个方程。

fitme 主要是一个 CLI 工具,本 README 详细说明了 CLI 的使用。

如果想要将 fitme 作为库使用,请参阅 API 文档


> fitme y "m * x + c" tests/file1.csv
──────────────────────────────────────────────
 Parameter   Value   Standard Error   t-value 
══════════════════════════════════════════════
 c           3.209            0.013     230.3 
──────────────────────────────────────────────
 m           1.770            0.011     149.0 
──────────────────────────────────────────────
  Number of observations: 10.0
  Root Mean Squared Residual error: 0.043
  R-sq Adjusted: 0.999

功能

  • 简单界面
  • 快速
  • 灵活的方程
  • 有用的错误信息

安装

目前仅支持从源安装

# using crates.io
cargo install fitme

# using github
cargo install --git https://github.com/kurtlawrence/fitme

用法

  • fitme --help 获取详细信息。

fitme 只需要两个参数,一个是拟合的目标列,另一个是数学表达式。第三个可选参数指定读取 CSV 文件的文件。 fitme 使用最小二乘拟合方法。

让我们对以下数据执行线性回归拟合

y x
1.9000429E-01 -1.7237128E+00
6.5807428E+00 1.8712276E+00
1.4582725E+00 -9.6608055E-01
2.7270851E+00 -2.8394297E-01
5.5969253E+00 1.3416969E+00
5.6249280E+00 1.3757038E+00
0.787615 -1.3703436E+00
3.2599759E+00 4.2581975E-02
2.9771762E+00 -1.4970151E-01
4.5936475E+00 8.2065094E-01

方程:y = m * x + c

这里

  • 目标y
  • 变量x
  • 参数mc

要运行拟合,只需使用 fitme y "m * x + c" test-file.csv

> fitme y "m * x + c" test-file.csv
──────────────────────────────────────────────
 Parameter   Value   Standard Error   t-value 
══════════════════════════════════════════════
 c           3.209            0.013     230.3 
──────────────────────────────────────────────
 m           1.770            0.011     149.0 
──────────────────────────────────────────────
  Number of observations: 10.0
  Root Mean Squared Residual error: 0.043
  R-sq Adjusted: 0.999

请注意,fitme 将自动匹配方程中的列名,将它们绑定为 变量。未匹配的变量成为 参数

多参数

fitme 对于拟合多个最小二乘线性回归非常有用

> fitme sepalLength "a * petalLength + b * sepalWidth + c * petalWidth + d" iris.csv
───────────────────────────────────────────────
 Parameter   Value    Standard Error   t-value 
═══════════════════════════════════════════════
 a            0.711            0.056     12.51 
───────────────────────────────────────────────
 b            0.654            0.066     9.788 
───────────────────────────────────────────────
 c           -0.562            0.127    -4.410 
───────────────────────────────────────────────
 d            1.845            0.251     7.342 
───────────────────────────────────────────────
  Number of observations: 150.0
  Root Mean Squared Residual error: 0.314
  R-sq Adjusted: 0.855

灵活的输出

通过 --out 开关修改输出。

CSV

> fitme y "m * x + c" file1.csv -o=csv -n
Parameter,Value,Standard Error,t-value
m,1.7709542029456211,0.011883297834310212,149.02884936809457
c,3.2099657167997013,0.013936863525869892,230.32195951702457

Markdown

> fitme y "m * x + c" file1.csv -o=md -n
| Parameter | Value | Standard Error | t-value |
|-----------|-------|----------------|---------|
| c         | 3.209 |          0.013 |   230.3 |
| m         | 1.770 |          0.011 |   149.0 |

JSON

> fitme y "m * x + c" file1.csv -o=json -n
{"parameter_names":["m","c"],"parameter_values":[1.7709542029456211,3.2099657167997013],"n":10,"xerrs":[0.011883297834310212,0.013936863525869892],"rmsr":0.04392493014188053,"rsq":0.9995948974725735,"tvals":[149.02884936809457,230.32195951702457]}

更多!

数学表达式

  • +,-,*,/
  • %:余数
  • ^:幂
  • pi,e
  • sqrt(), abs()
  • exp(), ln(), log()
  • sin(), cos(), tan()
  • sinh(), cosh(), tanh()
  • floor(), ceil(), round()

🔬 如果需要更多的数学支持,请提出问题

示例方程

线性

  • 方程:y = Ax + B
  • 列:y, x
  • 参数:A, B
> fitme y "Ax + B"

多元线性回归

  • 方程:y = P0 * x0 + P1 * x1 + ... + Pn * xn + C
  • 列:y, x0, x1, ..., xn
  • 参数:P0, P1, ..., Pn, C
> fitme y "P0 * x0 + P1 * x1 + ... + Pn * xn + C"

正态分布

目标是拟合累积分布函数(CDF),因此输入CSV将以 P 作为概率 [0,1],以 x 作为变量。

$$P = {1\over2} \bigg\lbrack {1 + erf \Big( {{x-\mu}\over{\sigma^2\sqrt2}} \Big)}\bigg\rbrack$$

我们可以用以下方式近似 erf 函数

$$erf(x) \approx \tanh \big( {\sqrt{\pi}\log(2)x} \big)$$

因此

P = {1\over2} \bigg\lbrack 
  {1 + \tanh \Big( 
    {{(x-\mu)\sqrt\pi\log(2)}\over{\sigma^2\sqrt2}} 
  \Big)}
\bigg\rbrack

这转化为表达式

0.5 * (1 + tanh(((x - Mean) * sqrt(pi) * log(2)) / (Stdev^2 * sqrt(2))))

Parameters: Mean, Stdev
Variables: x

并用于拟合

> fitme P  "0.5 * (1 + tanh(((x - Mean) * sqrt(pi) * log(2)) / (Stdev^2 * sqrt(2))))"

依赖项

~9MB
~162K SLoC