我对函数mvncdf
,(http://cn.mathworks.com/help/stats/mvncdf.html)的实现很感兴趣。
具体来说,我想知道它传递一个数组并返回一个数组的实现。我想知道它是否以有效的方式完成。因为我使用的是numpy
,numpy
中没有对应的内容。
答案 0 :(得分:7)
在MATLAB中,输入edit mvncdf.m
。 (这不适用于所有函数,因为它们可能只以编译形式分发。)如果您没有MATLAB,则可以使用八度实现here。
答案 1 :(得分:3)
可以在以下位置看到Octave代码:
http://sourceforge.net/p/octave/statistics/ci/default/tree/inst/mvncdf.m
为什么在任何一种语言中传入或传出数组都有什么特别之处? Octave代码解析一组灵活的输入。计算工作似乎是迭代的。计算所花费的时间可能超过任何界面工作。
所以Octave版本会混合使用
x,mu,sigma, a
为缺少的参数指定默认值。 cases
是x
的第一个维度。
该功能的内容似乎是:
c = chol (sigma)';
p = zeros (cases, 1); # array that it returns
varsum = zeros (cases, 1);
err = ones (cases, 1) .* err_eps; # the other return
# Apply crude Monte-Carlo estimation
while any (err >= err_eps)
# Sample from q-1 dimensional unit hypercube
w = rand (cases, q - 1);
# Transformation of the multivariate normal integral
dvev = normcdf ([a(:, 1) / c(1, 1), x(:, 1) / c(1, 1)]);
dv = dvev(:, 1);
ev = dvev(:, 2);
fv = ev - dv;
y = zeros (cases, q - 1);
for i = 1:(q - 1)
y(:, i) = norminv (dv + w(:, i) .* (ev - dv));
dvev = normcdf ([(a(:, i + 1) - c(i + 1, 1:i) .* y(:, 1:i)) ./ c(i + 1, i + 1), (x(:, i + 1) - c(i + 1, 1:i) .* y(:, 1:i)) ./ c(i + 1, i + 1)]);
dv = dvev(:, 1);
ev = dvev(:, 2);
fv = (ev - dv) .* fv;
endfor
n++;
# Estimate standard error
varsum += (n - 1) .* ((fv - p) .^ 2) ./ n;
err = gamma .* sqrt (varsum ./ (n .* (n - 1)));
p += (fv - p) ./ n;
endwhile
在Python术语中,它将以return p, err
结尾。对于scipy
等同于norminv
和normcdf
,numpy
的翻译应该是直截了当的。我没有看到与implementation of passing an array and returning an array
有关的任何效率问题。 p
与x
的行数相同,但不是x
的副本或视图。