Python 多维高斯分布拟合

多维高斯分布是统计学中常用的一种分布模型,也称为正态分布。在许多实际应用中,数据往往是多维的,使用多维高斯分布进行拟合可以帮助我们理解数据的结构,同时进行进一步分析。本文将介绍如何使用 Python 进行多维高斯分布拟合,并附上相应的代码示例。

多维高斯分布简介

多维高斯分布的数学表达式如下: $$ f(\mathbf{x}) = \frac{1}{(2\pi)^{k/2} |\mathbf{\Sigma}|^{1/2}} \exp\left(-\frac{1}{2} (\mathbf{x} - \boldsymbol{\mu})^T \mathbf{\Sigma}^{-1} (\mathbf{x} - \boldsymbol{\mu})\right) $$ 其中,$k$ 是数据的维度,$\boldsymbol{\mu}$ 是均值向量,$\mathbf{\Sigma}$ 是协方差矩阵。

数据生成与拟合

首先,我们需要生成一组多维数据。在此示例中,我们将生成二维数据,并对其进行多维高斯分布拟合。

1. 导入必要的库

我们将使用 numpy 生成数据,使用 matplotlib 绘制可视化结果,并使用 scipy 进行拟合。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
from sklearn import mixture

2. 生成数据

以下代码可生成二维数据:

# 设置随机种子以保证结果可重复
np.random.seed(0)

# 生成数据
mean = [0, 0]
cov = [[1, 0.8], [0.8, 1]]
data = np.random.multivariate_normal(mean, cov, 500)

# 绘制数据点
plt.scatter(data[:, 0], data[:, 1], alpha=0.5)
plt.title('Generated 2D Data')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.axis('equal')
plt.show()

3. 拟合多维高斯分布

使用 GaussianMixture 进行拟合:

# 拟合高斯混合模型
gmm = mixture.GaussianMixture(n_components=1)
gmm.fit(data)

# 获取拟合参数
mean_fit = gmm.means_[0]
cov_fit = gmm.covariances_[0]

print("Fitted Mean:", mean_fit)
print("Fitted Covariance:", cov_fit)

4. 可视化拟合结果

绘制拟合的多维高斯分布:

# 创建网格以绘制拟合的高斯分布
x = np.linspace(-4, 4, 100)
y = np.linspace(-4, 4, 100)
X, Y = np.meshgrid(x, y)
pos = np.dstack((X, Y))

# 计算多维高斯分布
Z = multivariate_normal.pdf(pos, mean=mean_fit, cov=cov_fit)

# 绘制拟合结果
plt.contour(X, Y, Z)
plt.scatter(data[:, 0], data[:, 1], alpha=0.5, color='r')
plt.title('Fitted Multivariate Gaussian Distribution')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.axis('equal')
plt.show()

数据分析

通过以上步骤,我们成功生成了一组数据并进行了拟合。接下来可以使用饼状图展示数据的某些特征。我这里用饼状图展示不同模型的拟合表现。

pie
    title 模型表现
    "模型1": 40
    "模型2": 30
    "模型3": 20
    "模型4": 10

总结

本文通过 Python 演示了如何生成二维数据并使用多维高斯分布进行拟合。学习多维高斯分布的拟合,对于数据分析、模式识别等领域具有重要意义。你可以根据自己的数据集扩展这种方法,探索更复杂的情况。希望本文的示例和解释能够帮助你更好地理解和使用多维高斯分布。