机器学习笔记-GDA
生成模型(generative model)是另外一种思想。根据贝叶斯原理,在得知观察量X对于预测量Y的概率、以及Y的先验概率后,可以计算得到后验概率。生成模型使用的就是这个后验概率。在生成模型中,最基本的是高斯判别分析模型(Gaussian discriminant analysis, GDA)。
资料:
斯坦福CS229机器学习课程笔记四:GDA、朴素贝叶斯、多项事件模型 - Logos - 博客园
Generative Learning Algorithm - Wei’s Homepage
1 高斯判别分析
在高斯判别分析中,观察量呈多元高斯分布,预测量呈离散分布(我们后面用最简单的0、1分布举例)。
我们拥有的数据有:
- 预测量的先验概率数据
- 观察量关于每个预测量的概率
我们的目标是通过调整概率公式中的参数,使得目标函数(似然估计)达到最大。
根据贝叶斯原理,我们也可以得到预测量关于观察量的概率。
1.1 多元高斯分布
多元高斯分布(multivariate normal distribution)是一元高斯分布的扩展,通过声明一些符号,可将多元高斯分布公式化成和一元高斯分布类似的形式:
\[p(x;\mu,\Sigma) = \frac{1}{(2\pi)^{d/2}|\Sigma|^{1/2}} \exp\left( -\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu) \right)\]其中,向量 \(\mu\) 为每一个元素的均值,矩阵 \(\Sigma\) 为协方差矩阵。当分布中的元素相互独立时,该协方差矩阵为对角矩阵:\(\Sigma=diag(\sigma_1^2, ..., \sigma_n^2)\) 。
根据定义可知:
\[\begin{cases} \nabla_{\Sigma}|\Sigma| = |\Sigma|\Sigma^{-1} & (\Sigma = \Sigma^T)\\ \nabla_x x^TAx = 2Ax \end{cases}\]这两个微分后面会用到。
1.2 高斯判别分析模型
假设预测量的先验概率呈伯努利分布,观察量关于每个预测量呈多元高斯分布:
\[\begin{aligned} p(y) &= \phi^y(1-\phi)^{(1-y)} \\ p(x|y=0) &= \frac{1}{(2\pi)^{d/2}|\Sigma|^{1/2}} \exp\left( -\frac{1}{2}(x-\mu_0)^T\Sigma^{-1}(x-\mu_0) \right) \\ p(x|y=1) &= \frac{1}{(2\pi)^{d/2}|\Sigma|^{1/2}} \exp\left( -\frac{1}{2}(x-\mu_1)^T\Sigma^{-1}(x-\mu_1) \right) \end{aligned}\]于是我们可以写出它的对数似然估计,也就是我们的目标函数:
\[\begin{aligned} l(\phi,\mu_0,\mu_1,\Sigma) &= \log \prod_{i=1}^n p(x^{(i)},y^{(i)};\phi,\mu_0,\mu_1,\Sigma) \\ &= \log \prod_{i=1}^n p(x^{(i)}|y^{(i)};\mu_0,\mu_1,\Sigma)p(y^{(i)};\phi) \end{aligned}\]可以上式分块:
\[\begin{aligned} l(\phi,\mu_0,\mu_1,\Sigma) = & \sum_{y^{(i)}=0}\log(1-\phi) + \sum_{y^{(i)}=1}\log(\phi) \\ &- \sum_{y^{(i)}=0}\frac{1}{2}(x-\mu_0)^T\Sigma^{-1}(x-\mu_0) \\ &- \sum_{y^{(i)}=1}\frac{1}{2}(x-\mu_1)^T\Sigma^{-1}(x-\mu_1) \\ &+ \frac{n}{2} \log |\Sigma^{-1}|- \frac{nd}{2} \log (2\pi) \end{aligned}\]将其对于每个参数求偏微分,可得取对数最大似然估计时各参数的值为:
\[\begin{aligned} \phi &= \frac{1}{n}\sum_{i=1}^n 1\{y^{(i)}=1\} \\ \mu_0 &= \frac{\sum_{i=1}^n 1\{y^{(i)}=0\}x^{(i)}}{\sum_{i=1}^n 1\{y^{(i)}=0\}} \\ \mu_1 &= \frac{\sum_{i=1}^n 1\{y^{(i)}=1\}x^{(i)}}{\sum_{i=1}^n 1\{y^{(i)}=1\}} \\ \Sigma &= \frac{1}{n} \sum_{i=1}^n (x^{(i)} - \mu_{y^{(i)}})(x^{(i)} - \mu_{y^{(i)}})^T \end{aligned}\]1.3 GDA与逻辑回归
根据贝叶斯原理,可以得到预测量随观察量的概率分布:
\[\begin{aligned} p(y=1|x;\phi,\mu_0,\mu_1,\Sigma) &= \frac{p(x|y=1)p(y=1)}{p(x)} \\ &= \frac{1}{1 + \frac{p(x|y=0)p(y=0)}{p(x|y=1)p(y=1)}} \\ &= \frac{1}{1 + \exp\left( -(\Sigma^{-1}(\mu_1-\mu_0))^Tx -\frac{1}{2}(\mu_0^T\Sigma^{-1}\mu_0-\mu_1^T\Sigma^{-1}\mu_1) +\log(\frac{1-\phi}{\phi}) \right)} \end{aligned}\]也就是说,通过合并参数,可将GDA化简成逻辑回归。因此,逻辑回归更通用。但如果数据符合GDA的限制条件时,使用GDA预测会更精确。
1.4 代码实现
以下代码先计算了含有两个分类的GDA模型中的必要参数,然后将其转换为逻辑回归进行进行预测:
def fit(self, x, y):
"""Fit a GDA model to training set given by x and y by updating
self.theta (dim + 1, 1).
Args:
x: Training example inputs. Shape (n_examples, dim).
y: Training example labels. Shape (n_examples,).
"""
d = x.shape[1]
n = y.shape[0]
n1 = np.sum(y)
n0 = n - n1
y = y.reshape((n, 1))
# Find phi, mu_0, mu_1, and sigma
phi = n1 / n
mu_0 = np.dot(x.T, 1-y) / n0
mu_1 = np.dot(x.T, y) / n1
mu = np.dot(1-y, mu_0.T) + np.dot(y, mu_1.T)
sigma = np.dot((x-mu).T, x-mu) / n
# Write theta in terms of the parameters
sigma_i = np.linalg.inv(sigma)
theta0 = (np.log(phi / (1-phi))
+ np.dot(np.dot(mu_0.T, sigma_i), mu_0) / 2
- np.dot(np.dot(mu_1.T, sigma_i), mu_1) / 2)
theta_ex = np.dot(sigma_i, mu_1 - mu_0)
theta = np.zeros((d+1, 1))
theta[0][0] = theta0
theta[1:, :] = theta_ex
self.theta = theta