【问题标题】:Generalized Extreme Value Distribution in C++ (GEV)C++ 中的广义极值分布 (GEV)
【发布时间】:2015-02-26 13:42:18
【问题描述】:

GEV 分布 (http://en.wikipedia.org/wiki/Generalized_extreme_value_distribution) 有 3 个参数:

μ ∈ R — 位置,

σ > 0 — 尺度

ξ ∈ R — 形状

但是,C++ 11 库只支持一个只支持 2 个参数的extreme_value_distribution:

http://www.cplusplus.com/reference/random/extreme_value_distribution/

所以这个实现缺少形状参数(ξ)。有没有办法在 C++ 中生成具有 GEV 分布的随机数?

编辑:维基百科建议 GEV 可以由 EV、Weibull 和 Frechet 构建。所以看起来可以用C++中的EV和Weibull实现来构造。

【问题讨论】:

    标签: c++ c++11 random distribution


    【解决方案1】:

    我不是概率论者,但我有理由确定您可以找到累积分布函数的逆函数并将其应用于从 (0,1] 上的均匀分布中获取的值。从提供的 Wikipedia 链接中,逆一般情况是

    F^-1(x; mu, sigma, xi) = mu + ((-ln x)^(-xi) - 1)*sigma/xi

    (假设我没有滑倒,但很容易检查自己)。您所要做的就是将此函数应用于从统一 (0,1] 中提取的值,并且结果值应按您的需要分布。当然,如果您尝试计算值,则 xi = 0 的情况将失败这种方式,但无论如何,这种情况是由extreme_value_distribution实现的。

    抱歉格式化,我对 LaTeX 很熟悉,但在这里评论时完全不熟悉如何使用它。

    【讨论】:

    • 谢谢!我认为这是一个好主意,我将发布我的实现
    • 看起来你已经正确地实现了它,我很高兴它成功了!您能否投票/选择我的答案?作为一个非常新的用户,我什至无法评论其他人的答案!
    【解决方案2】:

    我使用 wolfram alpha 来找到 ξ!=0 的 GEV 的 IDCF:here 和 ξ==0:here

    这是一个实现:

    #include <iostream>
    #include <random>
    #include <cmath> 
    
    double icdf(double x, double mu, double sigma, double xi)
    {
        if(xi == 0)
        {
            return (mu - sigma * log(-log(x))); 
        }
        else
        {
            double a = pow(-1*log(x),-1*xi);
            double b = -1*xi*mu*pow(-log(x),xi);
            double c = sigma * pow(-log(x),xi) - sigma;
            return (-1)*(a*(b+c) )/xi;
        }
    }
    
    int main()
    {
        std::default_random_engine generator;
        std::uniform_real_distribution<double> distribution(0,1);
    
        for (int i=0; i<10000; ++i)
        {
            double number = distribution(generator);
            std::cout << icdf(number, 11.328, 2.909, -0.177) << std::endl;
        }
    
        return 0;
    }
    

    我在 Matlab 中分析了数据,看起来很棒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-01
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      相关资源
      最近更新 更多