python - 使用 Python 中的最小化时 Julia 中的函数和 Lambda 表达式
问题描述
我在 Julia 中有一个代码,我在其中使用 python 中的函数最小化。在这里,我放了一个简化的示例,它可以正常工作
using PyCall
@pyimport scipy.optimize as so
function fidelity1(x)
f1 = x[1]*x[1]+3*x[2]*x[2]
return f1
end
x0 = [1 1]
res = so.minimize(fidelity1,x0)
谁的结果是正确的
Dict{Any,Any} with 10 entries:
"hess_inv" => [0.5 3.0102e-12; 3.0102e-12 0.166667]
"fun" => 2.22049e-16
"nfev" => 18
"status" => 0
"message" => "Optimization terminated successfully."
"success" => true
"x" => [-7.45039e-9, -7.45073e-9]
"jac" => [3.73556e-13, -9.08177e-13]
"nit" => 4
"njev" => 6
现在,使用 lambda 表达式会非常有用,所以我按以下方式编写代码
using PyCall
@pyimport scipy.optimize as so
fidelity2 = (x1,x2) -> x1*x1+3*x2*x2
x0 = [1 1]
res = so.minimize(fidelity2,x0)
但是,在这种情况下,我得到
(in a Julia function called from Python)
JULIA: MethodError: no method matching (::var"#3#4")(::Array{Float64,1})
Closest candidates are:
#3(::Any, !Matched::Any) at In[2]:4
Stacktrace:
[1] #invokelatest#1 at ./essentials.jl:712 [inlined]
[2] invokelatest(::Any, ::Any) at ./essentials.jl:711
[3] _pyjlwrap_call(::Function, ::Ptr{PyCall.PyObject_struct}, ::Ptr{PyCall.PyObject_struct}) at /home/candeloro/.julia/packages/PyCall/tqyST/src/callback.jl:28
[4] pyjlwrap_call(::Ptr{PyCall.PyObject_struct}, ::Ptr{PyCall.PyObject_struct}, ::Ptr{PyCall.PyObject_struct}) at /home/candeloro/.julia/packages/PyCall/tqyST/src/callback.jl:44
[5] macro expansion at /home/candeloro/.julia/packages/PyCall/tqyST/src/exception.jl:95 [inlined]
[6] #109 at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:43 [inlined]
[7] disable_sigint at ./c.jl:446 [inlined]
[8] __pycall! at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:42 [inlined]
[9] _pycall!(::PyObject, ::PyObject, ::Tuple{var"#3#4",Array{Int64,2}}, ::Int64, ::Ptr{Nothing}) at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:29
[10] _pycall!(::PyObject, ::PyObject, ::Tuple{var"#3#4",Array{Int64,2}}, ::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:11
[11] (::PyObject)(::Function, ::Vararg{Any,N} where N; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:86
[12] (::PyObject)(::Function, ::Vararg{Any,N} where N) at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:86
[13] top-level scope at In[2]:7
[14] eval at ./boot.jl:331 [inlined]
[15] softscope_include_string(::Module, ::String, ::String) at /home/candeloro/.julia/packages/SoftGlobalScope/u4UzH/src/SoftGlobalScope.jl:217
[16] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /home/candeloro/.julia/packages/IJulia/IDNmS/src/execute_request.jl:67
[17] #invokelatest#1 at ./essentials.jl:712 [inlined]
[18] invokelatest at ./essentials.jl:711 [inlined]
[19] eventloop(::ZMQ.Socket) at /home/candeloro/.julia/packages/IJulia/IDNmS/src/eventloop.jl:8
[20] (::IJulia.var"#15#18")() at ./task.jl:358
Stacktrace:
[1] pyerr_check at /home/candeloro/.julia/packages/PyCall/tqyST/src/exception.jl:62 [inlined]
[2] pyerr_check at /home/candeloro/.julia/packages/PyCall/tqyST/src/exception.jl:66 [inlined]
[3] _handle_error(::String) at /home/candeloro/.julia/packages/PyCall/tqyST/src/exception.jl:83
[4] macro expansion at /home/candeloro/.julia/packages/PyCall/tqyST/src/exception.jl:97 [inlined]
[5] #109 at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:43 [inlined]
[6] disable_sigint at ./c.jl:446 [inlined]
[7] __pycall! at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:42 [inlined]
[8] _pycall!(::PyObject, ::PyObject, ::Tuple{var"#3#4",Array{Int64,2}}, ::Int64, ::Ptr{Nothing}) at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:29
[9] _pycall!(::PyObject, ::PyObject, ::Tuple{var"#3#4",Array{Int64,2}}, ::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:11
[10] (::PyObject)(::Function, ::Vararg{Any,N} where N; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:86
[11] (::PyObject)(::Function, ::Vararg{Any,N} where N) at /home/candeloro/.julia/packages/PyCall/tqyST/src/pyfncall.jl:86
[12] top-level scope at In[2]:7
我不知道为什么第二个代码不起作用
解决方案
scipy.optimize.minimize
在您的情况下,期望目标函数fidelity2
将大小数组(n,)
作为其第一个参数,该参数保存n
自变量的值。在迁移到使用 lambda 表达式的第二种格式时,请注意您还更改了签名:fidelity2
期望不同函数参数中的自变量而不是数组中的自变量,但这不是操作scipy.optimize.minimize
方式。
如果您只想使用 lambda 表达式,则可以更改fidelity2
为更像第一个示例
using PyCall
@pyimport scipy.optimize as so
fidelity2 = x -> x[1]*x[1]+3*x[2]*x[2]
x0 = [1 1]
res = so.minimize(fidelity2, x0)
请注意,您不必命名您的 lambda 表达式。您可以在调用minimize
. 这意味着以下内容也有效:
using PyCall
@pyimport scipy.optimize as so
x0 = [1 1]
res = so.minimize(x -> x[1]*x[1]+3*x[2]*x[2], x0)
推荐阅读
- php - 将 PHP for 循环转换为 for each
- java - 无法从 Java 中读取 C++ 中保存的 Opencv Mat 图像
- c# - Json.NET - 在 winforms 中反序列化和解析 json 数据
- oracle - 登录sqlplus并在dockerfile中执行sql文件
- xslt-2.0 - XML合并两个文件不起作用
- python - 如何根据每日价格数据计算月收益?
- mediawiki - Mediawiki 的导航框模板未在个人 wiki 中显示框
- c# - 在我的 ASP.Net MVC 应用程序中,我真正需要多少个连接字符串?
- node.js - 谷歌表格客户端未定义节点
- kendo-ui - 从下拉列表中过滤剑道网格列