C# Nmath 转 Python SciPy
我需要把一些功能从C#转到Python,但我无法正确实现下面的代码:
[SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.None)]
public static SqlDouble LogNormDist(double probability, double mean, double stddev)
{
LognormalDistribution lnd = new LognormalDistribution(mean,stddev);
return (SqlDouble)lnd.CDF(probability);
}
这段代码使用了CenterSpace Nmath库。
有没有人能帮我写一个在Python中类似的函数呢?
抱歉我的英语不好。
更新 其实,我不太明白scipy.stats.lognorm.cdf中的哪些属性和C#中的概率、均值、标准差是相似的。
如果直接把现有的顺序复制到Python中,就像下面的回答那样,我得到的结果是错误的。
4 个回答
0
也许你可以试试 Python.NET(这不是 IronPython),它可以让你访问 .NET 的组件和服务:
2
Python的文档里介绍了一种方法叫做 random.lognormvariate(mu, sigma):
http://docs.python.org/library/random.html
也许这正是你需要的。
4
Scipy里面有很多种分布是定义在scipy.stats这个包里的。
import scipy.stats
def LogNormDist(prob, mean=0, stddev=1):
return scipy.stats.lognorm.cdf(prob,stddev,mean)
更新
好吧,看起来Scipy的统计定义有点不太标准。这里是scipy.stats.lognormal
的文档结尾部分:
对数正态分布
lognorm.pdf(x,s) = 1/(sxsqrt(2*pi)) * exp(-1/2*(log(x)/s)**2) 适用于 x > 0, s > 0。
如果log x是正态分布,平均值为mu,方差为sigma的平方, 那么x就是对数正态分布,形状参数为sigma,尺度参数为exp(mu)。
所以可以试试这个:
return scipy.stats.lognorm.cdf(prob,stddev,scipy.exp(mean))
如果还是不行,试着获取几个样本点,我看看能不能找到一个有效的关系。
更新 2
哎呀,我没意识到尺度参数是一个关键字。这个应该可以工作:
import scipy.stats
def LogNormDist(prob, mean=0, stddev=1):
return scipy.stats.lognorm.cdf(prob,stddev,scale=scipy.exp(mean))
祝你好运,项目顺利!