【问题标题】:How to define cumulative normal distribution using symbolic math如何使用符号数学定义累积正态分布
【发布时间】:2014-09-19 22:57:01
【问题描述】:

我在 MATLAB 中有以下代码

x=sym('x',[1 2]);
DV=x(1)*ED+x(2);
sv=x(1)*DV;
DD=DV./sv;
p=normcdf(-DD);

其中 DV 和 ED 都是 13242 x 1 向量。到 DD 为止一切正常。当我像上面那样定义 p 时,我得到这个消息:

使用 symfun>validateArgNames 时出错(第 205 行)

第二个输入必须是唯一符号变量的标量或向量。

当我定义p=1./(1+exp(-DD)) 时,一切正常。所以normcdf有问题。

有什么想法吗?

问候

【问题讨论】:

    标签: matlab symbolic-math


    【解决方案1】:

    normcdf 与统计工具箱中的大多数功能一样,不支持符号输入。文档没有说明这一点,我同意错误消息非常无用(您可能会contact MathWorks and file a service request about this 建议他们在统计工具箱中添加对符号数学的支持)。

    normcdf 函数不会做任何神奇的事情。您可以使用p = 0.5*erfc(DD./sqrt(2)) 代替p = normcdf(-DD)。这也会更快。在您的命令中键入edit normcdf 以查看该函数的代码。有很多错误检查和特定于浮点的情况,这就是函数使用符号输入出错的原因。

    另一种选择是使用来自within Matlab 的MuPAD 的stats::normalCDF(此功能可能仅在最近的版本中支持)。例如:

    x = sym('x',[1 2]);
    ED = ones(1,3);
    DV = x(1)*ED+x(2);
    sv = x(1)*DV;
    DD = DV./sv;
    DDstr = char(-DD);
    p = evalin(symengine, ['f:=stats::normalCDF(0,1):map(' DDstr(9:end-2) ',x->f(x))'])
    

    其中f 定义了一个procedure,实现了一个均值为0 方差为1 的符号正态CDF。MuPAD 的map 函数也用于对其进行向量化。总而言之,这个选项可能没有必要。

    【讨论】:

      【解决方案2】:

      来自normcdf 的 MATLAB 帮助

      x 可以是向量、矩阵或多维数组。

      也就是说,它不能是符号变量。

      试试

      syms y;
      p=normcdf(y)
      

      不起作用。因为DD 是一个符号变量,所以它不起作用。为什么你想要一个包含几千个符号值的向量呢?为x 的特定非符号值运行脚本不是更有效吗?

      【讨论】:

      • 您好,感谢您的回复。好吧,实际上变量 p 将被输入到目标函数 F 中,然后优化 F w.r.t x。但是因为我不能定义 p,所以 F 也不能。
      • 我会看看是否有更聪明的方法来获得你想要的东西。优化 13k 符号函数对我来说似乎并不有效......尝试找到 x 和 F 之间的关系;通常,近似(线性化)可以做得非常好。
      • “x 可以是向量、矩阵或多维数组”这句话并没有排除符号变量,它可以是标量、向量、矩阵或多维数组本身。
      • 没错,但根据我的经验,当输入被允许是符号时,MATLAB 文档会明确提及它,而当它不能是符号时,则明确不提及。
      【解决方案3】:

      我知道怎么做。我必须按原样定义累积密度函数方程,而不是使用命令 normcdf,其中 X=-DD

      【讨论】:

        猜你喜欢
        • 2010-10-23
        • 1970-01-01
        • 2013-01-28
        • 2015-10-16
        • 2020-03-19
        • 2014-08-31
        • 1970-01-01
        • 2011-02-16
        • 2019-07-23
        相关资源
        最近更新 更多