Вероятность и Мат. Статистика ч.2

Шестаков А.В. Майнор по анализу данных - 16/02/2016

In [1]:
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt 

plt.style.use('ggplot')

font = {'family': 'Verdana',
        'weight': 'normal'}
plt.rc('font', **font)

%matplotlib inline

Распределения случайных величин

На лекциях были рассмотрены распределения дискретных и непрерывных случайных величин.
Были изучены соотношения, которые устанавливают связь значений случайных величин и соответствующие им вероятноти - функции распределения (cumulative density function/probability mass function) и плотности распределения (probability density function).

Посмотрим, как можно обращатся к законам распределения в Python

Распределение Бернулли

Случайная величина принимает 2 возможных значения (успех или провал, мужской или женский пол и тп)

$$ F(X=x)=p^x(1-p)^{1-x}, \quad x = \{0, 1\}$$
In [2]:
n = 1
p = 0.8

fig, ax = plt.subplots(1,2)
fig.set_size_inches(14,6)
x = np.arange(0,n+1)

prob_mass = stats.bernoulli.pmf(x, p)
prob = stats.bernoulli.cdf(x, p)
ax[0].bar(x,prob_mass)
ax[1].plot(x, prob)

ax[0].set_title(u'Закон распределения')
ax[1].set_title(u'Функция распределения')
Out[2]:
<matplotlib.text.Text at 0x7f7b99e4c4d0>

Биномиальный закон распределения

Вероятность наступления числа $X=m$ события в $n$ независимых испытаниях, в каждом из которых оно может наступить с вероятностью $p$: $$ F(X=m|p,n)=C_n^m p^m (1-p)^{n-m} $$

In [3]:
n = 5000
p = 0.6

fig, ax = plt.subplots(1,2)
fig.set_size_inches(14,6)
x = np.arange(0, n+1)
prob_mass = stats.binom.pmf(x, n, p)
prob = stats.binom.cdf(x, n, p)
ax[0].bar(x,prob_mass)
ax[1].plot(x, prob)

ax[0].set_title(u'Закон распределения')
ax[1].set_title(u'Функция распределения')
Out[3]:
<matplotlib.text.Text at 0x7f7b99cf6290>

Распределение Пуассона

$$ F(X=m|\lambda)=\lambda^m \frac{\exp(-\lambda)}{m!} $$

Является предельным приближением к биномиальному распределению!

In [5]:
n = 5000
p = 0.6

lamb = n*p

fig, ax = plt.subplots(1,2)
fig.set_size_inches(14,6)
x = np.arange(0, n)
prob_dens = stats.poisson.pmf(x, lamb)
prob = stats.poisson.cdf(x, lamb)
ax[0].bar(x, prob_dens)
ax[1].plot(x, prob)

ax[0].set_title(u'Закон распределения')
ax[1].set_title(u'Функция распределения')
Out[5]:
<matplotlib.text.Text at 0x7f7b85e4ef90>

Нормальное распределение

Самое известное распределение - нормальное распрежедение. Параметры: $\mu$ - среднее значение, $\sigma$ - дисперсия

$$ f_X(x | \mu, \sigma) = \frac{1}{\sigma \sqrt{2 \pi}} \exp{-\frac{(x-\mu)^2}{2\sigma^2}}$$
In [10]:
mu = 15
sig = 0.3

fig, ax = plt.subplots(1,2)
fig.set_size_inches(14,6)
x = np.arange(0, 2*mu)
prob_dens = stats.norm.pdf(x, mu, sig)
prob = stats.norm.cdf(x, mu, sig)
ax[0].bar(x,prob_dens)
ax[1].plot(x, prob)

ax[0].set_title(u'Плотность распределения')
ax[1].set_title(u'Функция распределения')
Out[10]:
<matplotlib.text.Text at 0x7f7b7e6ffa50>

Степенной закон

Известно так же как закон Парето.

$$ f_X(x|\alpha) = \alpha x^{-\alpha - 1}, x\geq1, \quad \alpha>0 $$
In [11]:
alpha = 2.1


fig, ax = plt.subplots(1,2)
fig.set_size_inches(14,6)
x = np.arange(1, 10, 1)
prob_dens = stats.pareto.pdf(x, alpha)
prob = stats.pareto.cdf(x, alpha)
ax[0].bar(x, prob_dens)
ax[1].plot(x, prob)

ax[0].set_title(u'Плотность распределения')
ax[1].set_title(u'Функция распределения')
Out[11]:
<matplotlib.text.Text at 0x7f7b7e5255d0>

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

Общий способ генерации случайных величин в соответствии с каким-либо законом: stats.some_law.rvs(**params)

In [33]:
x = stats.norm.rvs(10, 3, size=10000)
plt.hist(x, normed=True)
Out[33]:
(array([ 0.0015071 ,  0.0089056 ,  0.03571373,  0.09161348,  0.12668783,
         0.1102924 ,  0.06001003,  0.01785686,  0.00351657,  0.00059371]),
 array([ -0.35431821,   1.83531588,   4.02494997,   6.21458406,
          8.40421814,  10.59385223,  12.78348632,  14.97312041,
         17.1627545 ,  19.35238859,  21.54202267]),
 <a list of 10 Patch objects>)

Дополнительные характеристики распределений

In [14]:
stats.kurtosis(x)
Out[14]:
0.07344430779542055

Kutorsis (коэффициент эксцесса) - мера остроты распределения. Для нормального распределения $= 0$. Для относительно равномерных распределений $< 0$. Для распределений с резким пиком $> 0$

In [15]:
stats.skew(x)
Out[15]:
0.01663325094516027
In [29]:
x = stats.binom.rvs(40, 0.6, size=100)
In [30]:
plt.hist(x)
Out[30]:
(array([  3.,   2.,   9.,   6.,  13.,  23.,  13.,  16.,   7.,   8.]),
 array([ 16. ,  17.4,  18.8,  20.2,  21.6,  23. ,  24.4,  25.8,  27.2,
         28.6,  30. ]),
 <a list of 10 Patch objects>)
In [31]:
x.mean()
Out[31]:
23.960000000000001
In [32]:
stats.skew(x)
Out[32]:
-0.17914234247559177

Skew (коэффициент смещения) - смещение распределения, относительно среднего значения.
Если смещено влево, то $< 0$, если смещено всправо - $> 0$

Оценка параметров

Общий способ оценки параметров распределений под данные: stats.some_law.fit(x)

In [35]:
np.random.randint(0,20)
Out[35]:
17
In [ ]:
 
In [34]:
params = stats.norm.fit(x)
params
Out[34]:
(10.008120596047306, 3.0015599281410399)

В метод fit зашита оценка методом максимального правдоподобия $$ \max_\theta f_X(X=x_1, X=x_2, \dots, X=x_n | \theta) = \max_\theta \prod_{i=1}^n f_X(x_i|\theta)$$

Давайте попробуем решить какой-нибудь простой пример у доски..

Наивный байесовский классификатор и категоризация текстов

Обучение методом наивного Байеса основывается на достаточно сильном предположении, что все признаки попарно независимы. По формуле Байеса $$P(y|x_1,\dots,x_n)=\frac{P(y)P(x_1,\dots,x_n|y)}{P(x_1,\dots,x_n)}.$$ В предположении, что признаки независимы получаем, что $$P(y|x_1,\dots,x_n)=\frac{P(y)\prod_{i=1}^n P(x_i|y)}{P(x_1,\dots,x_n)}$$

Т.к. $$P(x_1,\dots,x_n)$$ задается условиями задачи, принцип максимального правдоподобия для наивного Байеса запишется следующим образом: $$\hat y = \arg\max_y P(y)\prod_{i=1}^n P(x_i|y).$$

In [ ]:
from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
In [ ]: