马诺普特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 .* (e2.values .< 0))
Q = e2.vectors
Uprime = Q' * p_sqrt_inv * U * p_sqrt_inv * Q
Lprime = Q' * p_sqrt_inv * L * p_sqrt_inv * Q
P = cholesky(Hermitian(Uprime - Lprime))
z = P.U' * D * P.U + Lprime
copyto!(M, q, p_sqrt * Q * z * Q' * p_sqrt)
return q
end
N = m
U = mean(data2)
L = inv(sum(1 / N * 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' * A * x
egrad(G, x, p = nothing) = (G .= -2 * A * 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