1

我需要将一些函数从 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 中编写一个正确的函数,这将类似于这段代码?

对不起我的英语不好。

UPD实际上,我不明白哪些 scipy.stats.lognorm.cdf attrs 类似于 C# 概率,意思是 stddev

如果只是将现有订单复制到 python,如下面的答案,我得到错误的数字。

4

4 回答 4

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/(s x sqrt(2*pi)) * exp(-1/2*(log(x)/s)**2) 对于 x > 0, s > 0。

如果 log x 服从均值 mu 和方差 sigma**2 的正态分布,则 x 服从形状参数 sigma 和尺度参数 exp(mu) 的对数正态分布。

所以也许试试

return scipy.stats.lognorm.cdf(prob,stddev,scipy.exp(mean))

如果这仍然不起作用,请尝试获取一些样本点,我会看看我是否能找到工作关系。

更新 2

糟糕,我没有意识到 scale 参数是关键字。这个现在应该可以工作了:

import scipy.stats

def LogNormDist(prob, mean=0, stddev=1):
    return scipy.stats.lognorm.cdf(prob,stddev,scale=scipy.exp(mean))

为您的项目干杯并祝您好运!

于 2009-04-29T08:39:10.130 回答
2

Python 文档描述了一种方法 random.lognormvariate(mu, sigma):

http://docs.python.org/library/random.html

也许这就是你想要的。

于 2009-04-29T09:46:48.660 回答
0

也许您可以使用 Python.NET(这不是IronPython),它允许访问 .NET 组件和服务:

http://pythonnet.sourceforge.net/

于 2009-04-29T08:29:43.023 回答
0

伊万,

我们没有兴趣让人们锁定在 NMath 中。这是我们在 NMath 中所做的。

  double t = ( Math.Log( x ) - mu_ ) / sigmaRoot2_;
  return ( 0.5 + 0.5 * Erf( t ) );

在哪里

private static double Erf( double x )
{
  return ( x < 0.0 ? -StatsFunctions.IncompleteGamma( 0.5, x * x ) : StatsFunctions.IncompleteGamma( 0.5, x * x ) );
}

那应该有帮助...

  • 特雷弗
于 2013-11-07T22:16:32.703 回答