Какие параметры я должен использовать для нормального и нормального распределения в MATH.NET - PullRequest
0 голосов
/ 21 мая 2018

Я пробовал несколько комбинаций классов Mathdotnet LogNormal и Normal: https://numerics.mathdotnet.com/api/MathNet.Numerics.Distributions/LogNormal.

Я, кажется, намного ближе к результату, который я ищу, используя среднее значение и стандартное отклонение в качестве параметров.Тем не менее, я замечаю, что когда я использую большие числа, такие как numberOfMinutes, мои результаты не отклоняются от среднего значения, как это происходит с меньшими числами, как numberOfDays.Я знаю, что не думаю об этом праве и мог бы помочь.

Кроме того, я хотел бы использовать среднее геометрическое по сравнению со средним, но я не знал, какой параметр использовать для дисперсии, учитывая, что не могу точно определить, как его использовать даже для среднего.

Наконец, я надеюсь, что ответ на этот вопрос также ответит на ту же проблему, что и у меня с нормальным дистрибутивом.

List<double> numberOfDays = new List<double> { 10, 12, 18, 30 };

double mean = numberOfDays.Mean();  // 17.5
double geometricMean = numberOfDays.GeometricMean(); // 15.954
double variance = numberOfDays.Variance();  // 81
double standardDeviation = numberOfDays.StandardDeviation(); // 9
// Do I need a Geometric Standard Deviation or Variance

double numberOfDaysSampleMV = LogNormal.WithMeanVariance(mean, variance).Sample();   // One example sample yielded 40.23                
double numberOfDaysSampleMSD = LogNormal.WithMeanVariance(mean, standardDeviation).Sample(); // One example sample yielded 17.33

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Используя вашу тестовую программу выше, мои сэмплы выглядят так:

Использование LogNormal (mu, sigma)

В конечном итоге меня беспокоят значения, превышающие30 и меньше 10.

Однако, следом и ошибкой [случайно], когда я использую следующий метод для получения образцов, используя исходные переменные m и sd в вашей тестовой программе, я получаю результатынаходясь в поиске.Я не хочу идти вперед с чем-то, что я случайно сделал.

sample = new double[100];
for (int i = 0; i < 100; i++)
{
    sample[i] = LogNormal.WithMeanVariance(m, sd).Sample();
}

Использование LogNormal.WithMeanVariance (m, sd)

Мои значения постоянно находятся между Minи Макс и сосредоточены вокруг среднего.

0 голосов
/ 25 мая 2018
  1. Мой пример довольно ясно показывает, как получить образец LogNormal со средним и стандартным отклонением исходных данных.
  2. Мин / макс 10/30 нереально, если вы собираетесь создатьваши образцы на основе среднего значения и стандартного отклонения образца.Предположим, вы взяли случайную выборку весов 4 человек из 1000 человек.Ожидаете ли вы, что ваша выборка будет включать как самую легкую, так и самую тяжелую часть населения?
  3. LogNormal.WithMeanVariance (m, sd) неверно.Единицы неверны.Ожидается, что дисперсия будет иметь единицы ln (days) ^ 2, а sd - единицы дней.
  4. Я предлагаю вам: а) использовать LogNormal (mu, sigma) и отбрасывать любые значения, которые находятся за пределами вашего min /max range или b) используйте LogNormal (mu, c * sigma) для некоторого значения c меньше единицы, чтобы уменьшить дисперсию настолько, чтобы все значения были в вашем минимальном / максимальном диапазоне.Выбор зависит от характера вашего проекта.
  5. Запись Wikipedia в распределении LogNormal содержит формулы для вычисления mu и sigma из m и sd, что может быть лучше, чем вычисление по данным Y.
0 голосов
/ 24 мая 2018

Я полагаю, вы не уверены в требуемых параметрах.Используя обычные обозначения, вы установили X, который, по вашему мнению, является LogNormal:

 X = { 10, 12, 18, 30 }
mean: m = 17.5
standard deviation: sd = 9

, из этого вы получаете набор Y, который является нормальным:

Y = {2.30,2.48,2.89,3.4}
mean: mu = 2.77
standard deviation: sigma = 0.487

Обратите внимание, что mu и sigma вычисляются изY, а не X. Для создания выборки данных LogNormal вы используете mu и sigma, а не m и sd.

double[] sample = new double[100];
 LogNormal.Samples(sample, mu, sigma);

Это соответствует статье Википедии о распределении LogNormal,Документация по цифрам не ясна.

Вот моя тестовая программа, которая может быть полезна:

            List<double> X = new List<double> { 10, 12, 18, 30 };  // assume to be LogNormal
            double m = X.Mean();               // mean of log normal values = 17.5
            double sd = X.StandardDeviation(); // standard deviation of log normal values = 9

            List<double> Y = new List<double> { };
            for (int i = 0; i < 4; i++)
            {
                Y.Add(Math.Log(X[i]));
            }
            // Y = {2.30,2.48,2.89,3.4}

            double mu = Y.Mean();                 // mean of normal values = 2.77
            double sigma = Y.StandardDeviation(); // standard deviation of normal values = 0.487

            double[] sample = new double[100];
            LogNormal.Samples(sample, mu, sigma);          // get sample    
            double sample_m = sample.Mean();               // 17.93, approximates m
            double sample_sd = sample.StandardDeviation(); // 8.98, approximates sd

            sample = new double[100];
            Normal.Samples(sample, mu, sigma);                // get sample    
            double sample_mu = sample.Mean();                 //2.77, approximates mu
            double sample_sigma = sample.StandardDeviation(); //0.517 approximates sigma
...