#!/usr/bin/env python
# coding: utf-8
# Sveučilište u Zagrebu
# Fakultet elektrotehnike i računarstva
#
# # Strojno učenje
#
# http://www.fer.unizg.hr/predmet/su
#
# Ak. god. 2015./2016.
#
# # Bilježnica 3: Osnove vjerojatnosti i statistike
#
# (c) 2015 Jan Šnajder
#
# Verzija: 0.8 (2015-11-01)
# In[3]:
import scipy as sp
import scipy.stats as stats
import matplotlib.pyplot as plt
from numpy.random import normal
get_ipython().run_line_magic('pylab', 'inline')
# ### Sadržaj:
#
# * Vjerojatnost
#
# * Očekivanje, varijanca i kovarijanca
#
# * Statistička nezavisnost
#
# * Matrica kovarijacije
#
# * Teorijske razdiobe
#
# * Procjena parametara
#
# * Procjenitelj MLE
#
# * Procjenitelj MAP
#
# # Vjerojatnost
#
# * $X$ je slučajna varijabla, $\{x_i\}$ su njezine vrijednosti
#
#
# * Pojednostavljenje notacije: $$P(X=x) \equiv P(x)$$
#
#
# * $P(x_i)\geq 0$, $\sum_i P(x_i)=1$
#
#
# * Distribucija (razdioba) vjerojatnosti
#
#
# * Zajednička (engl. *joint*) distribucija nad $\{X,Y\}$: $$P(X=x,Y=y)\equiv P(x,y)$$
#
#
# * Kontinuirana slučajna varijabla: **funkcija gustoće vjerojatnosti (PDF)**:
#
# \begin{eqnarray*}
# p(x) & \geq 0\\
# \int_{-\infty}^{\infty} p(x)\,\textrm{d}x &= 1\\
# P(a\leq X\leq b) &= \int_a^b p(x)\,\mathrm{d}x
# \end{eqnarray*}
#
# ### Dva pravila teorije vjerojatnosti
#
# * **(1) Pravilo zbroja**
# $$P(x)=\sum_y P(x,y)$$
# (Marginalna vjerojatnost varijable $X$)
#
#
# * Uvjetna vjerojatnost:
# $$
# P(y|x) = \frac{P(x,y)}{P(x)}
# $$
#
#
# * **(2) Pravilo umnoška**
# $$P(x,y) = P(y|x) P(x) = P(x|y) P(y)$$
#
# ### Izvedena pravila
#
# * **Bayesovo pravilo**
# $$
# P(y|x) = \frac{P(x|y)P(y)}{P(x)}
# = \frac{P(x|y)P(y)}{\sum_y P(x,y)}
# = \frac{P(x|y)P(y)}{\sum_y P(x|y)P(y)}
# $$
#
#
# * **Pravilo lanca (engl. *chain rule*)**
# $$P(x,y,z) = P(x) P(y|x) P(z|x,y)$$
#
# * Općenito:
# $$
# \begin{align*}
# P(x_1,\dots,x_n) &=
# P(x_1)P(x_2|x_1)P(x_3|x_1,x_2)\cdots P(x_n|x_1,\dots,x_{n-1})\\
# &= \prod_{k=1}^n P(x_k|x_1,\dots,x_{k-1})
# \end{align*}
# $$
# # Očekivanje, varijanca i kovarijanca
#
# * Očekivanje slučajne varijable:
#
# \begin{equation*}
# \mathbb{E}[X]=\sum_x x P(x)
# \end{equation*}
#
# $$
# \mathbb{E}[X]=\int_{-\infty}^{\infty} x\,p(x)\,\mathrm{d}x
# $$
#
# * Očekivanje funkcije slučajne varijable:
#
# \begin{equation*}
# \mathbb{E}[f]=\sum_x f(x) P(x)
# \end{equation*}
#
# * Vrijedi:
#
# \begin{align*}
# \mathbb{E}[aX+b] &= a\mathbb{E}[X]+b\qquad (a,b\in\mathbb{R})\\
# \mathbb{E}[X+Y] &= \mathbb{E}[X] + \mathbb{E}[Y]
# \end{align*}
#
# * Varijanca slučajne varijable:
#
# \begin{equation*}
# \mathrm{Var}(X) = \sigma_X^2 = \mathbb{E}[(X-\mathbb{E}[X])^2] = \mathbb{E}[X^2] - \mathbb{E}[X]^2
# \end{equation*}
#
# \begin{equation*}
# \mathrm{Var}(a X) = \mathbb{E}\big[(a X)^2\big] - \mathbb{E}[a X]^2 = a^2\mathbb{E}[X^2] - a^2\mathbb{E}[X]^2 =
# a^2\mathrm{Var}(X)
# \end{equation*}
#
# * Kovarijanca slučajnih varijabli:
#
# \begin{align*}
# \mathrm{Cov}(X,Y) &= \sigma_{X,Y} = \mathbb{E}\big[(X-\mathbb{E}[X])(Y-\mathbb{E}[Y])\big] =
# \mathbb{E}[XY] - \mathbb{E}[X]\mathbb{E}[Y]\\
# \mathrm{Cov}(X,Y) &=\mathrm{Cov}(Y, X)\\
# \mathrm{Cov}(X,X) &=\mathrm{Var}(X) =\sigma^2_X\\
# \end{align*}
#
# * Pearsonov koeficijent korelacije (linearna zavisnost):
# $$
# \rho_{X,Y} = \frac{\mathrm{Cov}(X,Y)}{\sigma_X\sigma_Y}
# $$
# $\rho_{X,Y}\in[-1,+1]$
#
#
# In[2]:
from scipy import stats
X = sp.random.random(100)
Y0 = sp.random.random(100)
noise = stats.norm.rvs(size=100)
Y1 = X + 0.2 * noise
Y2 = 3 * Y1
Y3 = -Y1
Y4 = 1 - (X - 0.5)**2 + 0.05 * noise
# In[3]:
for Y in [Y0, Y1, Y2, Y3, Y4]:
plt.scatter(X,Y, label="r = %.3f" % stats.pearsonr(X, Y)[0])
plt.legend()
plt.show()
# * Linearno zavisne varijable imaju $\rho$ blizu $1$ ili $-1$. Međutim, **nelinearno** zavisne varijable mogu imati $\rho$ blizu nule!
# # Statistička nezavisnost
#
# * Varijable $X$ i $Y$ su **nezavisne** akko:
# $$
# P(X,Y) = P(X) P(Y)
# $$
# ili
# $$
# P(X|Y) = P(X) \qquad \text{i} \qquad P(Y|X) = P(Y)
# $$
#
#
# * Znanje o ishodu varijable $Y$ ne utječe na vjerojatnost ishoda varijable $X$ (i obrnuto)
#
#
# * Za nezavisne varijable $X$ i $Y$ vrijedi:
# $$
# \begin{align*}
# \mathbb{E}[XY] &= \mathbb{E}[X]\, \mathbb{E}[Y]\\
# \mathrm{Var}(X+Y) &= \mathrm{Var}(X) + \mathrm{Var}(Y)\\
# \mathrm{Cov}(X, Y) &= \rho_{X,Y} = 0
# \end{align*}
# $$
#
# * Nezavisne varijable su nekorelirane, ali obrat općenito ne vrijedi: nelinarno zavisne varijable mogu imati nisku korelaciju
#
#
# * Varijable $X$ i $Y$ su **uvjetno nezavisne** uz danu varijablu Z, što označavamo kao $X\bot Y|Z$, akko
# $$
# P(X|Y,Z) = P(X|Z)
# $$
# ili
# $$
# P(X,Y|Z) = P(X|Z) P(Y|Z)
# $$
#
# * Jednom kada nam je
# poznat ishod varijable $Z$, znanje o ishodu varijable $Y$ ne utječe na ishod varijable $X$ (i obrnuto)
#
# * Npr.:
# * $X = \textrm{'Student je primljen na FER'}$
# * $Y = \textrm{'Student je primljen na PMF-MO'}$
# * $P(Y|X) \neq P(Y)$ (varijable nisu nezavisne)
# * $Z = \textrm{'Student je sudjelovao na matematičkim natjecanjima'}$
# * $X\bot Y|Z$
# * $P(Y|X,Z) = P(Y|Z)$
# # Matrica kovarijacije
#
# * $\mathbf{X} = (X_1,\dots,X_n)$ je $n$-dimenzijski slučajan vektor
#
#
# * Matrica kovarijacije $\Sigma$:
# $$
# \Sigma_{ij} =
# \mathrm{Cov}(X_i, X_j) =
# \mathbb{E}\big[(X_i-\mathbb{E}[X_i])(X_j-\mathbb{E}[X_j])\big]
# $$
#
#
# * Matrično:
# $$
# \begin{align*}
# \Sigma &= \begin{pmatrix}
# \mathrm{Var}(X_1) & \mathrm{Cov}(X_1,X_2) & \dots & \mathrm{Cov}(X_1, X_n)\\
# \mathrm{Cov}(X_2, X_1) & \mathrm{Var}(X_2) & \dots & \mathrm{Cov}(X_2, X_n)\\
# \vdots & \vdots & \ddots & \vdots \\
# \mathrm{Cov}(X_n, X_1) & \mathrm{Cov}(X_n, X_2) & \dots & \mathrm{Var}(X_n)\\
# \end{pmatrix}
# \end{align*}
# $$
# Simetrična matrica!
#
#
# * Ekvivalentno:
#
# \begin{equation*}
# \Sigma = \mathbb{E}\Big[(\textbf{X}-\mathbb{E}[\textbf{X}])(\textbf{X}-\mathbb{E}[\textbf{X}])^{\mathrm{T}}\Big]
# \end{equation*}
#
#
# * Ako su $X_1...X_n$ međusobno nezavisne, onda $\Sigma = \mathrm{diag}(\sigma_i^2)$
#
#
# * Ako $\sigma^2_i = \sigma^2$, onda $\Sigma = \sigma^2 \mathbf{I}$ (izotropna kovarijanca)
#
#
# # Teorijske razdiobe
#
# * Diskretna značajka:
# * Jednodimenzijska:
# * Binarna: **Bernoullijeva razdioba**
# * Viševrijednosna: **Kategorička (multinomijalna) razdioba**
# * Višedimenzijska:
# * Konkatenirani vektor binarnih/viševrijednosnih varijabli
# * Kontinuirana značajka:
# * Jednodimenzijska: **univarijatna normalna (Gaussova) razdioba**
# * Višedimenzijska: **multivarijatna normalna (Gaussova) razdioba**
#
# ### Bernoullijeva razdioba
#
# \begin{equation*}
# P(X=x | \mu)=
# \begin{cases}
# \mu & \text{ako $X=1$}\\
# 1-\mu & \text{inače}
# \end{cases}
# \qquad=
# \mu^{x}(1-\mu)^{1-x}
# \end{equation*}
#
# \begin{eqnarray*}
# \mathbb{E}[X] &=& \mu\\
# \mathrm{Var}(X) &=& \mu(1-\mu)
# \end{eqnarray*}
#
#
# In[4]:
mu = 0.3
p = stats.bernoulli(mu)
xs = sp.array([0,1])
for x in xs:
plt.plot(x, p.pmf(x), 'bo', ms=8, label='bernoulli pmf')
plt.vlines(x, 0, p.pmf(x), colors='b', lw=5, alpha=0.5)
plt.xlim(xmin=-1, xmax=2)
plt.ylim(ymax=1)
plt.show()
# In[5]:
X = p.rvs(size=100); X
# In[6]:
sp.mean(X)
# In[7]:
sp.var(X)
# In[8]:
xs = linspace(0,1)
plt.plot(xs, xs * (1-xs));
# ### Kategorička ("multinomijalna") razdioba
#
# * Varijabla koja poprima jednu (i samo jednu) od $K$ mogućih vrijednosti
#
#
# * $\mathbf{x}=(x_1,x_2,\dots,x_K)^\mathrm{T}$ je binaran vektor indikatorskih varijabli
# * vektor 1-od-K
# * *one-hot encoding*
#
# * Vjerojatnosti pojedinih vrijednosti: $\boldsymbol{\mu}=(\mu_1,\dots,\mu_K)^\mathrm{T}$, $\sum_k \mu_k=1$, $\mu_k\geq 0$
#
#
# \begin{equation*}
# P(\mathbf{X}=\mathbf{x} | \boldsymbol{\mu}) = \prod_{k=1}^K \mu_k^{x_k}
# \end{equation*}
#
#
# * Npr.
# * $X=x_3\quad \Rightarrow\quad \mathbf{x} = (0,0,1,0)$
# * $\boldsymbol{\mu} = (0.2, 0.3, 0.4, 0.1)$
# * $P\big(X = (0,0,1,0)\big) = \prod_{k=1}^4 \mu_k^{x_k} = 1\cdot 1\cdot \mu_3\cdot 1 = \mu_3 = 0.4$
#
# ### Gaussova razdioba
#
# \begin{equation*}
# p(X=x|\mu,\sigma^2) =
# \frac{1}{\sqrt{2\pi}\sigma}\exp\Big\{-\frac{(x-\mu)^2}{2\sigma^2}\Big\}
# \end{equation*}
#
# \begin{align*}
# \mathbb{E}[X] =& \mu\\
# \mathrm{Var}(X) =& \sigma^2
# \end{align*}
#
#
# In[9]:
xs = sp.linspace(-5, 5)
for s in range(1, 5):
plt.plot(xs, stats.norm.pdf(xs, 0, s), label='$\sigma=%d$' % s)
plt.legend()
plt.show()
# * $P( \mu -\sigma\leq X \leq \mu + \sigma) = 0.68$
# * $P( \mu -2\sigma\leq X \leq \mu + 2\sigma) = 0.95$
# * $P( \mu -3\sigma\leq X \leq \mu + 3\sigma) = 0.99.7$
# In[10]:
print stats.norm.cdf(1, 0, 1) - stats.norm.cdf(-1, 0, 1)
print stats.norm.cdf(2, 0, 1) - stats.norm.cdf(-2, 0, 1)
print stats.norm.cdf(3, 0, 1) - stats.norm.cdf(-3, 0, 1)
# In[11]:
p = stats.norm(loc=5, scale=3)
# In[12]:
X = p.rvs(size=30); X
# In[13]:
sp.mean(X)
# In[14]:
sp.var(X)
# ### Multivarijatna Gaussova razdioba
#
# \begin{equation*}
# p(\mathbf{X}=\mathbf{x}|\boldsymbol{\mu},\mathbf{\Sigma}) =
# \frac{1}{(2\pi)^{n/2}|\mathbf{\Sigma}|^{1/2}}
# \exp\Big\{-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^\mathrm{T}\mathbf{\Sigma}^{-1}(\mathbf{x}-\boldsymbol{\mu})\Big\}
# \end{equation*}
#
#
# * $\mathbf{\Sigma}$ mora biti **pozitivno definitna**. Tada (1) matrica je nesingularna i ima inverz te (2) determinanta joj je pozitivna
#
#
# * Kvadratna forma: $\Delta^2 = (\mathbf{x}-\boldsymbol{\mu})^\mathrm{T}\mathbf{\Sigma}^{-1}(\mathbf{x}-\boldsymbol{\mu})$ je **Mahalanobisova udaljenost** između $\mathbf{x}$ i $\boldsymbol{\mu}$.
#
# \begin{align*}
# \mathbb{E}[\mathbf{X}] =& \boldsymbol{\mu}\\
# \mathrm{Cov}(X_i, X_j) =& \mathbf{\Sigma}_{ij}
# \end{align*}
#
#
# In[15]:
mu = [0, 1]
covm = sp.array([[1, 1], [1, 3]])
p = stats.multivariate_normal(mu, covm)
# In[16]:
print covm
# In[17]:
x = np.linspace(-2, 2)
y = np.linspace(-2, 2)
X, Y = np.meshgrid(x, y)
XY = np.dstack((X,Y))
# In[18]:
plt.contour(X, Y, p.pdf(XY));
# In[19]:
covm1 = sp.array([[1, 0], [0, 5]])
print covm1
# In[20]:
plt.contour(X, Y, stats.multivariate_normal.pdf(XY, mean=mu, cov=covm1 ));
# In[21]:
covm2 = sp.array([[5, 0], [0, 5]])
print covm2
# In[22]:
plt.contour(X, Y, stats.multivariate_normal.pdf(XY, mean=mu, cov=covm2 ));
# In[23]:
plt.contour(X, Y, stats.multivariate_normal.pdf(XY, mean=mu, cov=[[1,0],[0,1]] ));
# In[24]:
from scipy import linalg
x00 = sp.array([0,0])
x01 = sp.array([0,1])
x10 = sp.array([1,0])
x11 = sp.array([1,1])
# In[25]:
linalg.norm(x00 - x01, ord=2)
# In[26]:
linalg.norm(x00 - x10, ord=2)
# In[27]:
linalg.norm(x00 - x11, ord=2)
# In[28]:
sqrt(sp.dot((x00 - x11),(x00 - x11)))
# In[29]:
def mahalanobis(x1, x2, covm):
return sqrt(sp.dot(sp.dot((x1 - x2), linalg.inv(covm)), (x1 - x2)))
# ili: from scipy.spatial.distance import mahalanobis
# In[30]:
covm1 = sp.array([[1, 0], [0, 5]])
mahalanobis(x00, x01, covm1)
# In[31]:
mahalanobis(x00, x10, covm1)
# In[32]:
mahalanobis(x00, x11, covm1)
# In[33]:
mahalanobis(x00, x11, sp.eye(2))
# # Procjena parametara
#
# * Ideja: na temelju slučajnog uzorka izračunati procjenu (estimaciju) parametra teorijske razdiobe
#
#
# * Neka je $(X_1,X_2,\dots,X_n)$ uzorak ($n$-torka slučajnih varijabli koje su iid)
#
#
# * Slučajna varijabla $\Theta=g(X_1,X_2,\dots,X_n)$ naziva se **statistika**
#
#
# * Statistika $\Theta$ je **procjenitelj (estimator)** parametra populacije $\theta$
#
#
# * Vrijednost procjenitelja $\hat{\theta} = g(x_1,x_2,\dots,x_n)$ naziva se **procjena**
#
#
# * Procjenitelj je slučajna varijable, dakle ima očekivanje i varijancu
#
#
# * [Slika: pristranost i varijanca procjenitelja]
#
#
# * Procjenitelj $\Theta$ je **nepristran procjenitelj** (engl. *unbiased estimator*) parametra $\theta$ akko
# $$
# \mathbb{E}[\Theta]=\theta
# $$
#
# * Pristranost procjenitelj (engl. *estimator bias*):
# $$
# b_\theta(\Theta) = \mathbb{E}[\Theta]-\theta
# $$
#
# ### Primjer: Procjenitelji srednje vrijednosti i varijance
#
# * $X$ je slučajna varijabla sa $x\in\mathbb{R}$.
#
#
# * Označimo $\mathbb{E}[X] = \mu$ (srednja vrijednost) i
# $\mathrm{Var}(X)=\sigma^2$ (varijanca)
#
#
# * $\mu$ i $\sigma^2$ su parametri populacije i oni su nam nepoznati
#
#
# * Parametre $\mu$ i $\sigma^2$ možemo ih procijeniti na temelju uzorka $\{x^{(i)}\}_{i=1}^N$ pomoću **procjenitelja**
#
#
# * Za procjenitelje možemo upotrijebiti bilo koje statistike. Npr.
# $$
# \hat{\mu}=\frac{1}{N}\sum_i x^{(i)}\qquad
# \hat{\sigma}^2 = \frac{1}{N}\sum_{i=1}^N (x^{(i)}-\hat{\mu})^2
# $$
#
#
# * Q: Jesu li ovo dobri procjenitelji? (Jesu li nepristrani?)
#
#
# * $\mathbb{E}[\hat{\mu}]=\mu$ ?
# * $\mathbb{E}[\hat{\sigma}^2] = \sigma^2$ ?
#
#
# In[34]:
X = stats.norm.rvs(size=10, loc=0, scale=1) # mean=0, stdev=var=1
sp.mean(X)
# * Očekivanje procjenitelja:
# In[35]:
mean = 0
n = 10
N = 10000
for i in range(N):
X = stats.norm.rvs(size=n)
mean += sp.sum(X) / len(X)
mean / N
# * $\mathbb{E}[\hat{\mu}]=\mu$, tj. $\hat{\mu}$ je nepristran procjenitelj srednje
# vrijednosti
#
#
# * Međutim, $\mathbb{E}[\hat{\sigma}^2] \neq \sigma^2$, tj. $\hat{\sigma}^2$ **nije
# nepristran** procjenitelj varijance!
# $$
# \mathbb{E}[\hat{\sigma}^2] = \frac{N-1}{N}\sigma^2
# $$
#
#
# * Pristranost od $\hat{\sigma}^2$ je
# $$
# b(\hat{\sigma}^2) = \frac{N-1}{N}\sigma^2-\sigma^2 =
# -\frac{\sigma^2}{N}
# $$
#
#
# * Procjenitelj **podcjenjuje** (engl. *underestimates*) pravu varijancu!
#
#
# * Nepristran procjenitelj varijance:
# $$
# \hat{\sigma}^2_{\text{nepr.}} = \frac{1}{N-1}\sum_{i=1}^N (x^{(i)}-\hat{\mu})^2
# $$
#
#
# In[36]:
def st_dev(X):
n = len(X)
mean = sp.sum(X) / n
s = 0
for i in range(len(X)):
s += (X[i] - mean)**2
return s / n
# In[37]:
X = stats.norm.rvs(size=10, loc=0, scale=1) # mean=0, stdev=var=1
st_dev(X)
# * Očekivanje procjenitelja:
# In[38]:
stdev = 0
n = 10
N = 10000
for i in range(N):
X = stats.norm.rvs(size=n)
stdev += st_dev(X)
stdev / N
# In[39]:
stdev = 0
n = 10
N = 10000
for i in range(N):
X = stats.norm.rvs(size=n)
stdev += st_dev(X)
stdev / N
# * Kako izvesti procjenitelj za neku teorijsku distribuciju (Bernoullijevu, Gaussovu, ...)?
#
#
# * Tri vrste procjenitelja:
# * (1) **Procjenitelj najveće izglednosti** (engl. *maximum likelihood estimator*, MLE)
# * (2) **Procjenitelj maximum aposteriori** (MAP)
# * (3) **Bayesovski procjenitelj** (engl. *Bayesian estimator*)
# # Procjenitelj MLE
#
# * Skup neoznačenih primjera $\mathcal{D}=\{\mathbf{x}^{(i)}\}_{i=1}^N$ koji su **iid**
#
# $$
# \mathbf{x}^{(i)} \sim p(\mathbf{x} | \boldsymbol{\theta})
# $$
#
#
# * MLE određuje **najizglednije** parametre $\boldsymbol{\theta}$: to su oni parametri koji
# izvlačenje uzorka $\mathcal{D}$ čine **najvjerojatnijim**
# $$
# p(\mathcal{D} | \boldsymbol{\theta}) =
# p(\mathbf{x}^{(1)},\dots,\mathbf{x}^{(N)} | \mathbf{\theta}) =
# \prod_{i=1}^N p(\mathbf{x}^{(i)} | \mathbf{\theta})\
# \equiv \color{red}{\mathcal{L}(\boldsymbol{\theta} | \mathcal{D})}
# $$
# NB: Druga jednakost vrijedi uz pretpostavku **iid**
#
#
# * **Funkcija izglednosti** $\mathcal{L} : \boldsymbol{\theta}\mapsto p(\mathcal{D} | \boldsymbol{\theta})$ parametrima pridjeljuje vjerojatnost
#
#
# * $\mathcal{L}$ nije PDF! Općenito ne vrijedi $\int_{\boldsymbol{\theta}} \mathcal{L}(\boldsymbol{\theta}|\mathcal{D})\,\mathrm{d}\boldsymbol{\theta}=1$.
#
#
# ### Primjer: Izglednost Bernoullijeve varijable
#
# * $\mathcal{D} \equiv$ 10 bacanja novčića ($N=10$)
# * Glava (H) 8 puta, pismo (T) 2 puta
# * $\mu$ je vjerojatnost da dobijem H
# * $P(X=x | \mu)= \mu^{x}(1-\mu)^{1-x}$
#
# In[40]:
def likelihood(mu, m, N):
return mu**m * (1 - mu)**(N - m)
# In[41]:
xs = linspace(0,1)
plt.plot(xs, likelihood(xs, 8, 10));
# In[42]:
xs = linspace(0,1)
plt.plot(xs, likelihood(xs, 5, 10));
# In[43]:
xs = linspace(0,1)
plt.plot(xs, likelihood(xs, 10, 10));
# ### MLE
#
# * Nalazi $\boldsymbol{\theta}$ koji maksimiziraju funkciju izglednosti:
#
# $$
# \hat{\boldsymbol{\theta}}_{\mathrm{ML}} = \mathrm{argmax}_{\boldsymbol{\theta}} \mathcal{L}(\boldsymbol{\theta}|\mathcal{D})
# $$
#
#
# * Analitički je jednostavnije maksimizirati **log-izglednost**:
# $$
# \ln\mathcal{L}(\boldsymbol{\theta} | \mathcal{D}) \ = \ln p(\mathcal{D} | \boldsymbol{\theta}) =
# \ln \prod_{i=1}^N p(\mathbf{x}^{(i)} | \boldsymbol{\theta}) =
# \sum_{i=1}^N\ln p(\mathbf{x}^{(i)} | \boldsymbol{\theta})
# $$
#
# $$
# \hat{\boldsymbol{\theta}}_{\mathrm{ML}} = \mathrm{argmax}_{\boldsymbol{\theta}} \big(\ln \mathcal{L}\big(\boldsymbol{\theta}|\mathcal{D})\big)
# $$
#
# * Ako je moguće, maksimizaciju provodimo analitički, inače je provodimo iterativnim metodama
# ### MLE za Bernoullijevu razdiobu (parametar: $\mu$)
#
# \begin{align*}
# \ln\mathcal{L}(\mu | \mathcal{D}) &=
# \ln\prod_{i=1}^N P(x | \mu) =
# \ln\prod_{i=1}^N \mu^{x^{(i)}}(1-\mu)^{1-x^{(i)}}\\
# &=\sum_{i=1}^N x^{(i)}\ln \mu + \Big(N-\sum_{i=1}^N x^{(i)}\Big)\ln(1-\mu)
# \end{align*}
#
# $$
# \frac{\mathrm{d}\,{\ln\mathcal{L}}}{\mathrm{d}\mu} =
# \frac{1}{\mu}\sum_{i=1}^N x^{(i)} - \frac{1}{1-\mu}\Big(N-\sum_{i=1}^N x^{(i)}\Big) = 0
# $$
#
# \begin{equation*}
# \Rightarrow\quad \hat{\mu}_\mathrm{ML} = \frac{1}{N}\sum_{i=1}^N x^{(i)}
# \end{equation*}
#
#
# * MLE za Bernoullijevu razdiobu je ustvari **relativna frekvencija**
#
#
# * Vrijedi $\mathbb{E}(\mu_\mathrm{ML})=\mathbb{E}[X]=\mu$, pa je ovo je nepristran procjenitelj
#
# ### MLE za kategoričku razdiobu (parametri: $\mu_k$)
#
# \begin{align*}
# \ln\mathcal{L}(\boldsymbol{\mu} | \mathcal{D}) =
# \ln\prod_{i=1}^N P(\mathbf{x}^{(i)} | \boldsymbol{\mu}) =
# \ln\prod_{i=1}^N \color{red}{\prod_{k=1}^K \mu_k^{x_k^{(i)}}} =
# \sum_{k=1}^K \sum_{i=1}^N x_k^{(i)} \ln \mu_k
# \end{align*}
#
#
# * Izraz treba maksimizirati prema $\mu_k$ uz **ograničenje** $\sum_{k=1}^K\mu_k=1$.
#
#
# * Primjenom **metode Lagrangeovih multiplikatora** dobivamo:
# $$
# \hat{\mu}_{k,\mathrm{ML}} = \frac{1}{N}\sum_{i=1}^N x_k^{(i)} = \frac{N_k}{N}
# $$
# $N_k$ je broj nastupanja k-te vrijednosti
#
#
# ### MLE za Gaussovu razdiobu (parametri: $\mu, \sigma^2$)
#
# \begin{align*}
# \ln\mathcal{L}(\mu,\sigma^2 | \mathcal{D}) &=
# \ln\prod_{i=1}^N
# \frac{1}{\sqrt{2\pi}\sigma}\exp\Big\{-\frac{(x^{(i)}-\mu)^2}{2\sigma^2}\Big\} \\
# &= -\frac{N}{2}\ln(2\pi)
# - N\ln\sigma
# - \frac{\sum_i(x^{(i)}-\mu)^2}{2\sigma^2}\\
# \end{align*}
#
# \begin{align*}
# \nabla\ln\mathcal{L}(\mu,\sigma^2 | \mathcal{D})&=0\\
# \vdots\\
# \hat{\mu}_\mathrm{ML} &= \frac{1}{N}\sum_{i=1}^N x^{(i)}\\
# \hat{\sigma}^2_\mathrm{ML} &= \frac{1}{N}\sum_{i=1}^N(x^{(i)}-\hat{\mu}_\mathrm{ML})^2
# \end{align*}
#
#
# * NB: Procjenitelj $\hat{\sigma}^2_\mathrm{ML}$ je pristran!
#
#
# * MLE ne mora nužno biti nepristran!
# In[44]:
p = stats.norm(5, 2)
X = sort(p.rvs(30))
plt.scatter(X, sp.zeros(len(X)));
# In[45]:
mean_mle = sp.mean(X); mean_mle
# In[46]:
var_mle = np.var(X, axis=0, ddof=1); var_mle
# In[47]:
p_mle = stats.norm(mean_mle, sqrt(var_mle))
# In[48]:
plt.scatter(X, p_mle.pdf(X))
plt.plot(X, p.pdf(X), c='gray');
plt.plot(X, p_mle.pdf(X), c='blue', linewidth=2)
plt.vlines(X, 0, p_mle.pdf(X), colors='b', lw=2, alpha=0.2)
plt.show()
# ### MLE za multivarijatnu Gaussovu razdiobu
#
# \begin{align*}
# \ln\mathcal{L}(\boldsymbol{\mu},\boldsymbol{\Sigma}|\mathcal{D}) &=
# \ln\prod_{i=1}^N
# p(\mathbf{x}^{(i)}|\boldsymbol{\mu},\boldsymbol{\Sigma})\\
# &=
# -\frac{n N}{2}\ln(2\pi)-\frac{N}{2}|\boldsymbol{\Sigma}|
# -\frac{1}{2}\sum_{i=1}^N(\boldsymbol{x}^{(i)}-\boldsymbol{\mu})^\mathrm{T}\boldsymbol{\Sigma}^{-1}(\mathbf{x}^{(i)}-\boldsymbol{\mu})
# \end{align*}
#
# \begin{align*}
# \nabla\ln\mathcal{L}(\boldsymbol{\mu},\boldsymbol{\Sigma} | \mathcal{D})&=0\\
# \vdots\\
# \hat{\boldsymbol{\mu}}_\mathrm{ML} &= \frac{1}{N}\sum_{i=1}^N\mathbf{x}^{(i)}\\
# \hat{\boldsymbol{\Sigma}}_\mathrm{ML} &= \frac{1}{N}\sum_{i=1}^N
# (\mathbf{x}^{(i)}-\hat{\boldsymbol{\mu}}_\mathrm{ML})(\mathbf{x}^{(i)}-\hat{\boldsymbol{\mu}}_\mathrm{ML})^\mathrm{T}
# \end{align*}
#
# In[60]:
mu = [3, 2]
covm = sp.array([[5, 2], [2, 10]])
p = stats.multivariate_normal(mu, covm)
# In[61]:
x = np.linspace(-10, 10)
y = np.linspace(-10, 10)
X, Y = np.meshgrid(x, y)
XY = np.dstack((X,Y))
plt.contour(X, Y, p.pdf(XY))
plt.show()
# In[62]:
D = p.rvs(100)
plt.contour(X, Y, p.pdf(XY), cmap='binary', alpha=0.5)
plt.scatter(D[:,0], D[:,1])
plt.show()
# In[63]:
mean_mle = sp.mean(D, axis=0); mean_mle
# In[64]:
cov_mle = 0
s = 0
for x in D:
s += sp.outer(x - mean_mle, x - mean_mle)
cov_mle = s / len(D)
# In[65]:
cov_mle
# In[66]:
sp.cov(D, rowvar=0, bias=0)
# In[67]:
p_mle = stats.multivariate_normal(mean_mle, cov_mle)
plt.contour(X, Y, p_mle.pdf(XY));
# In[68]:
plt.contour(X, Y, p.pdf(XY), cmap='binary', alpha=0.5)
plt.scatter(D[:,0], D[:,1], c='gray', alpha=0.5)
plt.contour(X, Y, p_mle.pdf(XY), cmap='Blues', linewidths=2);
# # Procjenitelj MAP
#
# * MLE lako dovodi do **prenaučenosti** modela
# * Npr. za skup primjera za koji $\forall x^{(i)}\in \mathcal{D}. x^{(i)}=0$, procjena je $\hat{\mu}_\mathrm{ML}=0$
#
#
# * Ideja: nisu sve vrijednosti za $\mu$ jednako vjerojatne!
#
#
# * Definiramo **apriornu razdiobu parametra** $p(\boldsymbol{\theta})$ i zatim maksimiziramo
# aposteriornu vjerojatnost:
# $$
# p(\boldsymbol{\theta}|\mathcal{D}) =
# \frac{p(\mathcal{D}|\boldsymbol{\theta}) P(\boldsymbol{\theta})} {p(\mathcal{D})}
# $$
#
#
# * MLE:
# $$
# \hat{\boldsymbol{\theta}} = \mathrm{argmax}_{\boldsymbol{\theta}}\ \mathcal{L}(\boldsymbol{\theta}|\mathcal{D})
# $$
#
#
# * MAP:
# $$
# \hat{\mathbf{\theta}}_\mathrm{MAP} = \mathrm{argmax}_{\boldsymbol{\theta}} \ p(\boldsymbol{\theta}|\mathcal{D}) =
# p(\mathcal{D}|\boldsymbol{\theta})\,\color{red}{p(\boldsymbol{\theta})}
# $$
#
# ### Procjenitelj MAP za Bernoullijevu varijablu
# In[ ]:
TODO
# In[4]:
xs = sp.linspace(0,1)
beta = stats.beta(1,1)
# In[30]:
plt.plot(xs,stats.beta.pdf(xs,1,1), label='a=1,b=1')
plt.plot(xs,stats.beta.pdf(xs,2,2), label='a=2,b=2')
plt.plot(xs,stats.beta.pdf(xs,4,2), label='a=4,b=2')
plt.plot(xs,stats.beta.pdf(xs,2,4), label='a=2,b=4')
plt.legend()
plt.show()
# ### Laplaceovo zaglađivanje
#
# TODO
# # Sažetak
#
# * Za strojno učenje posebno su važne **Bernoullijeva**, **kategorička** i **Gaussova** razdioba
#
#
# * **Procjenitelj** je statistika (slučajna varijabla izračunata iz uzorka) kojom se procjenjuju parametri neke teorijske razdiobe
#
#
# * Dobri procjenitelju su **nepristrani**
#
#
# * **Procjenitelj najveće izglednosti (MLE)** odabire parametre koji maksimiziraju vjerojatnost realizacije uzorka (tzv. izglednost)
#
#
# * MLE procjenitelj nije uvijek nepristran i sklon je prenaučenosti
#
#
# * **MAP-procjenitelj ** dodatno koristi apriornu razdiobu parametara i maksimizira aposteriornu vjerojatnost parametara
#
#
# * MAP-procjenitelj na taj način ugrađuje apriorno znanje te izbjegava prenaučenost samo na temelju podataka