50 个版本 (18 个破坏性版本)
0.19.4 | 2023年10月23日 |
---|---|
0.18.2 | 2023年10月19日 |
#151 在 机器学习
每月下载量 427 次
28KB
525 行
QOpt
一个简单的优化包。
优化范式
QOpt 的最新版本支持以下范式。
- 最速下降法(梯度下降法)
- 牛顿法
- 遗传优化
- 模拟退火
入门指南
导入 maria-linalg
为了使用此包,您必须导入 Rust crate maria-linalg
的最新版本。
创建目标函数
首先,您必须定义一个目标函数 struct
。这代表一个接受 N
-维向量并输出标量的函数。
Optimizer
接受最多三个函数。
Function::objective
(必需)。接受连续和离散输入。求值为函数输出(f64
)。Function::gradient
(可选)。接受连续输入。求值为函数梯度(Vector<N>
)。Function::hessian
(可选)。接受连续输入。求值为函数 Hessian(Matrix<N>
)。
请参阅下面的示例。请注意,您还必须导入 maria_linalg::Vector
和(如果您实现 Hessian)maria_linalg::Matrix
。
use qopt::Function;
use maria_linalg::{Matrix, Veector};
/// Number of continuous variables.
const C: usize = 6;
/// Number of discrete variables.
const D: usize = 0;
fn objective(&self, continuous: Vector<C>, discrete: Vector<D>) -> f64 {
// Required
}
fn gradient(&self, continuous: Vector<C>) -> Vector<C> {
// Optional
}
fn hessian(&self, continuous: Vector<C>) -> Matrix<C> {
// Optional
}
创建 Optimizer
一旦您有了 objective
函数,您就可以创建您的 Optimizer
。
use qopt::Optimizer;
/// Number of individuals per optimization iteration.
///
/// For deterministic methods (gradient descent or Newton's method), this should be 1.
/// For stochastic methods (genetic optimization or simulated annealing), this should be about 100.
const POPULATION: usize = 100;
fn main() {
let f = MyFunction::new();
let optimizer: Optimizer<C, D, POPULATION> = Optimizer::new(objective, Some (gradient), Some (hessian));
// An initial guess for our continuous variables
let c = Vector::zero();
// An initial guess for our discrete variables
let d = Vector::zero();
let output = optimizer.optimize(c, d, &[]);
println!("{}", output);
}
运行优化器
现在您可以使用命令行参数运行优化器。
执行优化器的命令结构如下。
$ cargo run --release --quiet -- [--flag] [--parameter value]
或者,如果您已经编写了一个二进制文件,您可以根据相同的规则运行该二进制文件。假设二进制文件名为 myoptimizer
。
$ myoptimizer [--flag] [--parameter value]
命令行参数
以下是可以接受的命令行参数和值。请注意,所有参数都是可选的。
--opt-帮助
打印帮助菜单。
--quiet
不打印状态更新。
--no-stop-early
禁用基于梯度的收敛标准。
--print-every [整数]
每次状态更新的迭代次数。
默认为 0
。这是“安静”选项。直到优化器收敛或达到最大迭代限制,不会打印状态。
接受一个整数。例如,如果这个整数是 5
,则优化器每第五次迭代打印一次状态更新。
--paradigm [字符串]
优化范式。
默认为 最速下降
。
接受以下选项。
最速下降
。最速(梯度)下降。建议(但不强制)为此实现Function::gradient
。newton
。牛顿法。建议(但不强制)为此实现Function::gradient
和Function::hessian
。genetic
。遗传算法。模拟退火
。模拟退火。
--criterion [浮点数]
基于梯度的收敛标准。当梯度小于此值时,优化器停止。请注意,这需要局部凸函数。
默认为 1.0e-3
。
接受一个浮点数。
--maxiter [整数]
最大优化迭代次数。
默认为 100
。
接受一个整数。
--maxtemp [浮点数]
最大温度。这仅用于模拟退火范式。
默认为 1.0
。
接受一个浮点数。
--stdev [浮点数]
突变的标准差。这仅用于随机方法(遗传优化和模拟退火)。
默认为 1.0
。
接受一个浮点数。
依赖项
~1MB
~21K SLoC