使用符号分析。凸度证书的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