baggepinnen / MonteCarloMeasurements.jl

Propagation of distributions by Monte-Carlo sampling: Real number types with uncertainty represented by samples.
https://baggepinnen.github.io/MonteCarloMeasurements.jl/stable/
MIT License
261 stars 17 forks source link

How to make MonteCarloMeasurements work with Optim #82

Closed hzgzh closed 4 years ago

hzgzh commented 4 years ago
using MonteCarloMeasurements,Optim
f(x)=(1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
x=[0.0±0.0,0.0±0.1]
optimize(f,x)

ERROR: MethodError: no method matching -(::Particles{Float64,2000}, ::Array{Float64,1}) Closest candidates are: -(::Particles{T,N}) where {T, N} at C:\Users\Administrator.julia\packages\MonteCarloMeasurements\J2g8U\src\register_primitive.jl:95 -(::Real, ::Complex{Bool}) at complex.jl:304 -(::Real, ::Complex) at complex.jl:316 ... Stacktrace: [1] (::Statistics.var"#8#9"{Array{Float64,1}})(::Particles{Float64,2000}) at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Statistics\src\Statistics.jl:219 [2] _mapreduce(::Statistics.var"#8#9"{Array{Float64,1}}, ::typeof(+), ::IndexLinear, ::Array{Particles{Float64,2000},1}) at .\reduce.jl:400 [3] _mapreduce_dim(::Function, ::Function, ::NamedTuple{(),Tuple{}}, ::Array{Particles{Float64,2000},1}, ::Colon) at .\reducedim.jl:312 [4] #mapreduce#580 at .\reducedim.jl:307 [inlined] [5] mapreduce(::Function, ::Function, ::Array{Particles{Float64,2000},1}) at .\reducedim.jl:307 [6] centralize_sumabs2(::Array{Particles{Float64,2000},1}, ::Array{Float64,1}) at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Statistics\src\Statistics.jl:220 [7] _varm(::Array{Particles{Float64,2000},1}, ::Array{Float64,1}, ::Bool, ::Colon) at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Statistics\src\Statistics.jl:307 [8] #varm#11 at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Statistics\src\Statistics.jl:297 [inlined] [9] _var at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Statistics\src\Statistics.jl:340 [inlined] [10] #var#15 at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Statistics\src\Statistics.jl:335 [inlined] [11] var at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\Statistics\src\Statistics.jl:335 [inlined] [12] nmobjective(::Array{Particles{Float64,2000},1}, ::Int64, ::Int64) at C:\Users\Administrator.julia\packages\Optim\SFpsz\src\multivariate\solvers\zeroth_order\nelder_mead.jl:104 [13] initial_state(::NelderMead{Optim.AffineSimplexer,Optim.AdaptiveParameters}, ::Optim.Options{Float64,Nothing}, ::NonDifferentiable{Particles{Float64,2000},Array{Particles{Float64,2000},1}}, ::Array{Particles{Float64,2000},1}) at C:\Users\Administrator.julia\packages\Optim\SFpsz\src\multivariate\solvers\zeroth_order\nelder_mead.jl:171 [14] optimize(::NonDifferentiable{Particles{Float64,2000},Array{Particles{Float64,2000},1}}, ::Array{Particles{Float64,2000},1}, ::NelderMead{Optim.AffineSimplexer,Optim.AdaptiveParameters}, ::Optim.Options{Float64,Nothing}) at C:\Users\Administrator.julia\packages\Optim\SFpsz\src\multivariate\optimize\optimize.jl:33 [15] optimize(::Function, ::Array{Particles{Float64,2000},1}; inplace::Bool, autodiff::Symbol, kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at C:\Users\Administrator.julia\packages\Optim\SFpsz\src\multivariate\optimize\interface.jl:64 [16] optimize(::Function, ::Array{Particles{Float64,2000},1}) at C:\Users\Administrator.julia\packages\Optim\SFpsz\src\multivariate\optimize\interface.jl:58

[18] eval(::Module, ::Any) at .\boot.jl:331 [19] eval_user_input(::Any, ::REPL.REPLBackend) at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.4\REPL\src\REPL.jl:86 [20] run_backend(::REPL.REPLBackend) at C:\Users\Administrator.julia\packages\Revise\tV8FE\src\Revise.jl:1165 [21] top-level scope at none:0

baggepinnen commented 4 years ago

See some of the examples https://github.com/baggepinnen/MonteCarloMeasurements.jl/blob/master/examples/autodiff_robust_opt.jl

https://github.com/baggepinnen/MonteCarloMeasurements.jl/blob/master/examples/robust_controller_opt.jl

baggepinnen commented 4 years ago

I think the problem is that your objective function is not a scalar, it's a distribution. I'm not sure if it makes sense to have the decision variable be uncertain, it makes more sense if the parameters of the cost function are uncertain. Here's an example where the problem parameters are uncertain and where the objective is reduced to a scalar

Example:

julia> const p1, p2 = 1 ∓ 0.3, 100 ∓ 5
(1.0 ± 0.3, 100.0 ± 5.0)

julia> f(x) = maximum((p1 - x[1])^2 + p2 * (x[2] - x[1]^2)^2)
f (generic function with 1 method)

julia> x = [0.5, 0.5]
2-element Array
{Float64,1}:
 0.5
 0.5

julia> res = optimize(f, x);

julia> @show res.minimizer
res.minimizer = [0.9999999905310097, 0.9999984765966677]
2-element Array{Float64,1}:
 0.9999999905310097
 0.9999984765966677
hzgzh commented 4 years ago

learn lot,need optim to support