使用 Distributions.jl 和不同参数向量的给定分布的样本数据
Sample data from a given distribution using Distributions.jl with a vector of different parameters
我想我可以找到一些不同的 hack 来做我想做的事,但我不确定在 Julia 中什么是最佳实践。
我想编写一个函数来从具有不同参数的给定分布类型生成样本。使用 Distributions.jl 包,似乎我需要为每组参数创建一个适当分布的对象,并将这些参数作为参数传递。为此,我需要以某种方式传递分布类型,然后从该类型创建对象。最好在这里使用参数函数吗?或者有一个分布对象参数并使用typeof?
我当前的代码在下面,它似乎可以工作,但我觉得必须传递一个随机对象来指定分布类型,而不是以更优雅的方式传递类型本身,这让我觉得有点笨拙。
function generateSamples(dist::UnivariateDistribution, thetas::AbstractVector, numSamples::Array{Int64,1}; shuffled=true)
@assert length(thetas) == length(numSamples)
M=length(thetas)
N=sum(numSamples)
data=zeros(Float64, N)
n=0
for i in 1:M
n_i=numSamples[i]
dist_i=typeof(dist)(thetas[i]...)
for j in 1:n_i
data[n+j]=rand(dist_i)
end
n+=n_i
end
if shuffled
shuffle!(data)
end
return data
end
这是我的做法,
using Distributions
function foo(::Type{T}, numsamples, dist_parameters...) where T<:Distribution
dist = T(dist_parameters...)
...
end
foo(Normal, 5)
我不知道你需要什么样的分发参数,所以你不能在签名末尾使用Varargs
。我认为这是一个很好的做法,Julia-way 可以这样做(即创建一个整数 0 的数组,您可以调用 zeros(Int, ...)
)
https://docs.julialang.org/en/latest/manual/methods/#Parametric-Methods-1
我想我可以找到一些不同的 hack 来做我想做的事,但我不确定在 Julia 中什么是最佳实践。
我想编写一个函数来从具有不同参数的给定分布类型生成样本。使用 Distributions.jl 包,似乎我需要为每组参数创建一个适当分布的对象,并将这些参数作为参数传递。为此,我需要以某种方式传递分布类型,然后从该类型创建对象。最好在这里使用参数函数吗?或者有一个分布对象参数并使用typeof?
我当前的代码在下面,它似乎可以工作,但我觉得必须传递一个随机对象来指定分布类型,而不是以更优雅的方式传递类型本身,这让我觉得有点笨拙。
function generateSamples(dist::UnivariateDistribution, thetas::AbstractVector, numSamples::Array{Int64,1}; shuffled=true)
@assert length(thetas) == length(numSamples)
M=length(thetas)
N=sum(numSamples)
data=zeros(Float64, N)
n=0
for i in 1:M
n_i=numSamples[i]
dist_i=typeof(dist)(thetas[i]...)
for j in 1:n_i
data[n+j]=rand(dist_i)
end
n+=n_i
end
if shuffled
shuffle!(data)
end
return data
end
这是我的做法,
using Distributions
function foo(::Type{T}, numsamples, dist_parameters...) where T<:Distribution
dist = T(dist_parameters...)
...
end
foo(Normal, 5)
我不知道你需要什么样的分发参数,所以你不能在签名末尾使用Varargs
。我认为这是一个很好的做法,Julia-way 可以这样做(即创建一个整数 0 的数组,您可以调用 zeros(Int, ...)
)
https://docs.julialang.org/en/latest/manual/methods/#Parametric-Methods-1