【发布时间】:2021-01-06 10:58:17
【问题描述】:
这里是新手
我正在尝试使用 optim.jl 最小化 Julia 中的一个函数。该功能有效,但是当我尝试对其进行优化时,它给了我以下错误消息:
MethodError: no method matching -(::Float64, ::Array{Float64,1})
For element-wise subtraction, use broadcasting with dot syntax: scalar .- array
Closest candidates are:
-(::Float64, !Matched::Float64) at float.jl:403
-(::Float64) at float.jl:393
-(::Real, !Matched::Complex{Bool}) at complex.jl:302
...
Stacktrace:
[1] _broadcast_getindex_evalf at ./broadcast.jl:648 [inlined]
[2] _broadcast_getindex at ./broadcast.jl:621 [inlined]
[3] getindex at ./broadcast.jl:575 [inlined]
[4] copy at ./broadcast.jl:876 [inlined]
[5] materialize at ./broadcast.jl:837 [inlined]
[6] broadcast_preserving_zero_d at ./broadcast.jl:826 [inlined]
[7] -(::Array{Float64,1}, ::Array{Array{Float64,1},1}) at ./arraymath.jl:39
[8] objective(::Array{Float64,1}) at ./In[147]:4
[9] value!!(::NonDifferentiable{Float64,Array{Float64,1}}, ::Array{Float64,1}) at /ext/julia/depot/packages/NLSolversBase/NsXIC/src/interface.jl:9
[10] initial_state(::NelderMead{Optim.AffineSimplexer,Optim.AdaptiveParameters}, ::Optim.Options{Float64,Nothing}, ::NonDifferentiable{Float64,Array{Float64,1}}, ::Array{Float64,1}) at /ext/julia/depot/packages/Optim/TNmSw/src/multivariate/solvers/zeroth_order/nelder_mead.jl:158
[11] optimize(::NonDifferentiable{Float64,Array{Float64,1}}, ::Array{Float64,1}, ::NelderMead{Optim.AffineSimplexer,Optim.AdaptiveParameters}, ::Optim.Options{Float64,Nothing}) at /ext/julia/depot/packages/Optim/TNmSw/src/multivariate/optimize/optimize.jl:33
[12] optimize(::Function, ::Array{Float64,1}; inplace::Bool, autodiff::Symbol, kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /ext/julia/depot/packages/Optim/TNmSw/src/multivariate/optimize/interface.jl:64
[13] optimize(::Function, ::Array{Float64,1}) at /ext/julia/depot/packages/Optim/TNmSw/src/multivariate/optimize/interface.jl:58
[14] top-level scope at In[148]:3
[15] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1091
这是我的代码:
function objective(b)
x = x1[:,2]
b = fill(b,T)
u = y - x.*b
obj = sum(u.^2)
return obj
end
using Optim
Sol = optimize(objective,[0.0;0.0])
b_optim = Optim.minimizer(Sol)
,其中 x 和 y 是 Array{Float64,1}
我不明白这个错误信息。如果我理解正确,它会告诉我我正在尝试从一个数字中减去一个数组,而我没有这样做?!广播也不起作用。
【问题讨论】:
-
您没有在函数内定义
x1或y,因此函数从一般范围内获取这两个变量的值。我猜这与你所说的相反,y是Float64而不是数组。 -
顺便说一句,
T在你的函数中也没有定义。您应该将变量作为参数传递或在函数中定义它们。 -
感谢您的回复!我有更多的代码并定义了上面的所有内容,但我不想展示整个事情。 x1、y 和 T 不会改变,所以我没有将它们包含在公式中。所以你是说他们都必须在函数中才能工作? (即函数目标(x1,y,b,T)?
-
不,如果它们在一般范围内,它也可以工作,但这样做不是一个好习惯,因为您无法确定它们的真正含义,并且 JIT 无法优化该功能编译器。我会将它们作为参数传递,这样您就不会出错,并且为了调试,您可以尝试在您的函数中编写
println(y),以便您了解它的真正含义。 -
谢谢,我会努力的。我打印了 y,它是一个列向量 (Array{Float64,1})。丁字裤是该函数在我运行时不会返回错误消息,但优化中使用的函数会返回,所以我认为错误必须在某个地方的优化部分
标签: function optimization julia minimize minimization