Matlab:有可能是函数的源代码,mvncdf?

时间:2016-02-07 02:37:21

标签: python matlab numpy scipy

我对函数mvncdf,(http://cn.mathworks.com/help/stats/mvncdf.html)的实现很感兴趣。

具体来说,我想知道它传递一个数组并返回一个数组的实现。我想知道它是否以有效的方式完成。因为我使用的是numpynumpy中没有对应的内容。

2 个答案:

答案 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 

为缺少的参数指定默认值。 casesx的第一个维度。

该功能的内容似乎是:

  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等同于norminvnormcdfnumpy的翻译应该是直截了当的。我没有看到与implementation of passing an array and returning an array有关的任何效率问题。 px的行数相同,但不是x的副本或视图。