首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Miximum似然-使用Optim

Miximum似然-使用Optim
EN

Stack Overflow用户
提问于 2018-05-31 22:08:42
回答 1查看 311关注 0票数 0

亲爱的用户的语言朱莉娅。我在使用optimize Optim包的函数时遇到了问题。下面的代码有什么错误?

代码语言:javascript
运行
复制
using Optim
using Distributions

rng = MersenneTwister(1234);

d = Weibull(1,1)
x = rand(d,1000)


function pdf_weibull(x, lambda, k)  
    k/lambda * (x/lambda).^(k-1) * exp((-x/lambda)^k)

end


function obj(x::Vector, lambda, k)
    soma = 0
    for i in x
        soma = soma + log(pdf_weibull(i,lambda,k))
    end
    -soma
end

obj(x, pars) = obj(x, pars...)

optimize(vars -> obj(x, vars...), [1.0,1.0])

输出

代码语言:javascript
运行
复制
julia> optimize(vars -> obj(x, vars...), [1.0,1.0])
ERROR: DomainError:
Exponentiation yielding a complex result requires a complex argument.
Replace x^y with (x+0im)^y, Complex(x)^y, or similar.
Stacktrace:
 [1] nan_dom_err at ./math.jl:300 [inlined]
 [2] ^ at ./math.jl:699 [inlined]
 [3] (::##2#4)(::Float64, ::Float64, ::Float64) at ./<missing>:0
 [4] pdf_weibull(::Float64, ::Float64, ::Float64) at ./REPL[6]:2
 [5] obj(::Array{Float64,1}, ::Float64, ::Float64) at ./REPL[7]:4
 [6] (::##5#6)(::Array{Float64,1}) at ./REPL[11]:1
 [7] value(::NLSolversBase.NonDifferentiable{Float64,Array{Float64,1},Val{false}}, ::Array{Float64,1}) at /home/pedro/.julia/v0.6/NLSolversBase/src/interface.jl:19
 [8] initial_state(::Optim.NelderMead{Optim.AffineSimplexer,Optim.AdaptiveParameters}, ::Optim.Options{Float64,Void}, ::NLSolversBase.NonDifferentiable{Float64,Array{Float64,1},Val{false}}, ::Array{Float64,1}) at /home/pedro/.julia/v0.6/Optim/src/multivariate/solvers/zeroth_order/nelder_mead.jl:139
 [9] optimize(::NLSolversBase.NonDifferentiable{Float64,Array{Float64,1},Val{false}}, ::Array{Float64,1}, ::Optim.NelderMead{Optim.AffineSimplexer,Optim.AdaptiveParameters}, ::Optim.Options{Float64,Void}) at /home/pedro/.julia/v0.6/Optim/src/multivariate/optimize/optimize.jl:25
 [10] #optimize#151(::Array{Any,1}, ::Function, ::Tuple{##5#6}, ::Array{Float64,1}) at /home/pedro/.julia/v0.6/Optim/src/multivariate/optimize/interface.jl:62
 [11] #optimize#148(::Array{Any,1}, ::Function, ::Function, ::Array{Float64,1}) at /home/pedro/.julia/v0.6/Optim/src/multivariate/optimize/interface.jl:52
 [12] optimize(::Function, ::Array{Float64,1}) at /home/pedro/.julia/v0.6/Optim/src/multivariate/optimize/interface.jl:52
 [13] macro expansion at ./REPL.jl:97 [inlined]
 [14] (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:73

求解指标weibull分布的参数的极大似然估计是一个简单的问题。

诚挚的问候。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-01 06:40:42

造成问题的原因是您对pdf_weibull的定义不正确。以下是一个修正后的定义:

代码语言:javascript
运行
复制
function pdf_weibull(x, lambda, k)
    k/lambda * (x/lambda)^(k-1) * exp(-(x/lambda)^k)
end

注意,我已经在表达式的-部分中移动了exp符号。如果您更改了,所有这些都将如预期的那样工作。

现在-为什么朱莉娅要和DomainError抱怨。原因是,由于代码中的错误,您尝试计算类似(-1.0)^0.5的值。在朱莉娅中,^是以类型稳定的方式实现的。这尤其意味着,当将Float64作为两个参数传递时,它保证返回Float64或抛出错误。显然,不能在实际域中计算(-1.0)^0.5 --这就是抛出错误的原因。如果您通过了(-1+0im)^0.5,那么就不会出现错误,因为我们将一个复数传递给^,所以结果也可以是类型稳定的复数。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50633483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档