50 个版本 (18 个破坏性版本)

0.19.4 2023年10月23日
0.18.2 2023年10月19日

#151机器学习

Download history 2/week @ 2024-03-07 4/week @ 2024-03-28 1/week @ 2024-04-04

每月下载量 427 次

MIT 许可证

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::gradientFunction::hessian
  • genetic。遗传算法。
  • 模拟退火。模拟退火。

--criterion [浮点数]

基于梯度的收敛标准。当梯度小于此值时,优化器停止。请注意,这需要局部凸函数。

默认为 1.0e-3

接受一个浮点数。

--maxiter [整数]

最大优化迭代次数。

默认为 100

接受一个整数。

--maxtemp [浮点数]

最大温度。这仅用于模拟退火范式。

默认为 1.0

接受一个浮点数。

--stdev [浮点数]

突变的标准差。这仅用于随机方法(遗传优化和模拟退火)。

默认为 1.0

接受一个浮点数。

依赖项

~1MB
~21K SLoC