gpt4 book ai didi

c# - C# 中是否有内置算法或库可用于计算概率函数?

转载 作者:行者123 更新时间:2023-11-30 09:30:43 29 4
gpt4 key购买 nike

如何编写以下方法的代码?

dbinom(k, size=n, prob=P)
pbinom(k, size=n, prob=P)
.
.
.

我想知道在C#中是否有一些类似的内置算法或一些可用?

谢谢。

最佳答案

嗯,你可以尝试自己创建例程。首先,由于我们要处理巨大数字(阶乘),所以我们使用对数;而不是

 dbinom(k, n, p) = 
= n! / k! / (n - k)! * pow(p, k) * pow(1 - p, n - k)

我们计算

 log(dbinom(k, n, p)) = 
= log(n!) - log(k!) - log((n - k)!) + k * log(p) + (n - k) * log(1 - p)

最后,对其求幂。据我从问题中可以看出,主要困难log(n!)。我们可以预先计算n 并使用 Stirling Approximation 如果参数较大:

public static class Distributions {
private static Dictionary<int, double> s_LogFactorials = new Dictionary<int, double>();

static Distributions() {
long p = 1;
s_LogFactorials.Add(0, 0);

for (int i = 1; i <= 20; ++i)
s_LogFactorials.Add(i, Math.Log(p *= i));
}

private static double LogFactorial(int value) {
if (s_LogFactorials.TryGetValue(value, out double result))
return result;

return Math.Log(2 * Math.PI * value) / 2 +
value * Math.Log(value) -
value +
Math.Log(1 + 1 / 12.0 / value);
}

public static double dbinom(int k, int n, double p) {
if (p < 0)
throw new ArgumentOutOfRangeException(nameof(p));
else if (p > 1)
throw new ArgumentOutOfRangeException(nameof(p));

if (k < 0 || n < 0 || k > n)
return 0.0;
else if (p == 0 || p == 1.0)
return 0.0;

double logResult = LogFactorial(n) - LogFactorial(k) - LogFactorial(n - k) +
k * Math.Log(p) + (n - k) * Math.Log(1 - p);

return Math.Exp(logResult);
}
}

一些测试:

Distributions.dbinom(   5,    9, 0.30) == 0.0735138179999999
Distributions.dbinom( 21, 45, 0.48) == 0.116657747325863
Distributions.dbinom( 63, 121, 0.54) == 0.0661504080311266
Distributions.dbinom(1163, 2019, 0.52) == 5.15538389581199E-08

最后,如果你坚持使用数学库,可以尝试Math.Net

关于c# - C# 中是否有内置算法或库可用于计算概率函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59159644/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com