使用 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

https://docs.julialang.org/en/latest/manual/types/