К разделу 'Математика' сайта AlgoList.

Домой Оглавление

Логистическое распределение

Обозначение

L(x|a,b)

Область значений
Параметры Параметр расположения a, параметр масштаба b > 0.
Плотность (функция вероятности)
Математическое ожидание a
Дисперсия
Функция распределения

  Связь с другими распределениями


Нормальная функция распределения отличается от логистической не более чем на 0.01. Понятно, что для проверки гипотезы о принадлежности нашей выборки к одному из них требуются выборки непомерно большого объема. Как, по-вашему, почему, все-таки, всюду используется нормальное распределение?


  Генерация случайных чисел


Пусть r– равномерно распределенная на отрезке [0,1] случайная величина. Тогда случайная величина x, подчиняющаяся логистическому распределению с параметром расположения a и параметром масштаба b, может быть получена стандартным способом – с помощью следующего соотношения:
.


  Вычисление функции распределения и ее квантилей


Не представляет никаких трудностей: используются лишь функции, входящие в стандартные библиотеки (как в Си), либо в сам язык (как в Паскале).

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

Файл logisticDF.h

#ifndef __LOGISTIC_H__		/* To prevent redefinition	*/

#define ENTRY   extern
#define	LOCAL	static

ENTRY double logisticDF(double x, double a, double b);
ENTRY double inv_logisticDF(double q, double a, double b);

#define __LOGISTIC_H__		/* Prevents redefinition	*/
#endif				/* Ends #ifndef__LOGISTIC_H__	*/

Файл logisticDF.cpp

#include <assert.h>
#include <math.h>

double logisticDF(double x, double a, double b)
{
   assert(b > 0);
   return 1./(1+exp((a-x)/b));
}

double inv_logisticDF(double q, double a, double b)
{
   assert(b > 0 && q > 0 && q < 1.);
   return a-b*log(1./q-1);
}

#ifdef TEST

#include <iostream.h>

void main(void)
{
   double a, b;

   while (1) {
      cout << "\n\n\rEnter a: ";
      cin >> a;
      if (a <= 0)
	 break;
      cout << "Enter b: ";
      cin >> b;

      for(double x=-8; x < 8; x += 0.32)
      {
         double y=logisticDF(x, a, b);
         double z=inv_logisticDF(y, a, b);
         cout << "x=" << x << "\tl=" << y << "\ti=" << z << endl;
      }
   }
}

#endif

Дата последней модификации: 25 октября 2000 г.