可以通过以下方式创建多元分布:
using Distributions
rand(MvNormal([1, 1.], [1 .5; .5 1]), 2)
但它不适用于整数:
using Distributions
rand(MvNormal([1, 1], [1 .5; .5 1]), 2)
为什么?
附言第二个例子会抛出一个错误:
LoadError: MethodError: `convert` has no method matching convert(::Type{Distributions.MvNormal{Cov<:PDMats.AbstractPDMat{T<:AbstractFloat},Mean<:Union{Array{Float64,1},Distributions.ZeroVector{Float64}}}}, ::Array{Int64,1}, ::Array{Float64,2})
This may have arisen from a call to the constructor Distributions.MvNormal{Cov<:PDMats.AbstractPDMat{T<:AbstractFloat},Mean<:Union{Array{Float64,1},Distributions.ZeroVector{Float64}}}(...),
since type constructors fall back to convert methods.
Closest candidates are:
Distributions.MvNormal(!Matched::Array{Float64,1}, ::Array{Float64,2})
call{T}(::Type{T}, ::Any)
convert{T}(::Type{T}, !Matched::T)
...
while loading In[113], in expression starting on line 2
in call at essentials.jl:57
最佳答案
在 Julia 中,数字 1
和 1.0
是非常不同的东西。第一个是 Integer
类型,第二个是 FloatingPoint
类型。所以[1, 1]
是一个整数数组,而 [1.0, 1.0]
是一个 float 数组。
该错误消息确切地告诉您它不起作用的原因,但使用所有类型参数进行解析可能有点困难。
MethodError 意味着它找不到具有匹配参数类型的方法。调用 convert(MvNormal{…}, ::Vector{Int}, ::Matrix{Float64}
失败.但是,您没有编写转换调用,因此它一定是在库中发生的。但是消息接着说,这可能是由于调用构造函数而发生的。也就是说,它无法匹配 MvNormal{…}(::Vector{Int}, ::Matrix{Float64})
形式的构造函数,所以它又回到了一个试图将参数转换为类型而不是构造它的内置方法。那正是你写的!该方法不存在。
消息然后给你最接近的匹配方法:MvNormal(::Vector{Float64}, ::Matrix{Float64)
, 它甚至突出显示与 !Matched
不匹配的参数.
那么,为什么它不起作用?因为没有人编写过允许整数向量的构造函数。但为什么不呢?在 Julia 中,Integers 和 FloatingPoint 数字的行为非常不同,因此通常仅在另一个没有特别意义的情况下才支持其中一个。与其他一些语言不同,您需要了解 1
之间的区别。和 1.0
.
关于statistics - 为什么 Julia Distribution 包不能使用整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35605163/