AnyMath 文档

马诺普特jl

该页面正在翻译中。

Manopt.jl是一个包,为黎曼流形上定义的优化问题提供求解器。 实现基于https://github.com/JuliaManifolds/ManifoldsBase.jl[ManifoldsBase.jl]接口,因此可以用于在https://github.com/JuliaManifolds/Manifolds.jl[歧管]或使用接口实现的任何其它歧管。

安装:OptimizationManopt。jl

来使用优化。Jl接口到Manopt,安装OptimizationManopt包:

import Pkg;
Pkg.add("OptimizationManopt");

方法

以下方法可用于 优化管理 包裹:

* 渐变,渐变:对应于https://manoptjl.org/stable/solvers/gradient_descent/[渐变_渐变]Manopt中的方法。 * NelderMeadOptimizer酶卯煤篓录 :对应于https://manoptjl.org/stable/solvers/NelderMead/[内尔德米德]Manopt中的方法。 * [医]偶联剂,偶联剂:对应于https://manoptjl.org/stable/solvers/conjugate_gradient_descent/[[医]共轭的,共轭的]Manopt中的方法。 * 粒子优化器:对应于https://manoptjl.org/stable/solvers/particle_swarm/[刨花板,刨花板]Manopt中的方法。 * QuasiNewtonOptimizer酶卯煤篓录:对应于https://manoptjl.org/stable/solvers/quasi_Newton/[quasi_新闻中心]Manopt中的方法。 * CMAESOptimizer,CMAESOptimizer:对应于https://manoptjl.org/stable/solvers/cma_es/[cma_es]Manopt中的方法。 * ConvexBundleOptimizer的:对应于https://manoptjl.org/stable/solvers/convex_bundle_method/[convex_bundle_method]Manopt中的方法。 * FrankWolfeOptimizer的:对应于https://manoptjl.org/stable/solvers/FrankWolfe/[弗兰克沃夫]Manopt中的方法。

常见的夸格 最大的,最大的, 最大时间阿布斯托尔 所有优化器都支持。 来自Manopt的求解器特定kwargs可以传递给 解决方案 功能或 优化问题.

注意 优化问题 必须通过歧管作为 歧管,歧管 关键字参数。

例子:

欧几里德流形上的Rosenbrock函数可以使用 渐变,渐变 如下:

using Optimization, OptimizationManopt, Manifolds, LinearAlgebra
rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
x0 = zeros(2)
p = [1.0, 100.0]

R2 = Euclidean(2)

stepsize = Manopt.ArmijoLinesearch(R2)
opt = OptimizationManopt.GradientDescentOptimizer()

optf = OptimizationFunction(rosenbrock, Optimization.AutoZygote())

prob = OptimizationProblem(
    optf, x0, p; manifold = R2, stepsize = stepsize)

sol = Optimization.solve(prob, opt)
retcode: Failure
u: 2-element Vector{Float64}:
 0.8165527190561593
 0.6672818138967234

采用Frank-Wolfe算法的SPD流形上的盒约束Karcher均值问题可以如下求解:

M = SymmetricPositiveDefinite(5)
m = 100
σ = 0.005
q = Matrix{Float64}(I, 5, 5) .+ 2.0
data2 = [exp(M, q, σ * rand(M; vector_at = q)) for i in 1:m]

f(x, p = nothing) = sum(distance(M, x, data2[i])^2 for i in 1:m)
optf = OptimizationFunction(f, Optimization.AutoZygote())
prob = OptimizationProblem(optf, data2[1]; manifold = M, maxiters = 1000)

function closed_form_solution!(M::SymmetricPositiveDefinite, q, L, U, p, X)
    # extract p^1/2 and p^{-1/2}
    (p_sqrt_inv, p_sqrt) = Manifolds.spd_sqrt_and_sqrt_inv(p)
    # Compute D & Q
    e2 = eigen(p_sqrt_inv * X * p_sqrt_inv) # decompose Sk  = QDQ'
    D = Diagonal(1.0 .&ast; (e2.values .< 0))
    Q = e2.vectors

    Uprime = Q' &ast; p_sqrt_inv &ast; U &ast; p_sqrt_inv &ast; Q
    Lprime = Q' &ast; p_sqrt_inv &ast; L &ast; p_sqrt_inv &ast; Q
    P = cholesky(Hermitian(Uprime - Lprime))
    z = P.U' &ast; D &ast; P.U + Lprime
    copyto!(M, q, p_sqrt &ast; Q &ast; z &ast; Q' &ast; p_sqrt)
    return q
end
N = m
U = mean(data2)
L = inv(sum(1 / N &ast; inv(matrix) for matrix in data2))

optf = OptimizationFunction(f, Optimization.AutoZygote())
prob = OptimizationProblem(optf, U; manifold = M, maxiters = 1000)

sol = Optimization.solve(
    prob, opt, sub_problem = (M, q, p, X) -> closed_form_solution!(M, q, L, U, p, X))
retcode: Failure
u: 5×5 Matrix{Float64}:
 3.00075  2.00072  2.0006   2.00096  2.00083
 2.00072  3.00063  2.00062  2.00087  2.00075
 2.0006   2.00062  3.00057  2.00083  2.00069
 2.00096  2.00087  2.00083  3.00109  2.00091
 2.00083  2.00075  2.00069  2.00091  3.00082

这个例子是基于https://juliamanifolds.github.io/ManoptExamples.jl/stable/examples/Riemannian-mean/[示例]在Manopt和https://doi.org/10.1007/s10107-022-01840-5[韦伯和Sra'22]。

以下示例改编自ManoptExamples中的Rayleigh商示例。jl. 我们解决了球体流形上的瑞利商问题:

using Optimization, OptimizationManopt
using Manifolds, LinearAlgebra
using Manopt

n = 1000
A = Symmetric(randn(n, n) / n)
manifold = Sphere(n - 1)

cost(x, p = nothing) = -x' &ast; A &ast; x
egrad(G, x, p = nothing) = (G .= -2 &ast; A &ast; x)

optf = OptimizationFunction(cost, grad = egrad)
x0 = rand(manifold)
prob = OptimizationProblem(optf, x0, manifold = manifold)

sol = solve(prob, GradientDescentOptimizer())
retcode: Failure
u: 1000-element Vector{Float64}:
 -0.05635877976156946
  0.024972479869967958
 -0.042446185642291204
  0.016901249740665907
 -0.021195769149943557
  0.06439067467761396
  0.021795426503740077
 -0.03614790557763343
  0.010489759331151776
  0.025866287619346135
  ⋮
 -0.09023891416070866
  0.0012325267388838726
  0.017690439379745435
  0.005814031738752353
 -0.03553417657301701
 -0.028040967629039282
 -0.009162216537831247
  0.008862821923726437
  0.05796123516764238

让我们检查这确实对应于矩阵的最小特征值 A.

@show eigmin(A)
@show sol.objective
-0.06296297105958523