AnyMath 文档

使用符号分析。凸度证书的jl

该页面正在翻译中。

在本教程中,我们将展示如何使用优化问题的自动凸性认证https://github.com/Vaibhavdixit02/SymbolicAnalysis.jl[SymbolicAnalysis.jl]。

这适用于 结构分析 关键字参数 优化问题. 这告诉包尝试使用符号变量跟踪目标和约束(有关此查看的更多详细信息,请参阅https://symbolics.juliasymbolics.org/stable/manual/functions/#function_registration[Symbolics文档])。 这依赖于有纪律的编程方法,因此需要使用符号分析中的"原子"。jl包。

我们将用一个简单的例子来说明凸性结构认证过程。

using SymbolicAnalysis, Zygote, LinearAlgebra, Optimization, OptimizationLBFGSB

function f(x, p = nothing)
    return exp(x[1]) + x[1]^2
end

optf = OptimizationFunction(f, Optimization.AutoForwardDiff())
prob = OptimizationProblem(optf, [0.4], structural_analysis = true)

sol = solve(prob, OptimizationLBFGSB.LBFGSB(), maxiters = 1000)
retcode: Success
u: 1-element Vector{Float64}:
 -0.3517365907643902

结果可以访问为 分析结果 场的解决方案。

sol.cache.analysis_results.objective
SymbolicAnalysis.AnalysisResult(SymbolicAnalysis.Convex, SymbolicAnalysis.Positive, nothing)

相关地,您可以在黎曼优化问题中启用结构分析(仅在SPD流形上支持)。

我们将研究Spd矩阵的黎曼质心,这是已知的SPD流形上的测地线凸问题。

using Optimization, OptimizationManopt, Symbolics, Manifolds, Random, LinearAlgebra,
      SymbolicAnalysis

M = SymmetricPositiveDefinite(5)
m = 100
σ = 0.005
q = Matrix{Float64}(LinearAlgebra.I(5)) .+ 2.0

data2 = [exp(M, q, σ * rand(M; vector_at = q)) for i in 1:m];

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

opt = OptimizationManopt.GradientDescentOptimizer()
sol = solve(prob, opt, maxiters = 100)
retcode: Failure
u: 5×5 Matrix{Float64}:
 2.99973  1.99832  1.99887  1.99868  1.99957
 1.99832  2.99681  1.99758  1.99728  1.99829
 1.99887  1.99758  2.99771  1.99752  1.99855
 1.99868  1.99728  1.99752  2.99774  1.99845
 1.99957  1.99829  1.99855  1.99845  2.99924