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 数学
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
- 参数:m,c
要运行拟合,只需使用 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