MLAPP————第四章 高斯模型

 

第四章 高斯模型

4.1 介绍

本章主要开始介绍多变量的高斯模型或者叫做多变量的正态模型(MVN),在整本书中,可以说这个模型是非常常见的。这一章的数学的要求是比较高的,涉及到很多的线性代数和矩阵运算。我会尽量把我会的一些计算过程详细的写出来,因为书中有些计算过程可能作者看上去比较的简单,但是我们看的时候还是会比较吃力。

4.1.1 符号

符号这里就不翻译了。都是很常规的,与平时见到的都一样。

4.1.2 基础

多元高斯分布的pdf:,指数上的那一块,我们称之为\mathbf x\boldsymbol\mu之间的马氏距离(Mahalanobis distance)。没有中间的\boldsymbol \Sigma^{-1},那就是欧式距离,欧式距离带来的一定的缺点就是它认为所有的维度之间是等同的,但是处理实际问题的时候,权重往往应该是有区别的。为了更好地理解这个马氏距离,因为协方差矩阵是实对角阵,进行特征值分解:,其中\mathbf U是单位正交阵,即。,所以我们有,这就是协方差矩阵逆的另一种表达形式。其中y_i其实就是\mathbf{x}-\boldsymbol\mu\mathbf u_i这个方向上的投影。1/\lambda_i就是这个方向上的系数,当然也可以理解为我上面说的权重。如果\lambda_i很大的话,说明在这个方向上,你改变很大,但是对最终概率的影响却很小。

4.1.3 MVN的最大似然估计

在一维的高斯分布中,我们有最大似然估计。对于高维的高斯分布,,不得不说形式上一样,下面我们来仔细看一下书中的证明。

4.1.3.1 证明*

在证明之前首先给出一些结论

这些都是线性代数相关知识,这个的证明就不详细说了,直接当作结论。

首先我们的似然函数可以写成:这个式子最后应该加一个const(常数项),当然对于MLE求解没有影响。我们先对一项进行求导。,其中,这就是利用了上面的公式2以及链式法则。然后我们用似然函数对\boldsymbol\mu进行求导:,中间利用了\boldsymbol\Sigma是对称的,我们就得到了\boldsymbol\mu的最大似然估计值。接下来对\boldsymbol\Lambda进行求导,首先,其中。这边用了trace的技巧,首先标量的trace等于本身,其次trace具有轮换性。所以在此利用上面的第三行和第四行的公式,得到:,又有,所以。由于参数是要同时进行估计的,所以这里的\boldsymbol\mu就用最大似然得到的\boldsymbol{\hat\mu}代替。

4.1.4 高斯分布的最大熵的推导

之前我们提到过,高斯分布是在均值和方差已知的情况下的最大熵分布。为了简化这个符号,pdf写作:,也就是0均值的。

定理4.1.2 假设q(\mathbf x)是任意一个均值为0,方差满足(根据均值为0得到的)的分布。p = \mathcal N(\mathbf 0,\boldsymbol\Sigma),那么有h(q)<h(p)。

证明过程:

这个证明过程就是*这边很难理解,其余都很显然。这个地方首先p(x)是服从高斯分布的。你把取log带进去,常数项忽略掉,我们发现他就是一个关于\mathbf x的二次项。同时我们又有,以及\int p(\mathbf x)x_ix_jd\mathbf x = \Sigma_{ij},所以p(\mathbf x)q(\mathbf x)关于二次项的求导是一样的。所以我们可以换。所以就证明好了。

4.2 高斯判别分析(GDA)

MVN很大的一个应用就是在生成分类器中,定义类条件概率密度函数是高斯的:。这里两个说明点,一虽然叫高斯判别分析,但是其实是一个生成模型。第二点跟之前朴素贝叶斯不同的是这里的条件概率密度函数不是关于\mathbf x的每一个分量独立的,除非\mathbf \Sigma_c是对角阵。高斯判别分析我们在英文上又叫做 Gaussian discriminant analysis(GDA)

那么我们最终做决策根据公式:,其中最后一项我觉得写成{\rm log}p(\mathbf x|y=c;\boldsymbol \theta)更直观。这个就是根据贝叶斯法则,通过类先验和类条件概率密度函数,得到y的后验概率密度函数(差一个常数项),通过最大后验,得到y的估计值,最终进行分类。

当你把条件概率密度函数是MVS带入上面公式,其实就是看你\mathbf x\boldsymbol \mu_c之间的马氏距离(协方差矩阵也都是不一样的)。如果我们的类先验就是均匀分布的。那么

4.2.1 二次判别分析(QDA)

高斯判别分析也有很多种分法,这主要依赖于协方差矩阵的形式,对于最一般的情况,我们叫做二次判别分析(quadrctic discriminant analysis, QDA)。这个的关于y的后验分布写成:

,其实就是把类条件概率分布和先验具体形式带到2.13里面,约掉了常数项。

4.2.2 线性判别分析(LDA)

线性的判别分析要求所有的类条件概率分布的协方差矩阵是一样的:\mathbf \Sigma_c = \mathbf \Sigma。这样的话4.2.1里面的公式就可以化简了,这里先不考虑下面的常数项,,这个推导比较简单。第二行的右边一项跟c是没有关系的,所以也必然可以约掉,所以其实如果我们假设那么就有,我们定义,而\mathcal S其实就是个softmax函数,即

书中解释了为什么叫这个为soft-max函数,假设对于每一个\eta_c除以一个常量T(temperature,所以这个就是从统计物理里面引入的)。当T趋向于0时。那么有。解释一下:

这里对于书上4.38而言,取log的话,分子变成线性的,那么在做决策边界也就是两个类别的类后验概率相等,也就等价于:

,因为分母是可以不考虑的。那么其实这个决策边界是一个线性函数。所以这也是我们为什么叫他为线性判决分析。这一点我们联想一线前面的二次判别分析,那个关于分母取等式的话其实是关于\mathbf x的一个二次式。

4.2.3 只有两个类别情况下的LDA

下面要说的就是y只能取{0,1}。根据上面的推导:

另一个就是1减去它。

根据之前的定义,得到,再进行如下的定义:

,就可以得到一个比较简单的形式:。这个形式就跟逻辑回归很像。这一块可能主要就是说明二维的LDA其实和逻辑回归是有很大的相似性的。

如果说,那么\mathbf w的方向就是\boldsymbol\mu_1-\boldsymbol\mu_0,所以如下图:

就是看你\mathbf x - \mathbf x_0\mathbf w的夹角是大于90度还是小于90度,就决定了你是哪一类,图中明显就是y=1。另外当没有先验信息时,\mathbf x_0 = 1/2(\boldsymbol{\mu_1+\mu_0}),先验就是用来移动\mathbf x_0的位置,比如说\pi_1越大,就说明\mathbf x_0更靠近\boldsymbol\mu_0。也就意味这被判到1类的概率就更高。

4.2.4 判别分析的MLE

之前我们讲的都是怎么去做判别,就是建立在类先验和类条件概率密度函数已知,然后不同的模型去做判别分析,那么怎么进行概率分布的参数估计。这里讲用最大似然估计怎么做。

首先对于数据集合来说,p(\mathbf x,y)= p(y)p(\mathbf x|y),而类先验和类条件概率密度函数的形式我们都是知道的。那么根据数据我们就可以有似然函数,当然我们取一个log:。那么最终求导就可以得到:

4.2.5 防止过拟合的技巧和方法

MLE的优势在于简单,并且快。劣势就在于在高维的时候可能出现严重的过拟合。比如你的N_c<D,那么通过MLE估出来的协方差矩阵就是奇异的。即使N_c>D的情况下,也有可能就是病态的,条件数很大,这时候就接近于奇异的。

1:对于每一个类别使用对角的协方差矩阵,这意味着特征是条件独立的,这就和朴素贝叶斯分类器一样。

2:对于所有的类别,协方差矩阵都是一样的,这就是LDA的情况。

3:每一个类别使用对角的且相同的协方差矩阵。

4:增加先验 5:MAP 6:降低维度

整体对于这一块的把

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
高斯过程回归(GPR)是一种机器学习方法,用于回归分析。它的特点是可以在不需要先验知识的情况下进行预测,并且可以通过调整超参数来适应不同的数据集。在本文中,我将介绍如何用 C++ 实现高斯过程回归,并提供一个简单的案例来说明其用途。 首先,让我们来了解一下高斯过程回归的原理。高斯过程回归的本质是通过先验分布和观测数据来计算后验分布。它假设目标函数服从高斯分布,在先验分布下计算出目标函数的均值和方差,然后通过观测数据对先验分布进行修正,得到后验分布。在预测时,可以使用后验分布来计算任意未知点的均值和方差。 接下来,我们将用 C++ 实现高斯过程回归,并提供一个简单的案例来说明其用途。我们将使用 Eigen 库来进行矩阵运算。 首先,我们需要定义一个高斯过程回归的类,包括以下成员变量和成员函数: ```cpp class GaussianProcessRegression { public: GaussianProcessRegression(double (*kernel)(const VectorXd&, const VectorXd&), double noise); void train(const MatrixXd& X, const VectorXd& y); double predict(const VectorXd& x); private: double (*kernel_)(const VectorXd&, const VectorXd&); double noise_; MatrixXd X_; VectorXd y_; MatrixXd K_; MatrixXd K_inv_; }; ``` 其中,`kernel_` 是一个指向核函数的函数指针,`noise_` 是噪声的方差,`X_` 是观测数据的矩阵,`y_` 是观测数据的向量,`K_` 是观测数据之间的核函数矩阵,`K_inv_` 是 `K_` 的逆矩阵。 构造函数如下: ```cpp GaussianProcessRegression::GaussianProcessRegression(double (*kernel)(const VectorXd&, const VectorXd&), double noise) : kernel_(kernel), noise_(noise) {} ``` 接下来,我们来实现训练方法。训练方法需要计算出核函数矩阵 `K_` 和其逆矩阵 `K_inv_`。我们可以使用 Cholesky 分解来计算 `K_inv_`,因为它比直接求逆矩阵的方法更加稳定和快速。 ```cpp void GaussianProcessRegression::train(const MatrixXd& X, const VectorXd& y) { X_ = X; y_ = y; K_.resize(X.rows(), X.rows()); for (int i = 0; i < X.rows(); ++i) { for (int j = 0; j < X.rows(); ++j) { K_(i, j) = kernel_(X.row(i), X.row(j)); if (i == j) { K_(i, j) += noise_; } } } K_inv_ = K_.llt().solve(MatrixXd::Identity(X.rows(), X.rows())); } ``` 最后,我们来实现预测方法。预测方法需要计算出待预测点与观测数据之间的核函数矩阵 `k`,然后使用公式计算出均值和方差。 ```cpp double GaussianProcessRegression::predict(const VectorXd& x) { VectorXd k(X_.rows()); for (int i = 0; i < X_.rows(); ++i) { k(i) = kernel_(X_.row(i), x); } double mu = k.transpose() * K_inv_ * y_; double sigma = kernel_(x, x) + noise_ - k.transpose() * K_inv_ * k; return mu; } ``` 现在,我们已经完成了高斯过程回归的 C++ 实现。接下来,我们提供一个简单的案例来说明其用途。 假设我们有一组观测数据,它们的横坐标为 0, 1, 2, 3,纵坐标为 0, 1, 4, 9。我们的目标是通过这些观测数据来预测横坐标为 4 的点的纵坐标。我们可以使用高斯过程回归来解决这个问题。 首先,我们需要定义核函数,常见的核函数有线性核函数、多项式核函数、高斯核函数等,这里我们选择高斯核函数。 ```cpp double gaussian_kernel(const VectorXd& x1, const VectorXd& x2) { double sigma = 1.0; return exp(-0.5 * (x1 - x2).squaredNorm() / sigma); } ``` 接下来,我们可以进行训练和预测。代码如下: ```cpp int main() { GaussianProcessRegression gpr(gaussian_kernel, 0.01); MatrixXd X(4, 1); VectorXd y(4); X << 0, 1, 2, 3; y << 0, 1, 4, 9; gpr.train(X, y); double x = 4; double y_pred = gpr.predict(VectorXd(1, 1)); cout << "Predicted value: " << y_pred << endl; return 0; } ``` 输出结果为: ``` Predicted value: 8.9817 ``` 可以看到,预测结果非常接近真实值。这说明高斯过程回归在一定程度上可以用于回归分析,并且可以通过调整核函数和噪声来适应不同的数据集。 以上就是本文的全部内容,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值