概率图模型学习(6)——高斯网络模型1

由于最近用到了多特征高斯分布,所以提前看了这一章。

1.      多元高斯分布

个人总结高斯分布其实就三个元素:期望、方差、概率密度函数。而多元高斯分布和单高斯分布不同点在于期望由一个值变成了期望矩阵,这个矩阵的每一个元素对应于该特征变量的均值;方差变成了协方差矩阵。


其中,协方差矩阵必须是正定矩阵。令为信息矩阵。

经过如下转化:


其中,最后一项是是常数矩阵乘法(1,n)*(n,n)*(n,1)à常数。因此高斯密度可以导出另一种形式:

 

多元高斯分布围绕均值向量形成一些列的椭圆型等高线,这些等高线平行,其形状和“陡峭”程度由协方差矩阵决定。

 

协方差的计算



个人觉得cov[Xi;Xj]其实就是协方差矩阵中的[I,j]元素。

 

2.      高斯分布的运算

分布的运算无非就是边缘概率分布、联合概率分布、条件概率分布。

边缘高斯分布:可以从期望和协方差中读出对应的值,带入单高斯分布即可。其中Cov(Xi;Xi)即是Xi特征的方差,即是协方差矩阵的[i,i]项元素。

联合高斯概率分布:


条件高斯分布:用观测变量的值取代变量即可。

 

3.      独立性



后面还有高斯贝叶斯网和马尔科夫网,由于线性贝叶斯CPD和马尔科尔网还没有看,就留着以后再总结吧。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高斯过程回归(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 ``` 可以看到,预测结果非常接近真实值。这说明高斯过程回归在一定程度上可以用于回归分析,并且可以通过调整核函数和噪声来适应不同的数据集。 以上就是本文的全部内容,希望能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值