Nearest correlation
This example illustrates the sensitivity analysis of the nearest correlation problem studied in [H02].
Higham, Nicholas J. Computing the nearest correlation matrix—a problem from finance. IMA journal of Numerical Analysis 22.3 (2002): 329-343.
using DiffOpt, JuMP, SCS, LinearAlgebra
solver = SCS.Optimizer
function proj(A, dH = Diagonal(ones(size(A, 1))), H = ones(size(A)))
n = LinearAlgebra.checksquare(A)
model = Model(() -> DiffOpt.diff_optimizer(solver))
@variable(model, X[1:n, 1:n] in PSDCone())
@constraint(model, [i in 1:n], X[i, i] == 1)
@objective(model, Min, sum((H .* (X - A)) .^ 2))
MOI.set(
model,
DiffOpt.ForwardObjectiveFunction(),
sum((dH .* (X - A)) .^ 2),
)
optimize!(model)
DiffOpt.forward_differentiate!(model)
dX = MOI.get.(model, DiffOpt.ForwardVariablePrimal(), X)
return value.(X), dX
end
proj (generic function with 3 methods)
Example from [H02, p. 334-335]:
A = LinearAlgebra.Tridiagonal(ones(2), ones(3), ones(2))
3×3 LinearAlgebra.Tridiagonal{Float64, Vector{Float64}}:
1.0 1.0 ⋅
1.0 1.0 1.0
⋅ 1.0 1.0
The projection is computed as follows:
X, dX = proj(A)
The projection of A
is:
X
3×3 Matrix{Float64}:
1.0 0.760692 0.157299
0.760692 1.0 0.760692
0.157299 0.760692 1.0
The derivative of the projection with respect to a uniform increase of the weights of the diagonal entries is:
dX
3×3 Matrix{Float64}:
4.51811e-10 -0.320667 0.388476
-0.320667 -4.95757e-9 -0.320667
0.388476 -0.320667 1.01046e-8
Example from [H02, Section 4, p. 340]:
A = LinearAlgebra.Tridiagonal(-ones(3), 2ones(4), -ones(3))
4×4 LinearAlgebra.Tridiagonal{Float64, Vector{Float64}}:
2.0 -1.0 ⋅ ⋅
-1.0 2.0 -1.0 ⋅
⋅ -1.0 2.0 -1.0
⋅ ⋅ -1.0 2.0
The projection is computed as follows:
X, dX = proj(A)
The projection of A
is:
X
4×4 Matrix{Float64}:
1.0 -0.808429 0.191591 0.106775
-0.808429 1.0 -0.656241 0.191591
0.191591 -0.656241 1.0 -0.808429
0.106775 0.191591 -0.808429 1.0
The derivative of the projection with respect to a uniform increase of the weights of the diagonal entries is:
dX
4×4 Matrix{Float64}:
0.101794 0.228659 -0.0880999 -0.0490992
0.228659 0.0565821 0.158679 -0.0880999
-0.0880999 0.158679 0.0565821 0.228659
-0.0490992 -0.0880999 0.228659 0.101794
This page was generated using Literate.jl.