MATH.NET Numerics \ Стабильные дистрибутивы. Исключение типа «System.NotSupportedException»

Я столкнулся с Exception error (неожиданно) при выполнении некоторых параллельных статистических тестов с Math.Net Numerics, и я хотел бы знать причину.

using MathNet.Numerics.Distributions;
....
var stable = new Stable(1.7, -0.7, 0.0087, 0.9103);
        double b = stable.Density(3.2);
        double a = stable.Density(5.1);
        Console.WriteLine(b);
        Console.WriteLine(a);

Ошибка: необработанное исключение типа System.NotSupportedException произошло в MathNet.Numerics.dll

Я ожидал получить b = 2.2484e-06, a = 4.3977e-07.

Ps: другие классические распределения, такие как Gamma, работают без проблем (например, распределения вероятностей ), фактически исключая любые проблемы с установкой пакета

Лучший,

EDIT: из Github репозиторий Я добавил Stable.cs в свой проект, который включает все свойства и методы.

На самом деле свойства работают нормально. См. ниже иллюстрацию из Program.cs:

   Stable st = new Stable(1.7, -0.7, 0.0087, 0.9103); // correct instantiation

   Console.WriteLine(string.Format(" Characteristic exponent: {0}\n 
   Skewness: {1}\n Scale: {2}\n Location: {3}" ,st.Alpha, st.Beta,  
   st.Scale,st.Location));

Однако, на мой взгляд, нет ничего нелогичного в вызове метода Density на основе object: st.Density(3.2), который должен возвращать:

PDF(_alpha, _beta, _scale, _location, x); 

Таким образом, заманчиво заключить проблему method definition, если только люди не возражают против этого мнения с помощью веских иллюстраций.

Более того, при особых значениях stable parameters (например, _alpha = 2.0 и т. д.) определенный PDF возвращает 0 (странно)


person dark.vador    schedule 12.06.2016    source источник


Ответы (1)


Ответ находится в репозитории Math.NET GitHub< /а>.

Ваш пример не соответствует условиям формулы Density.

public double Density(double x)
{
    return PDF(_alpha, _beta, _scale, _location, x);
}

/// <summary>
/// Computes the probability density of the distribution (PDF) at x, i.e. ∂P(X ≤ x)/∂x.
/// </summary>
/// <param name="alpha">The stability (α) of the distribution. Range: 2 ≥ α > 0.</param>
/// <param name="beta">The skewness (β) of the distribution. Range: 1 ≥ β ≥ -1.</param>
/// <param name="scale">The scale (c) of the distribution. Range: c > 0.</param>
/// <param name="location">The location (μ) of the distribution.</param>
/// <param name="x">The location at which to compute the density.</param>
/// <returns>the density at <paramref name="x"/>.</returns>
/// <seealso cref="Density"/>
public static double PDF(double alpha, double beta, double scale, double location, double x)
{
    if (alpha <= 0.0 || alpha > 2.0 || beta < -1.0 || beta > 1.0 || scale <= 0.0)
    {
        throw new ArgumentException(Resources.InvalidDistributionParameters);
    }

    if (alpha == 2d)
    {
        return Normal.PDF(location, Constants.Sqrt2*scale, x);
    }

    if (alpha == 1d && beta == 0d)
    {
        return Cauchy.PDF(location, scale, x);
    }

    if (alpha == 0.5d && beta == 1d && x >= location)
    {
        return (Math.Sqrt(scale/Constants.Pi2)*Math.Exp(-scale/(2*(x - location))))/Math.Pow(x - location, 1.5);
    }

    throw new NotSupportedException();
}
person Piotr Leniartek    schedule 14.06.2016