Вопрос

Мне нужно перенести некоторые функции с 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 похожи на вероятность С#, в смысле stddev.

Если просто скопировать существующий заказ в Python, как в ответе ниже, я получу неправильный номер.

Это было полезно?

Решение

Scipy имеет множество дистрибутивов, определенных в пакете scipy.stats.

import scipy.stats

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

Обновлять

Ладно, похоже, определения характеристик Сципи немного нестандартны.Вот конец строки документации для scipy.stats.lognormal

Логнормальное распределение

lognorm.pdf(x,s) = 1/(sИксSQRT (2*pi))*exp (-1/2*(log (x)/s) ** 2) для x> 0, s> 0.

Если журнал x обычно распределяется со средней MU и дисперсией Sigma ** 2, то x-нормально распределяется с Sigma Sigma 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))

Здоровья и удачи в вашем проекте!

Другие советы

Документы Python описывают метод random.lognormvariate(mu, sigma):

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

Может быть, это то, чего вы хотите.

Возможно, вы можете использовать Python.NET (это НЕТ IronPython), он позволяет получить доступ к компонентам и сервисам .NET:

http://pythonnet.sourceforge.net/

Иван,

Мы не заинтересованы в том, чтобы люди были привязаны к 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 ) );
}

Это должно помочь...

  • Тревор
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top