Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Complements are supported too - and when to use them

Boost , Math Toolkit 2.5.0 , Overview of Distributions

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Часто вам не нужно значение CDF, но его дополнение, которое означает1-p, а неp. Заманчиво вычислить CDF и вычесть его из1, но еслиpочень близко к1, то ошибка отмены приведет к потере точности, возможно, полностью.

Смотрите ниже«Почему и когда использовать комплементы?»

В этой библиотеке, когда вы хотите получить дополнение, просто оберните все аргументы функции в вызове(...), например:

students_t dist(5);
cout << "CDF at t = 1 is " << cdf(dist, 1.0) << endl;
cout << "Complement of CDF at t = 1 is " << cdf(complement(dist, 1.0)) << endl;

Но подождите, теперь, когда у нас есть дополнение, мы должны иметь возможность использовать его. Любая функция, принимающая вероятность в качестве аргумента, также может принять дополнение, обернув все свои аргументы призывом кдополнению(...), например:

students_t dist(5);
for(double i = 10; i < 1e10; i *= 10)
{
   // Calculate the quantile for a 1 in i chance:
   double t = quantile(complement(dist, 1/i));
   // Print it out:
   cout << "Quantile of students-t with 5 degrees of freedom\n"
           "for a 1 in " << i << " chance is " << t << endl;
}
[Tip] Tip

Критические значения — это просто квантили.

Некоторые тексты говорят о квантилях, или процентилах, или фрактилах, другие о критических значениях, основное правило:

Более низкие критические значенияте же, что и квантиль.

Верхние критические значенияте же, что и квантиль от дополнения вероятности.

Например, предположим, что у нас есть процесс Бернулли, приводящий к биномиальному распределению с коэффициентом успеха 0,1 и 100 испытаний в целом. Более низкое критическое значениедля вероятности 0,05 дано:

quantilebinomial100,0,1,0,05

Иверхнее критическое значениедано:

quantilecomplementbinomial100,0,1,0,05]

Возвращаются соответственно 4,82 и 14,63.

[Tip] Tip

Зачем вообще возиться с комплементами? 112

Очень заманчиво обойтись без дополнений и просто вычесть вероятность из 1 при необходимости. Однако рассмотрим, что происходит, когда вероятность очень близка к 1: скажем, вероятность, выраженная при поплавковой точности, составляет0,99999940f, затем1-0,99999940f=5,96046448e-008, но результат на самом деле точен всего лишьодному биту: Единственное, что не отменили!

Или посмотреть на это по-другому: предположим, что мы хотим, чтобы риск ложного отклонения нулевой гипотезы в тесте Студент t составлял 1 на 1 миллиард для выборки размером 10 000. Это дает вероятность 1 - 10-9, что составляет ровно 1 при расчете с поплавковой точностью. В этом случае вычисление квантиля из комплемента аккуратно решает проблему, например:

quantilecomplementstudents_t10000,1e-9]

возвращает ожидаемую t-статистику6.00336, где:

quantilestudents_t10000,1-1e-9f]

Возникает ошибка переполнения, так как она такая же, как:

quantilestudents_t10000,1

Который не имеет конечного результата.

При всех распределениях даже для более разумной вероятности (если только значение p не может быть представлено точно в виде плавающей точки) потеря точности быстро становится значительной, если просто вычислить вероятность от 1 до p (потому что это будут в основном мусорные цифры для p ~ 1).

Поэтому всегда избегайте, например, использования вероятности, близкой к единице, такой как 0,9999

quantilemy_distribution,0,9999

Вместо этого использовать

quantilecomplementmy_distribution,0,00001]

с тех пор 1 - 0.99999 не совсем равен 0,00001 при использовании арифметики с плавающей точкой.

Это предполагает, что значение 0,00001 является либо константой, либо может быть вычислено каким-либо другим способом, кроме вычитания 0.99999 из 1.


PrevUpHomeNext

Статья Complements are supported too - and when to use them раздела Math Toolkit 2.5.0 Overview of Distributions может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Overview of Distributions ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 02:19:26/0.0063490867614746/1