如何获得贝叶斯高斯混合模型的平滑连续 pdf?

Posted

技术标签:

【中文标题】如何获得贝叶斯高斯混合模型的平滑连续 pdf?【英文标题】:How to get a smooth continuous pdf of a Bayesian Gaussian mixture model? 【发布时间】:2021-12-28 23:05:58 【问题描述】:

给定下面的代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

from sklearn.mixture import BayesianGaussianMixture

df = pd.read_csv("dataset", delimiter=" ")
data = df.to_numpy()
X_train = np.reshape(data, (10*data.shape[0],2))

bgmm = BayesianGaussianMixture(n_components=15,
                               random_state=7,
                               max_iter=5000,
                               n_init=10,
                               weight_concentration_prior_type="dirichlet_distribution")

bgmm.fit(X_train)
logprob = bgmm.score_samples(X_train)
pdf = np.exp(logprob)

x = np.linspace(0, 1, num=20)
plt.plot(x, pdf, '-k', label='Mixture PDF')
plt.show()

我得到以下离散 pdf:

如何绘制此 pdf 的平滑连续版本?

编辑

Here is the the dataset:

[[6.11507621 6.2285484 ]
 [5.61154419 7.4166868 ]
 [5.3638034  8.64581576]
 [8.58030274 6.01384676]
 [2.06883754 8.5662325 ]
 [7.772149   2.29177372]
 [0.66223423 0.01642353]
 [7.42461573 5.46288677]
 [0.82355307 3.60322705]
 [1.12966405 9.54888118]
 [4.34716189 3.63203485]
 [7.95368286 5.74659859]
 [3.21564946 3.67576324]
 [6.48021187 7.35190659]
 [3.02668358 4.41981514]
 [0.01745485 7.49153586]
 [1.08490595 0.91004064]
 [1.89995405 0.38728879]
 [4.40549506 2.48715052]
 [4.52857064 1.24935027]]

【问题讨论】:

不确定发生了什么,但在linspace 的参数中尝试num=200 或类似的东西。 @RobertDodier:pdf 变量仅包含 20 个条目。因此,在绘图时选择除 num=20 之外的任何内容都会导致不匹配。 好吧,高斯混合是一个连续函数,因此即使这些部分不在数据集中,您也可以通过在许多点上评估它来增加绘图的平滑度。无论如何,如果您发布您正在使用的数据集,这不会有什么坏处。 @RobertDodier:如果您检查编辑,我刚刚添加了数据集。 我认为绘制的不是 GM 的 pdf;要么你想绘制其他东西(不是 pdf),要么你想绘制 pdf,你需要改变绘图的东西。我假设您确实需要 pdf,在这种情况下,您需要构建一个与数据样本范围大致相同的二维网格,并在该网格上评估 GM pdf。如果您只有 20 个数据点,您可能只想使用几个凹凸(比如说 2 或 3 个)。 【参考方案1】:

如果数据是 2D 中的 x 和 y 值,您可以尝试以下代码开始实验:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.mixture import BayesianGaussianMixture

data = np.array([[6.11507621, 6.2285484], [5.61154419, 7.4166868], [5.3638034, 8.64581576], [8.58030274, 6.01384676],
                 [2.06883754, 8.5662325], [7.772149, 2.29177372], [0.66223423, 0.01642353], [7.42461573, 5.46288677],
                 [0.82355307, 3.60322705], [1.12966405, 9.54888118], [4.34716189, 3.63203485], [7.95368286, 5.74659859],
                 [3.21564946, 3.67576324], [6.48021187, 7.35190659], [3.02668358, 4.41981514], [0.01745485, 7.49153586],
                 [1.08490595, 0.91004064], [1.89995405, 0.38728879], [4.40549506, 2.48715052], [4.52857064, 1.24935027]])


X_train = data

bgmm = BayesianGaussianMixture(n_components=15,
                               random_state=7,
                               max_iter=5000,
                               n_init=10,
                               weight_concentration_prior_type="dirichlet_distribution")

bgmm.fit(X_train)
# create a mesh of points with x and y values going from -1 to 11
x, y = np.meshgrid(np.linspace(-1, 11, 30), np.linspace(-1, 11, 30))
# recombine x and y to tuples
xy = np.array([x.ravel(), y.ravel()]).T
logprob = bgmm.score_samples(xy)
pdf = np.exp(logprob).reshape(x.shape)

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 6))

# show the result of bgmm.score_samples on a mesh
ax1.imshow(pdf, extent=[-1, 11, -1, 11], cmap='Blues', interpolation='bilinear', origin='lower')
# show original data in red
ax1.scatter(data[:, 0], data[:, 1], color='red')
ax1.set_title('BayesianGaussianMixture')

# create a seaborn kdeplot from the same data
sns.kdeplot(x=data[:, 0], y=data[:, 1], fill=True, ax=ax2)
ax2.scatter(data[:, 0], data[:, 1], color='red')
ax2.set_aspect('equal', 'box')
ax2.set_xlim(-1, 11)
ax2.set_ylim(-1, 11)
ax2.set_title('Seaborn kdeplot')

plt.tight_layout()
plt.show()

【讨论】:

谢谢,但是当我运行代码时,它会抛出:sns.kdeplot(x=data[:, 0], y=data[:, 1], fill=True, ax=ax2) TypeError: kdeplot() missing 1 required positional argument: 'data' 我用最新的 seaborn 版本 0.11.2 试过这个

以上是关于如何获得贝叶斯高斯混合模型的平滑连续 pdf?的主要内容,如果未能解决你的问题,请参考以下文章

如何在高斯朴素贝叶斯中获得特征重要性

Sklearn:为连续特征、多个标签选择朴素贝叶斯模型

高斯分布

贝叶斯优化,364页pdf阐述高斯过程理论与实践

sklearn GaussianNB(高斯朴素贝叶斯)模型使用RandomSearchCV获取最优参数及可视化

高斯朴素贝叶斯分类