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