【发布时间】:2017-10-11 23:04:24
【问题描述】:
我是 JULIA 语言的新手,我正在尝试通过优化 P1 和 P2 最小化目标函数 RMSE 来执行带约束的全局优化。我尝试运行 JumpP 算法,但收到很多错误。如果您能向我推荐一个可行的软件包或帮助我修复我的错误,我将不胜感激?
using CSV
using JuMP, Ipopt
using Optim
using JuMP
using GLPKMathProgInterface
function READING()
cd("\\\\RichardHadlee\\user1\\GalvezJ\\Documents\\JULIAPRO")
table1 = CSV.read("table3.6.csv")
Datas = Array(table1[1])
Ydata = Array(table1[2])
println( Datas, Ydata)
return Datas, Ydata
end
function RMSE(Datas, P1,P2)
ParticleSize(Datas, P1,P2) = (1.+(P1./Datas).^P2).^(-(1.-2./P2))
RMSE(P1,P2) = sum(((ParticleSize(Datas, P1,P2) - Ydata)).^2.)
result = RMSE3(P1,P2)
return result
end
function FITTING2()
Datas, Ydata = READING()
println("read")
myModel = Model(solver=GLPKSolverLP())
@variable(myModel, P2 <= 1)
@variable(myModel, 2 <= P1)
JuMP.register(myModel, :RMSE, 2, RMSE, autodiff=true)
@NLobjective(myModel, Min, RMSE(Datas, P1, P2))
solve(myModel) # solves the model
println("End")
end
FITTING2()
控制台中的错误消息
LoadError: MethodError: no method matching getname(::Int64
我已经按照说明进行了一些更改,但仍然无法正常工作。我在下面复制它以防有人可以提供帮助。这种优化的任何替代方法都将受到欢迎。非常感谢!
function READING()
cd("\\\\RichardHadlee\\user1\\GalvezJ\\Documents\\JULIAPRO")
table1 = CSV.read("table3.6.csv")
Datum = Array(table1[1])
Ydata = Array(table1[2])
global Datum, Ydata
return Datum, Ydata
end
function RMSE_Error(P1,P2)
global Datum, Ydata
RMSE_Sum = 0.0
Len_Datum = length(Datum)
for i in 1:Len_Datum
println(i," " ,Datum[i])
ParticleSize(Datum,P1,P2) = (1.0+(P1/Datum[i])^P2)^(2/P2-1)
println("PS ", ParticleSize(Datum,P1,P2))
RMSE(P1,P2, Datum, Ydata) = (ParticleSize(Datum,P1,P2) - Ydata[i])^2.0
RMSE_Sum = RMSE_Sum + RMSE(P1,P2, Datum, Ydata)
end
println("RMSE=", RMSE_Sum)
return RMSE_Sum
end
function FITTING()
Datum, Ydata = READING()
println("read")
myModel = Model(solver=GLPKSolverLP())
@variable(myModel, P1 <= 1.)
@variable(myModel, P2 >= 2.)
JuMP.register(myModel, :RMSE_Error, 2, RMSE_Error, autodiff=true)
@NLobjective(myModel, Min, RMSE_Error( P1, P2))
solve(myModel) # solves the model
end
FITTING()
我设法找到了解决方案。如果没有更好的选择,我会坚持下去。谢谢!
using BalckBoxOptim
function sqerror(p, Datum, Ydata)
println( p[1]," " ,p[2])
err = 0.0
for i in 1:length(Datum)
pred_i = (1.0+(p[1]/Datum[i])^p[2])^(2.0/p[2]-1.0)
err += (Ydata[i] - pred_i)^2
end
println("Error: ", err)
return err
end
function Testing()
Datum, Ydata = READING()
res = bboptimize(p ->sqerror(p, Datum, Ydata); SearchRange = [(0.0001, 100.0), (2., 100.)], NumDimensions = 2, MaxSteps=5000000)
end
Testing()
【问题讨论】:
-
这些天对我来说没有太多的 julia 编程,但这里有一些问题是显而易见的:(1)
JuMP.register()需要一个参数来标记预期有多少输入。你给了 2,而你的函数需要 3。 (2) 你让 JuMP 使用 GLPKSolverLP,它用于线性规划。这对您的问题不起作用,即使 (1) 已修复(ipopt 是这里的候选者)。if you could suggest me a package that works:当我稍微使用 julia 时,JuMP 是我见过的最强大的数学编程库(除了 convejl;其他场景)。如果使用正确,JuMP 可以工作。 -
啊和 (3):JuMP 说:用户定义函数的所有参数都必须是标量。对于 Datas 来说当然不是这样,它甚至不是一个 opt 变量。 (4) 我怀疑你需要更多的经验。我希望您知道自己在做什么(使用 JuMP),而不是例如 Optim.jl(后者对我来说更有吸引力,因为您的问题只是不受约束/有界约束)。
-
您的编辑忽略了我对您的方法的 50% 的抱怨,您甚至没有发布 现在 发生的错误/问题。
标签: optimization julia mathematical-optimization julia-jump