Pattern Recognition and Machine Learning - Bishop

关于

Bishop写得PRML无疑是机器学习领域的权威著作,是加强机器学习理论知识必看的书籍之一。
这里是我在阅读这本书时记录的笔记和自己的一些初步思考。

引言

曲线拟合

设曲线拟合的目标变量为$(t)$,$(N)$个训练集为
$( \mathbf{x} = (x_1, ..., x_N)^T )$,对应的目标值为
$( \mathbf{t} = (t_1, ..., t_N)^T )$。假设估计误差服从
高斯分布
$$
p(t|x, \mathbf{w}, \beta) = \mathcal{N} (t| y(x, \mathbf{w}), \beta^{-1})
$$
这里的$(\mathbf{w})$是待估计的参数,$(\beta^{-1})$对应于
估计误差的方差。此时,按照最大似然准则估计的参数就是最小二乘
法的结果,也就是最小化均方误差。而$(\beta^{-1})$的最大似然估计为
模型预测值与实际值的均方差。
$$
\frac{1}{\beta} = \frac{1}{N} \sum_{n=1}^N [y(x_n,\mathbf{w}_{ML}) - t_n]^2.
$$

如果我们对参数的具有一定先验知识,可以进一步采用最大后验概率估计,
得到更好的结果。作为一个特例,如果认为
$$
p(\mathbf{w}|\alpha) = \mathcal{N}(\mathbf{w} | 0, \alpha^{-1} \mathbf{I}) \\
= (\frac{\alpha}{2\pi})^{(M+1)/2} \exp(-\frac{\alpha}{2} \mathbf{w}^T \mathbf{w}).
$$
那么此时的最大后验概率估计为带$(L_2)$正则项的估计,
它最小化
$$
\frac{\beta}{2} \sum_{n=1}^N [y(x_n, \mathbf{w}) -t_n]^2 + \frac{\alpha}{2} \mathbf{w}^T \mathbf{w}
$$
也就是说正则项是对模型参数的一种先验知识,$(L_2)$正则项代表高斯先验。
那$(L_1)$代表laplace先验(待求证)?

第11章 采样方法

基本采样方法

def urnd():
    return random.random()

def exp_rnd(lb):
    assert lb > 0
    x = urnd()
    return -1/lb*log(1-x)

def gaussian_rnd():
    r = sqrt(- 2 * log(urnd()))
    theta = 2*pi*urnd()
    return r * cos(theta)

def cauchy_rnd():
    z = (urnd()-0.5) * pi
    return tan(z)

def cauchy_rnd2():
    x = gaussian_rnd()
    y = gaussian_rnd()
    if y == 0.0:
        return cauchy_rnd()
    return x/y

拒绝采样

拒绝采样

## 利用拒绝采样a>1和b>1的beta分布随机变量
def reject_samping_beta(a, b):
    assert a>1 and b>1
    reject = True
    z = 0
    while reject:
        z = urnd()
        p = z**(a-1) * (1-z) ** (b-1) / beta(a, b)
        u = urnd()
        reject = u > p
    return z

选取$(c = a − 1, b^2 = 2a − 1)$,柯西分布 $(q(z) =\frac{k}{1 + (z − c)2/b^2})$ 选取足够小的k可以逼近gamma分布的包罗

重要性采样

采样与EM算法

马尔科夫链蒙特卡洛MCMC

def rand_i(w):
    w = w/w.sum()
    j = 0
    s = w[j]
    r = random.random()
    while s < r:
        j += 1
        s += w[j]
    return j
def MetropolisHastings():
    p_target = [0.1, 0.2, 0.2, 0.5]
    q = np.ones((4,4)) * 0.25

    x = np.random.randint(4)
    x0 = x
    rx = []
    for i in range(100000):
        x = rand_i(q[x0])
        aij = p_target[x] * q[x, x0] / (p_target[x0] * q[x0, x])  # 接受率
        aij = min(1, aij)
        if urnd() > aij:
            continue
        if i> 10000:
            rx.append(x)
        x0 = x # update
    return rx

吉布斯采样

吉布斯采样

slice采样