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 похожи на вероятность С#, в смысле 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:
Иван,
Мы не заинтересованы в том, чтобы люди были привязаны к 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 ) );
}
Это должно помочь...
- Тревор