【问题标题】:MathDotNet: Sampling from distributions without castingMathDotNet:从分布中抽样而不进行强制转换
【发布时间】:2015-07-27 14:55:30
【问题描述】:

如何从 MathDotNet 中的分布中抽取一个样本不必转换为特定分布?

我有一个分布d,它可以是任何随机变量,作为IDistribution 传递。现在,我想从中取样。我想通过尽可能少地对实际发行版本身进行强制转换来做到这一点(我不想要一个巨大的案例声明,其中包含大量强制转换到真正特定的分布类型,如BernoulliNormal 等。

我已经尝试了以下代码,IDistributiond 类型为Bernoulli,平均值约为0.99

Console.WriteLine("Mean is " + ((Bernoulli)d).Mean);
Console.WriteLine("Casted sample is " + ((Bernoulli)d).Sample());
Console.WriteLine("Sample is " + d.RandomSource.NextDouble());

第一个打印语句按预期打印 0.99。 正如预期的那样,第二个打印语句倾向于返回 1,因为 99% 的时间它应该返回 1。 第三个打印语句似乎给了我看起来像 uniform 介于 0 或 1 之间的随机变量(注意:它可能不是统一的,这只是对打印语句的快速眼球测试,但它绝对是不是伯努利,平均值为 0.99)。

我一般如何从适当的分布中抽样?

【问题讨论】:

    标签: c# casting math.net


    【解决方案1】:

    这就是我目前正在做的事情。我想避免使用 if 语句,但现在,这行得通。如果有人有更好的答案,那就更好了:

    if (distribution is IContinuousDistribution){
        value = (double)((IContinuousDistribution)distribution).Sample();
    
    }else{
       value = (double)((IDiscreteDistribution)distribution).Sample();
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多