Шестаков А.В. Майнор по анализу данных - 16/02/2016
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 возможных значения (успех или провал, мужской или женский пол и тп)
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'Функция распределения')
<matplotlib.text.Text at 0x7f7b99e4c4d0>
Вероятность наступления числа $X=m$ события в $n$ независимых испытаниях, в каждом из которых оно может наступить с вероятностью $p$: $$ F(X=m|p,n)=C_n^m p^m (1-p)^{n-m} $$
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'Функция распределения')
<matplotlib.text.Text at 0x7f7b99cf6290>
Является предельным приближением к биномиальному распределению!
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'Функция распределения')
<matplotlib.text.Text at 0x7f7b85e4ef90>
Самое известное распределение - нормальное распрежедение. Параметры: $\mu$ - среднее значение, $\sigma$ - дисперсия
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'Функция распределения')
<matplotlib.text.Text at 0x7f7b7e6ffa50>
Известно так же как закон Парето.
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'Функция распределения')
<matplotlib.text.Text at 0x7f7b7e5255d0>
Общий способ генерации случайных величин в соответствии с каким-либо законом: stats.some_law.rvs(**params)
x = stats.norm.rvs(10, 3, size=10000)
plt.hist(x, normed=True)
(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>)
stats.kurtosis(x)
0.07344430779542055
Kutorsis (коэффициент эксцесса) - мера остроты распределения. Для нормального распределения $= 0$. Для относительно равномерных распределений $< 0$. Для распределений с резким пиком $> 0$
stats.skew(x)
0.01663325094516027
x = stats.binom.rvs(40, 0.6, size=100)
plt.hist(x)
(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>)
x.mean()
23.960000000000001
stats.skew(x)
-0.17914234247559177
Skew (коэффициент смещения) - смещение распределения, относительно среднего значения.
Если смещено влево, то $< 0$, если смещено всправо - $> 0$
Общий способ оценки параметров распределений под данные: stats.some_law.fit(x)
np.random.randint(0,20)
17
params = stats.norm.fit(x)
params
(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).$$
from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer