在給定一些資料的情況下,近似模型的最大似然的一種簡單方法是網格近似。例如,在 R 中,我們可以生成一個引數值網格,然后在給定一些資料的情況下評估每個值的可能性(來自McElreath的Statistical Rethinking的示例):
p_grid <- seq(from=0, to=1, length.out=1000)
likelihood <- dbinom(6, size=9, prob=p_grid)
這里likelihood是一個包含 1000 個值的陣列,我認為這是獲取這樣一個陣列的有效方法。
我是 Julia 的新手(并且不太擅長 R),所以我做上述相同的方法依賴于理解語法:
using Distributions
p_grid = collect(LinRange(0, 1, 1000))
likelihood = [pdf(Binomial(n9=, p=p), 6) for p in p_grid]
這不僅笨重,而且在某種程度上似乎效率低下,因為新的二項式被構造了 1000 次。是否有更好的(也許是矢量化的)方法來完成相同的任務?
uj5u.com熱心網友回復:
在 R 或 Python 等語言中,人們經常使用術語“向量化”來表示“避免for語言中的回圈”。我說“在語言中”是因為仍然存在for回圈,只是它們現在使用 C 而不是 R/Python。
在 Julia,沒有什么可擔心的。您有時仍會聽到“矢量化”,但 Julia 的人們傾向于在硬體矢量化的原始意義上使用它。更多關于這里。
至于你的代碼,我覺得沒問題。可以肯定的是,讓我們進行基準測驗!
julia> using BenchmarkTools
julia> @btime [pdf(Binomial(9, p), 6) for p in $p_grid]
111.352 μs (1 allocation: 7.94 KiB)
您可以撰寫此代碼的另一種方法是使用map:
julia> @btime map($p_grid) do p
pdf(Binomial(9, p), 6)
end;
111.623 μs (1 allocation: 7.94 KiB)
要檢查構造開銷,您可以對 進行較低級別的呼叫StatsFuns,如下所示
julia> using StatsFuns
julia> @btime map($p_grid) do p
binompdf(9, p, 6)
end;
109.809 μs (1 allocation: 7.94 KiB)
看起來有一些差異,但很小,可能占總成本的 2% 左右。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/476412.html
下一篇:在串列中查找物件而不對其進行迭代
