![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Some Miscellaneous Examples of the Normal (Gaussian) DistributionBoost , Math Toolkit 2.5.0 , Normal Distribution Examples
|
![]() |
Note |
---|---|
Реальные жизненные неудачи часто очень абнормальны, со значительным числом, которое «мертво по прибытию» или терпит неудачу очень рано в их жизни: жизнь выживших после «ранней смертности» может быть хорошо описана нормальным распределением. |
Еженедельный спрос на 5 фунтов лука в магазине обычно распределяется со средним значением 140 мешков и стандартным отклонением 10.
double mean = 140.; // sacks per week. double standard_deviation = 10; normal sacks(mean, standard_deviation); double stock = 160.; // per week. cout << "Percentage of weeks overstocked " << cdf(sacks, stock) * 100. << endl; // P(X <=160) // Percentage of weeks overstocked 97.7
Там будет много луковиц! Таким образом, мы можем сказать, какой уровень акций будет удовлетворять спрос в 95% недель.
double stock_95 = quantile(sacks, 0.95); cout << "Store should stock " << int(stock_95) << " sacks to meet 95% of demands." << endl;
И легко оценить, как удовлетворить 80% спроса, а отходов еще меньше.
double stock_80 = quantile(sacks, 0.80); cout << "Store should stock " << int(stock_80) << " sacks to meet 8 out of 10 demands." << endl;
Машина должна упаковывать 3 кг говядины на упаковку. За длительный период времени установлено, что средний упакованный вес составил 3 кг при стандартном отклонении 0,1 кг. Предполагая, что упаковка обычно распределена, можно найти фракцию (или %) упаковок, которые весят более 3,1 кг.
double mean = 3.; // kg double standard_deviation = 0.1; // kg normal packs(mean, standard_deviation); double max_weight = 3.1; // kg cout << "Percentage of packs > " << max_weight << " is " << cdf(complement(packs, max_weight)) << endl; // P(X > 3.1) double under_weight = 2.9; cout <<"fraction of packs <= " << under_weight << " with a mean of " << mean << " is " << cdf(complement(packs, under_weight)) << endl; // fraction of packs <= 2.9 with a mean of 3 is 0.841345 // This is 0.84 - more than the target 0.95 // Want 95% to be over this weight, so what should we set the mean weight to be? // KK StatCalc says: double over_mean = 3.0664; normal xpacks(over_mean, standard_deviation); cout << "fraction of packs >= " << under_weight << " with a mean of " << xpacks.mean() << " is " << cdf(complement(xpacks, under_weight)) << endl; // fraction of packs >= 2.9 with a mean of 3.06449 is 0.950005 double under_fraction = 0.05; // so 95% are above the minimum weight mean - sd = 2.9 double low_limit = standard_deviation; double offset = mean - low_limit - quantile(packs, under_fraction); double nominal_mean = mean + offset; normal nominal_packs(nominal_mean, standard_deviation); cout << "Setting the packer to " << nominal_mean << " will mean that " << "fraction of packs >= " << under_weight << " is " << cdf(complement(nominal_packs, under_weight)) << endl;
Установка упаковщика на 3.06449 будет означать, что доля упаковок >= 2,9 составляет 0,95.
Установка упаковщика на 3.13263 будет означать, что доля упаковок >= 2.9 составляет 0,99, но более чем удвоит среднюю потерю с 0,0644 до 0,133.
В качестве альтернативы мы могли бы инвестировать в лучший (более точный) упаковщик с более низким стандартным отклонением.
Чтобы оценить, насколько лучше (насколько меньше стандартное отклонение) это должно быть, нам нужно получить 5% квантиль, чтобы быть расположенным на пределе ниже веса, 2,9
double p = 0.05; // wanted p th quantile. cout << "Quantile of " << p << " = " << quantile(packs, p) << ", mean = " << packs.mean() << ", sd = " << packs.standard_deviation() << endl; //
Количественное значение 0,05 = 2.83551, среднее = 3, sd = 0,1
При текущем упаковщике (среднее значение = 3, sd = 0,1) 5% квантиле составляет 2,8551 кг, что немного ниже нашей цели в 2,9 кг. Поэтому мы знаем, что стандартное отклонение должно быть меньше.
Начнем с предположения, что ее (сейчас 0,1) нужно сократить вдвое, до стандартного отклонения в 0,05
normal pack05(mean, 0.05); cout << "Quantile of " << p << " = " << quantile(pack05, p) << ", mean = " << pack05.mean() << ", sd = " << pack05.standard_deviation() << endl; cout <<"Fraction of packs >= " << under_weight << " with a mean of " << mean << " and standard deviation of " << pack05.standard_deviation() << " is " << cdf(complement(pack05, under_weight)) << endl; //
Фракция упаковок >= 2,9 со средним значением 3 и стандартным отклонением 0,05 составляет 0,9772
Так что 0,05 было довольно хорошей догадкой, но мы немного превысили цель 2,9, так что стандартное отклонение может быть немного больше. Так что мы могли бы сделать больше предположений, чтобы приблизиться, скажем, увеличив до 0,06
normal pack06(mean, 0.06); cout << "Quantile of " << p << " = " << quantile(pack06, p) << ", mean = " << pack06.mean() << ", sd = " << pack06.standard_deviation() << endl; cout <<"Fraction of packs >= " << under_weight << " with a mean of " << mean << " and standard deviation of " << pack06.standard_deviation() << " is " << cdf(complement(pack06, under_weight)) << endl;
Фракция упаковок >= 2,9 со средним значением 3 и стандартным отклонением 0,06 составляет 0,9522
Теперь мы действительно приближаемся, но для правильного выполнения работы мы могли бы использовать метод поиска корней, например, инструменты, предоставленные и используемые в другом месте, в Math Toolkit, см. поиск корней без производных .
Но в этом нормальном случае распределения мы могли бы быть еще умнее и произвести прямой расчет.
normal s; // For standard normal distribution, double sd = 0.1; double x = 2.9; // Our required limit. // then probability p = N((x - mean) / sd) // So if we want to find the standard deviation that would be required to meet this limit, // so that the p th quantile is located at x, // in this case the 0.95 (95%) quantile at 2.9 kg pack weight, when the mean is 3 kg. double prob = pdf(s, (x - mean) / sd); double qp = quantile(s, 0.95); cout << "prob = " << prob << ", quantile(p) " << qp << endl; // p = 0.241971, quantile(p) 1.64485 // Rearranging, we can directly calculate the required standard deviation: double sd95 = std::abs((x - mean)) / qp; cout << "If we want the "<< p << " th quantile to be located at " << x << ", would need a standard deviation of " << sd95 << endl; normal pack95(mean, sd95); // Distribution of the 'ideal better' packer. cout <<"Fraction of packs >= " << under_weight << " with a mean of " << mean << " and standard deviation of " << pack95.standard_deviation() << " is " << cdf(complement(pack95, under_weight)) << endl; // Fraction of packs >= 2.9 with a mean of 3 and standard deviation of 0.0608 is 0.95
Обратите внимание, что эти два обманчиво простых вопроса (мы переполняем или измеряем лучше) на самом деле очень распространены. Вес говядины может быть заменен измерением более или менее чего-либо. Но вычисления основаны на точности стандартного отклонения — то, что почти всегда менее хорошо, чем мы могли бы пожелать, особенно если основываться на нескольких измерениях.
Затвор можно использовать, если он имеет длину от 3,9 до 4,1. Из большой партии болтов образец 50 показывает среднюю длину 3,95 со стандартным отклонением 0,1. При нормальном распределении какая пропорция пригодна для использования? Истинное среднее значение выборки неизвестно, но мы можем использовать среднее значение выборки и стандартное отклонение, чтобы найти приблизительные решения.
normal bolts(3.95, 0.1); double top = 4.1; double bottom = 3.9; cout << "Fraction long enough [ P(X <= " << top << ") ] is " << cdf(bolts, top) << endl; cout << "Fraction too short [ P(X <= " << bottom << ") ] is " << cdf(bolts, bottom) << endl; cout << "Fraction OK -between " << bottom << " and " << top << "[ P(X <= " << top << ") - P(X<= " << bottom << " ) ] is " << cdf(bolts, top) - cdf(bolts, bottom) << endl; cout << "Fraction too long [ P(X > " << top << ") ] is " << cdf(complement(bolts, top)) << endl; cout << "95% of bolts are shorter than " << quantile(bolts, 0.95) << endl;
Статья Some Miscellaneous Examples of the Normal (Gaussian) Distribution раздела Math Toolkit 2.5.0 Normal Distribution Examples может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Normal Distribution Examples ::
реклама |